Zamień alfabet


48

W tym wyzwaniu będziesz „odwracał” alfabet lub zamieniał a-zsię nim z-a. Jest to powszechnie znane jako szyfr Atbash .

Ponieważ ta transformacja sprawia, że ​​dane wyjściowe wyglądają jak język obcy, kod będzie musiał być możliwie jak najkrótszy.


Przykłady

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

Specyfikacja

  • Dane wejściowe mogą zawierać wiele wierszy i będą tylko ASCII
  • Do wyniku nie należy dodawać żadnych dodatkowych spacji
  • Sprawa musi zostać zachowana

Tabela liderów


To jest więc wygrywa najkrótszy kod w bajtach


24
+1 za uzasadnienie „Ponieważ ta transformacja sprawia, że ​​dane wyjściowe wyglądają jak język obcy, Twój kod musi być możliwie jak najkrótszy”.
kot

11
Niektóre ciekawostki: to Atbash , znany szyfr tak stary jak Biblia.
Jacob

6
„Ponieważ ta transformacja sprawia, że ​​dane wyjściowe wyglądają jak obcy język, Twój kod musi być możliwie jak najkrótszy”. Co to za logika? Ponieważ w twoim opisie pojawia się tyle znaków zapytania, ile napisano w jakimś obcym języku, twoja odpowiedź na to pytanie powinna być zrozumiała w języku naturalnym i należy docenić pewną gadatliwość.
Bart

Kiltiznnrmt Kfaaovh & Xlwv Tlou powinien być nową stroną „Programowania ciekawostek i gry w kręgle” ...
Erik the Outgolfer

Dlaczego nie pozwalasz na dodatkowe białe znaki? To uniemożliwia w niektórych językach, które zawsze mają końcowy znak nowej linii. Nie widzę, żeby coś to dodawało do wyzwania.
Esolanging Fruit

Odpowiedzi:


11

Pyth, 8 bajtów

XXzG)rG1

@xnor zasugerował to prostsze podejście w odpowiedzi na Pyth @ FryAmTheEggman, a następnie przetłumaczyłem go na Pyth.

Wykorzystuje to przydatne zachowanie X(translate), gdy podano tylko dwa argumenty: tłumaczy z drugiego argumentu na odwrócony drugi argument. Robimy to najpierw za pomocą małych liter ( G), a następnie za pomocą wielkich liter G.


16

C, 59 bajtów

Żal znowu wychowywanie C, ale byłem trochę rozczarowany, aby wyświetlić tylko C funkcje tutaj. Miałem wrażenie, że OP szukał użytecznego produktu.

main(c){while(~(c=getchar()))putchar(isalpha(c)?c+4^31:c);}

Kompilowany na Ubuntu 14.04 za pomocą prostego:

cc swalpha.c

Wynikowy plik wykonywalny odczytuje dowolną liczbę wierszy ze standardowego wejścia i zapisuje wynik na standardowe wyjście.

Dzięki tak wielu innym plakatom na temat sztuczki XOR.


11

CJam, 17 bajtów

Chciałem pomóc GamrCorpsowi zagrać w jego rozwiązanie CJam, ale wynik był tak inny, że postanowiłem udzielić osobnej odpowiedzi.

q'[,_el^_W%32f^er

Wypróbuj online.

Wyjaśnienie

q     e# Read all input.
'[,   e# Get a character range from the null byte up to and including "Z".
_el   e# Duplicate and convert to lowercase.
^     e# Symmetric set difference. Due to the lowercase operation only letters will not
      e# appear in both sets, and so we get a string with all uppercase letters followed
      e# by all lowercase letters, i.e "ABC...XYZabc...xyz".
_W%   e# Duplicate and reverse. Gives: "zyx...cbaZYX...CBA".
32f^  e# Take each character XOR 32 which swaps the case, so now we have:
      e#                               "ZYX...CBAzyx...cba"
er    e# Transliterate: substitute each character in the first string with the correspoding
      e# character in the second string.

4
Cieszę się, że próbowałeś pomóc! To jest rozwiązanie, które próbowałem stworzyć, po prostu nie mogłem rozgryźć XOR. Dobra robota!
GamrCorps

1
Składnia SE podkreślająca nienawiść esolangów.
Cyoce

@Cyoce Prawdopodobnie nie mają czasu; biorąc pod uwagę liczbę języków na tej stronie. To powiedziawszy, CJam jest prawdopodobnie jednym z łatwiejszych, ponieważ nie modyfikuje się sam i ma dość przejrzystą strukturę. Chciałbym zobaczyć, jak próbują dodać podświetlanie składni do samomodyfikującego się języka, takiego jak ///.
Esolanging Fruit

@ Challenger5 afaik, wyróżnianie składni po prostu używa prettify Google, czy trzeba będzie obsługiwać różne esolangi.
Martin Ender,

11

JavaScript (ES6), 69 67 bajtów

x=>x.replace(/[A-Z]/gi,c=>String.fromCharCode(c.charCodeAt()+4^31))

Używa tej samej strategii, co moja odpowiedź Japt :

x=>x.replace(/[A-Z]/gi,C=>   // Replace each letter C with
 String.fromCharCode(        //  the character with char code
  C.charCodeAt()+4^31))      //   the char code of C, plus 4, with the last 5 bits flipped.

Przeklinaj swoje niewiarygodnie długie nazwy nieruchomości, JS ...


1
+1 za wzmiankę o niezwykle długich nazwach JS. Moim ulubionym jest nadal niesławnydocument.getElementById
Cyoce

2
@Cyoce Spróbuj document.getElementsByClassNamelub, w przeglądarce Firefox i Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

Wydaje się, że to tylko 66 bajtów, a nie 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Masz rację, dzięki!
ETHproductions

Wygląda na to, że brakuje ci nawiasu zamykającego na końcu kodu golfowego.
starbeamrainbowlabs

10

Siatkówka , 17 14 13 bajtów

Kod:

\T`w`_dZ-Az-a

Wyjaśnienie:

\             # This suppresses the trailing linefeed
 T            # Switches to transliterate mode
  `w          # w is short for _0-9A-Za-z
    `_d       # d is short for 0-9
       Z-Az-a # Z-Az-a

To robi magiczne rzeczy i wykonuje zadanie.

Wypróbuj tutaj .


2
Szczęście, że niedawno dodałem \. Pech, że nie udało mi się jeszcze dodać klas znaków dla liter i klas znaków odwróconych.
Martin Ender

@ MartinBüttner Naprawdę bardzo szczęśliwy, że prawie unieważniłem moją odpowiedź :)
Adnan

Dla porównania, od Retina 0.7.2 można zrobić \T`lL`RlRL.
Martin Ender

9

Pyth, 10 9

uXGr;H)2z

Dzięki Jakube za uratowanie bajtu dzięki nowej funkcji ;!

Pakiet testowy

Szybkie wyjaśnienie: zmniejsz rozpoczynanie od wprowadzenia danych powyżej liczb 0 i 1. Operacja, którą należy wykonać, polega na przetłumaczeniu małych liter alfabetu za pomocą jednego r...0lub dwóch, r...1które są odpowiednio dolną i górną funkcją z python, a następnie odwróconą.


1
9 bajtów z powodu nowej funkcji (nawet nie w wieku jednego dnia):uXGr;H)2z
Jakube

5
Czy możesz dodać wyjaśnienie?
TanMath,

1
Czy nie możesz używać Xalfabetu, a następnie wielkich liter?
xnor

1
@xnor XXzG)rG1? To wydaje się działać.
lirtosiast

A może X łączy małe i wielkie litery, a następnie zamienia małe litery? Właściwie to prawdopodobnie dłużej.
xnor

6

Julia, 74 61 47 bajtów

s->replace(s,r"[a-z]"i,t->Char(31$Int(t[1])-4))

Jest to funkcja lambda, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.

Dopasowujemy każdą literę za pomocą wyrażenia regularnego i zastępujemy każdą literę znakiem ASCII odpowiadającym 31 XOR kodowi ASCII dla litery, minus 4.


Wow, to jest bardzo eleganckie. Otrzymuję ostrzeżenie o wycofaniu, $więc możesz chcieć to zaktualizować . Nie wiedziałem, że możesz użyć funkcji w replace.
niczky12

5

C, 150 129 bajtów

void rev(char*s){int i,t;for(i=0;i<strlen(s);i++){t=s[i]+25;t=t<116?180-t:244-t;isalpha(s[i])?printf("%c",t):printf("%c",s[i]);}}

Ta funkcja konwertuje char na int i dodaje odpowiednie przesunięcie do int przed drukowaniem. Wiem, że nie jest najkrótszy, ale nie widziałem implementacji C.

Przykładowe użycie

#include<stdio.h>
#include<string.h>
#include<ctype.h>

void rev(char*s){int i,temp;for(i=0;i<strlen(s);i++){temp=s[i]+25;temp=temp<116?180-temp:244-temp;isalpha(s[i])?printf("%c",temp):printf("%c",s[i]);}}


int main(){
   char *s = "hello, there";
   rev(s);
   return 0;
}

AKTUALIZACJA: skrócona nazwa zmiennej.


Witamy w Programowaniu łamigłówek i wymianie stosów kodów golfowych! To bardzo dobre podejście. Można by go bardziej zagrać w golfa, ustawiając wszystkie zmienne (w tym temp) dokładnie na jedną postać.
wizzwizz4

Ach, masz rację! Zmienię to
Danwakeem,

1
Myślisz, że możesz spróbować mojego wyzwania? Przeanalizuj swoje krzesło
wizzwizz4

1
Tak, to zadziała bez nagłówków, po prostu dostaniesz ostrzeżenie o kompilatorze @ edc65 Pomyślałem, że ponieważ kompiluje się i uruchamia, nie byłoby uważane za oszustwo, ale w prawdziwym świecie zawsze powinieneś dołączać nagłówki.
Danwakeem

1
107 bajtów:i,t;r(char*s){for(;i<strlen(s);i++){t=s[i]+25;t=t<116?180-t:244-t;isalpha(s[i])?putchar(t):putchar(s[i]);}}
Spikatrix

5

Japt, 23 22 bajtów

Ur"[A-Za-z]"_c +4^31 d

Wypróbuj online!

Jak to działa

Ur"[A-Za-z]"_  // Take the input and replace each letter with:
 c +4          //  Take its char code and add 4. This results in
               //  the string      "ABC...XYZabc...xyz"
               //  becoming        "EFG...\]^efg...|}~".
 ^31           //  XOR the result by 31. This flips its last five 5 bits.
               //  We now have     "ZYX...CBAzyx...cba".
 d             //  Convert back from a char code.
               // Implicit: output last expression

Fajny pomysł (który pożyczyłem ...), aby użyć do tego XOR
Luis Mendo

5

C, 64

Funkcja void, która modyfikuje ciąg w miejscu.

t(char*p){for(int c;c=*p;)*p++=c>64&c<91|c>96&c<123?(c^31)-4:c;}

Test: ideone


1
c;t(char*p){for(;c=*p;)*p++=c>64&c<91|c>96&c<123?(c^31)-4:c;}
Spikatrix

@CoolGuy racja, ale nie podoba mi się globalny wewnątrz funkcji ... to tylko ja
edc65

Czy to nie 64 bajty?
Downgoat,

@ Nie tak, to jest .. dzięki ..
edc65

5

R 69 69 bajtów

Dzięki @Giuseppe za golenie dodatkowych bajtów:

function(s)cat(chartr("a-zA-Z",intToUtf8(c(122:97,90:65)),s))

Poprzednia wersja:

function(s)cat(chartr("a-zA-Z",rawToChar(as.raw(c(122:97,90:65))),s))

To anonimowa funkcja. Stosowanie:

> f=function(s)cat(chartr("a-zA-Z",rawToChar(as.raw(c(122:97,90:65))),s))
> f("Hello, World!")
Svool, Dliow!
> f("Programming Puzzles & Code Golf")
Kiltiznnrmt Kfaaovh & Xlwv Tlou
> f("This is
+ a multiline
+ example.")
Gsrh rh
z nfogrormv
vcznkov.

1
intToUtf8(c(122:97,90:65))zamiast rawkonwersji i możesz się ich również pozbyć cat. Przyzwyczajam się do gry w golfa w wieku 1+ lat ...
Giuseppe

4

Poważnie, 31 bajtów (niekonkurujących)

úúû+╗úRúûR+╝,`;╜íuWD╛E(X0WX`Mεj

Hex Dump:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

Wypróbuj online

Expl:

úúû+╗                             Put UPPERCASElowercase in reg0
     úRúûR+╝                      Put ESACREPPUesacrewol in reg1
            ,                     Fetch input.
             `             `Mεj   Map over the characters in string as list, joining result
              ;╜íu                Find 1-index of character in UPPERCASElowercase
                  W     0WX       If it is positive (present): 
                   D              Convert back to 0-index
                    ╛E            Look it up in ESACREPPUesacrewol
                      (X          Delete the original character.
                                  (Else just leave the original character unchanged.)

Właśnie zdałem sobie sprawę, że specyfikacja mówi, że nie ma dodatkowych białych znaków, ale nie ma sposobu, aby powstrzymać końcowe znaki nowej linii w wynikach Poważnie, więc nie ma poważnego rozwiązania.


1
Co ESACREPPUesacrewolznaczy
Downgoat

3
@ Doᴡɴɢᴏᴀᴛ UPPERCASE odwrócone LOWERCASE odwrócone
Mama Fun Roll

2
odwrócony wielki alfabet poprzedzony odwróconym małym alfabetem
kwintopia

4

Rubinowy, 40 bajtów

Nowe rozwiązanie: ukradł bit, który nieco rzucił magię z innych postów tutaj:

->s{s.gsub(/[a-z]/i){($&.ord+4^31).chr}}

Rubinowy, 55 46 bajtów

->s{s.tr'a-zA-Z',[*?A..?Z,*?a..?z].reverse*''}

9 bajtów off dzięki @manatwork


testowe uruchomienie:

->s{s.gsub(/[a-z]/i){($&.ord+4^31).chr}}["Kiltiznnrmt Kfaaovh & Xlwv Tlou"]
=> "Programming Puzzles & Code Golf"


3

𝔼𝕊𝕄𝕚𝕟 2, 12 znaków / 26 bajtów (niekonkurencyjny)

ïĪ(ᶐ+ᶛ,ᶐᴙ+ᶛᴙ

Try it here (Firefox only).

Dodano funkcję transliteracji po opublikowaniu wyzwania.

Wyjaśnienie

ïĪ(ᶐ+ᶛ,ᶐᴙ+ᶛᴙ // implicit: ï=input
ïĪ(           // transliterate ï...
   ᶐ+ᶛ,       // from uppercase+lowercase alphabet...
       ᶐᴙ+ᶛᴙ  // ... to reversed uppercase+reversed lowercase alphabet
              // implicit output

Myślałem, że 𝔼𝕊𝕄𝕚𝕟 2 będzie się nazywać 𝔼𝕊 ∞?
Downgoat

1
Nie, postanowiłem zachować to dla komplementarnego (ale innego) języka dla 𝔼𝕊𝕄𝕚𝕟.
Mama Fun Roll

IIRC Jest tablica pogrubiona 2.
Conor O'Brien

@ ՊՓԼՃՐՊՃՈԲՍԼ Nazwij to ESMax (w podwójnym uderzeniu).
mbomb007

3

CJam, 21 bajtów

q'[,65>__el_@+W%@@+er

Nie jest to optymalne rozwiązanie ... jeszcze ... Wypróbuj online

Trudno to wyjaśnić bez grupowania rzeczy, więc oto ogólne wyjaśnienie: pobiera dane wejściowe, przesuwa dwa razy wielkie litery i dwa razy małe litery, obraca rzeczy, łączy ciągi wielkich i małych liter, odwraca jeden i używa transliteracji (podobnie do odpowiedzi Retina).


Czy to tworzy końcowy znak nowej linii?
LegionMammal978

@ LegionMammal978 Nie powinno się, chyba że aditsu zmieniło sposób wyrzucania stosu.
GamrCorps

@ LegionMammal978 Nie.
Martin Ender


3

PostgreSQL, 118 125 bajtów

SELECT s,TRANSLATE(s,t||UPPER(t),REVERSE(t)||REVERSE(UPPER(t)))
FROM(SELECT text'Programming Puzzles & Code Golf's,text'abcdefghijklmnopqrstuvwxyz't)r

SqlFiddleDemo

Wynik:

╔══════════════════════════════════╦═════════════════════════════════╗
║                s                 ║            translate            ║
╠══════════════════════════════════╬═════════════════════════════════╣
║ Programming Puzzles & Code Golf  ║ Kiltiznnrmt Kfaaovh & Xlwv Tlou ║
╚══════════════════════════════════╩═════════════════════════════════╝

Wejście: SELECT text'...'s


EDYTOWAĆ:

Wprowadź jako tabelę:

SELECT s,TRANSLATE(s,t||UPPER(t),REVERSE(t)||REVERSE(UPPER(t)))
FROM i,(SELECT text'abcdefghijklmnopqrstuvwxyz't)r
GROUP BY s,t

SqlFiddleDemo

Wynik:

╔══════════════════════════════════╦═════════════════════════════════╗
║                s                 ║            translate            ║
╠══════════════════════════════════╬═════════════════════════════════╣
║ Hello, World!                    ║ Svool, Dliow!                   ║
║ Programming Puzzles & Code Golf  ║ Kiltiznnrmt Kfaaovh & Xlwv Tlou ║
║ abcdefghijklmnopqrstuvwxyz       ║ zyxwvutsrqponmlkjihgfedcba      ║
╚══════════════════════════════════╩═════════════════════════════════╝

Hej, chłopcze2025, myślę, że jest to mniej niż 118, ale nie jestem ekspertem w zakresie liczenia zasad
t-clausen.dk

2

Python 3, 195 169 168 166 bajtów

Dzięki @TrangOul za -2 bajty!

Jak nie widziałem, że mogłem wcześniej grać w golfa?

x=__import__('string').ascii_letters;y,z=x[26:],x[:26];a,b=y[::-1],z[::-1];print(''.join(b[z.index(i)]if i in b else a[y.index(i)]if i in a else i for i in input()))

(sorta) nie golfił:

x = __import__('string').ascii_letters;
y, z = x[26: ], x[: 26];
a, b = y[::-1], z[::-1];
print(''.join(b[z.index(i)]
    if i in b
    else a[y.index(i)]
    if i in a
    else i
    for i in input()
))

Wypróbuj na Ideone!


1
Można zapisać 2 bajty, usuwając najbardziej oddalonych []od join.
Trang Oul

@TrangOul naprawdę? To jest lista, więc pomyślałem, że to musi być lista, bo inaczej ją dostaniesz generator object <genexpr> at..., ale przetestuję ją
kot

@TrangOul Nevermind, dowiedziałem się czegoś, dzięki!
kot

Każda iterowalna [zawierająca strwartości] może zostać przekazana do join()funkcji.
Trang Oul

2

Python, 61 bajtów

lambda x:''.join([c,chr(ord(c)+4^31)][c.isalpha()]for c in x)

Anonimowa funkcja. Na literach wykonuje operację odwracania reprezentacji bitów przez dodanie 4, a następnie przerzucenie ostatnich pięciu bitów, podobnie do odpowiedzi Javascript ETHproductions .


Właśnie napisałem dokładnie to samo haha
sagiksp

2

Haskell, 119 104 bajtów

Zaoszczędzono 15 bajtów dzięki @nimi.

c=fromEnum;s=toEnum;f[]="";f(x:y)|64<c x&&c x<91=s(155-c x):f y|96<c x&&c x<123=s(219-c x):f y|0<1=x:f y

Stosowanie:

f "abcdefghijklmnopqrstuvwxyz"
"zyxwvutsrqponmlkjihgfedcba"

f "Programming Puzzles & Code Golf"
"Kiltiznnrmt Kfaaovh & Xlwv Tlou"

f "Hello, World!"
"Svool, Dliow!"

Wyjaśnienie

let c=fromEnum;s=toEnum;--wrap names for later use, fromEnum gets ascii code from char, toEnum gets char from ascii code
f[]=[];                 --feed empty list (of chars in this case), get empty list
f(x:y)                  --feed a list, separate the first element and...
|64<c x&&c x<91=        --if its an uppercase char (using ascii code range)...
s(c x*(-1)+155)         --  inverse its ascii code value, move it to the range of uppercase and get the new char
                        --  (like rotating half turn a ruler by the side and then sliding it to the space it previously occupied)
:f y                    --  feed the rest of the list and stick the new char in front of the result
|96<c x&&c x<123=       --if its a lowercase char (using ascii code range)...
s(c x*(-1)+219)         --  inverse its ascii code value, move it to the range of lowercase and get the new char
:f y                    --  feed the rest of the list and stick the new char in front of the result
|True=x:f y             --otherwise feed the rest of the list and stick the char in front of the result

Jestem nowy w Haskell ... w programowaniu funkcjonalnym ... i na stronie, i wiem, że istnieje (dużo) lepszych odpowiedzi na to pytanie, ale proszę o wyrozumiałość.


Kilka wskazówek golfowych: a) nie ma potrzeby korzystania let. Zacznij bezpośrednio od c=fromEnum. Użyj (155-c x)i (219-c x). c) Truemożna zastąpić 1<2. - Kod nie można załadować do mnie z „typ zmiennej niejednoznaczną” błędu dla funkcji ci s(ghci 7.10.2), ale to może być łatwo ustalony ze f[]=""zamiast f[]=[].
nimi

Dzięki !, tak naprawdę zastanawiałem się, czy jest poprawny bez „let”, ponieważ nie działa bezpośrednio na GHC.
puszyste uszy

2

Perl 6 , 28 bajtów

{S:g/\w/{chr $/.ord+4+^31}/}

Stosowanie:

# give it a lexical name
my &swap = {  }

say swap 'Programming Puzzles & Code Golf';
# Kiltiznnrmt Kfaaovh & Xlwv Tlou

say swap ('a'..'z').join
# zyxwvutsrqponmlkjihgfedcba

Kiedy to uruchamiam, mówi: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.Nie wiem nic o perlu, więc robię coś złego? Jak miałbym to uruchomić?
Downgoat

@ Doᴡɴɢᴏᴀᴛ Jeśli zauważysz, że jest napisane w Perlu 6, możesz przejść do # perl6 na freenode i wpisaćm: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

Ach, okej, najwyraźniej nie umiem czytać: P
Downgoat

@ Doᴡɴɢᴏᴀᴛ Dodałem notatkę, że możesz to przetestować na # perl6 na freenode
Brad Gilbert b2gills

2

Java, 136 bajtów

void x(String i){for(char c:i.toCharArray()){if(Character.isLetter(c))c=c<91?(char)(90-(c-65)):(char)(122-(c-97));System.out.print(c);}}

Przykładowe użycie:

class Test {
  static void x(String i){for(char c:i.toCharArray()){if(Character.isLetter(c))c=c<91?(char)(90-(c-65)):(char)(122-(c-97));System.out.print(c);}}
  public static void main(String[] args) {
    x("Programming Puzzles & Code Golf");
    // produces "Kiltiznnrmt Kfaaovh & Xlwv Tlou"
  }
}

Prawdopodobnie najgorszy powszechnie używany język pod względem wielkości bajtów.



Wiem, że zostało to opublikowane około 1,5 roku temu, ale możesz void x(String i){for(Character c:i.toCharArray())System.out.print(c.isLetter(c)?(char)(c<91?90-(c-65):122-(c-97)):c);}
zagrać w

Lub nawet krócej: void y(String i){for(int c:i.getBytes())System.out.print((char)(c>65&c<91|c>96&c<123?c<91?90-(c-65):122-(c-97):c));}( 116 bajtów )
Kevin Cruijssen

1
@KevinCruijssen Możesz również zmienić kolejność obliczeń, aby zaprzeczyć potrzebie nawiasów, tworząc 90-(c-65)do -c+65+90 i 122-(‌​c-97)do -c+97+122, co pozwala zaoszczędzić bajt.
Zavada,

2

Powłoka Unix + tr + printf, 35 bajtów

tr A-Za-z `printf %s {Z..A} {z..a}`

Oto kanoniczna odpowiedź w tr. Pomyślałem, jak pytanie transliteracji alfabetu może przebiegać bez kanonicznej odpowiedzi na tr transliterację alfabetu?

tr sam w sobie nawet nie robi „Witaj, świecie!” i jako taki nie jest językiem programowania, dlatego zaznaczyłem odpowiedź jako niekonkurencyjną [1] .

[1]: Edycja: W rzeczywistości powłoka uniksowa jest językiem, a tr jest standardową biblioteką . Dzięki Downgoat i Digital Trauma za pomoc w wykryciu tego.


3
Myślę, że w porządku jest żądanie powłoki lub basha jako języka, a zwykłe narzędzia ( trw coreutils) jako biblioteki standardowej. Zobacz niezliczone moje odpowiedzi ;-)
Digital Trauma

1
Ale to nie działa: tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Myślę, że musisz zrobić coś takiego tr A-Za-z $(printf %s {Z..A} {z..a})(i zastąpić $( )backticks)
Digital Trauma

@DigitalTrauma, ale nie każdy ma printf w swoim systemie.
user48538

7
Myślę, że ciężko byłoby ci znaleźć system uniksowy, który go nie ma printf- w końcu jest określony przez Posix . Również jest wbudowany w bash, który jest dość wszechobecny w dzisiejszych czasach. Niezależnie od tego, posiadanie czegoś wstępnie zainstalowanego na każdym systemie nie jest warunkiem wstępnym do gry w golfa - nie każdy ma też CJam w swoim systemie ;-)
Digital Trauma

1
Przestrzeń między }i {jest wymagana - w przeciwnym razie rozszerzenie stanie się czymś podobnymZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 bajtów

Używa wersji 6.0.0 , która jest wcześniejsza niż to wyzwanie. Kod działa w Octave.

jttk2Y2mXK)o31Z~4-cK(

Przykład

>> matl
 > jttk2Y2mXK)o31Z~4-cK(
 >
> Hello, World!
Svool, Dliow!

Wyjaśnienie

j             % input string
t             % duplicate
tk            % duplicate and convert to lowercase
2Y2           % string 'abc...xyz'
m             % "ismember" function: produces logical index of letter positions
XK            % copy to clipboard K
)             % index into string to get its letters
o31Z~4-       % bitwise XOR with 31 and subtract 4
c             % convert to char
K             % paste logical index from clipboard K
(             % put back modified letters into original string

Stare podejście, 28 bajtów

j1Y2!tkh"t@2#m@0v27b-)wXK)K(

1

MATLAB, 61 bajtów

@(x)[abs(-x+ismember(x,65:90)*155+ismember(x,97:122)*219),'']

Próbowałem f=@ismemberi zmieniłem zakres a=65:90i robię to 32+aw drugim ismemberwywołaniu. Wszystko to skróciło kod, ale spowodowałoby program, a zatem wymagałoby zarówno dispi input.

To daje:

ans('Hello, World!')
ans =
Svool, Dliow!

ans('Programming Puzzles & Code Golf')
ans =
Kiltiznnrmt Kfaaovh & Xlwv Tlou

1

Brachylog , 66 bajtów

_|hH(:64>:91<,77-H+78=X;H:96>:123<,109-H+110=X;HX),[X]:"~c"w,?b:0&

Brak wbudowanych naprawdę boli tutaj, więc musimy uciekać się do starych dobrych obliczeń kodów ASCII.

Predykat brachylog_mainoczekuje ciągu znaków kodowych jako danych wejściowych i bez danych wyjściowych, npbrachylog_main(`Hello, World!`,_).

Wyjaśnienie

_                                                                  § If the input is empty,
                                                                   § return true
                                                                   §
 |                                                                 § Else
                                                                   §
  hH(                                            ),[X]:"~c"w       § Print variable X which
                                                                   § depends on the head of
                                                                   § the input as a char code
                                                                   §
                                                            ,?b:0& § Recursive call on the
                                                                   § tail of the input
                                                                   §
     :64>:91<,77-H+78=X                                            § If H is capital, X =
                                                                   § 77 - H + 78
                       ;                                           § Else if H is non-cap, X=
                        H:96>:123<,109-H+110=X                     § 109 - H + 110
                                              ;                    § Else (not a letter)
                                               HX                  § H = X    

1

Perl 6, 40 39 bajtów

Ponieważ wszyscy inni wykonują anonimowe funkcje:

my &f=*.trans(/\w/=>{chr $/.ord+4+^31})

(Dzięki @ b2gills za wskazówkę)

Używa tego samego trzepotania voodoo, co niektóre inne posty. Nie byłem pewien, czy uwzględnić deklarację zmiennej / funkcji w liczbie bajtów, więc zrobiłem to na wszelki wypadek. Bez tego rozwiązanie ma tylko 34 bajty.

Stosowanie:

> f "zyxwvutsrqponmlkjihgfedcba"
abcdefghijklmnopqrstuvwxyz
> f "Kiltiznnrmt Kfaaovh & Xlwv Tlou"
Programming Puzzles & Code Golf
> f "Svool, Dliow!"
Hello, World!

Możesz *.trans(…)go skrócić.
Brad Gilbert b2gills

1

Python 3, 164 159 bajtów

def f(t,a="abcdefghijklmnopqrstuvwxyz",b=""):
 for c in t:u=64<ord(c)<91;c=c.lower();c=a[::-1][a.index(c)] if c in a else c;b+=c.upper() if u else c
 return b
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.