Rozważ transformację Atbash :
A|B|C|D|E|F|G|H|I|J|K|L|M
Z|Y|X|W|V|U|T|S|R|Q|P|O|N
Gdzie A ⇔ Z i L ⇔ O, np. Istnieje interesująca właściwość, którą dzielą niektóre słowa. Kiedy niektóre ciągi są tłumaczone na ich odpowiednik atbash, wspomniane tłumaczenie jest oryginalnym wyrazem odwróconym. Nazywam te Autopalinde Atbash .
Na przykład przetłumaczmy WIZARD :
W → D
I → R
Z → A
A → Z
R → I
D → W
Wynikiem jest DRAZIW , który jest odwrócony WIZARD . Zatem WIZARD jest szyfr atbash własnym palindrom.
Cel Biorąc pod uwagę ciąg znaków ASCII do wydrukowania, wyślij lub zwróć prawdziwą wartość, jeśli ciąg ten jest samo-palindromem atbash, a w przeciwnym razie wartością falsey. (Odbywa się to poprzez STDIN, najbliższy odpowiednik, funkcjonalne dane wejściowe itp. Jeśli twój język nie może wykonać żadnego z tych, rozważ wybór innego języka, w którym możesz wprowadzić kod na stałe.) Powinieneś to zrobić bez rozróżniania wielkości liter. Jeśli wejściem jest palindrom i nie ma na niego wpływu sekwencja atbash, powinieneś nadal generować wartość true, ponieważ sam palindrom + jest palindromem. To jest golf golfowy , więc wygrywa najkrótszy program w bajtach.
Przypadki testowe
"Input" => true, false
"WIZARD" => true
"Wizard" => true // case doesn't matter
"wIzArD" => true
"W I Z A R D" => true
"W IZ ARD" => false // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
"ABCXYZ" => true // ZYXCBA
"345 09%" => false // is not a palindrome
"ev" => true // ve
"AZGDFSSF IJHSDFIU HFIA" => false
"Zyba" => true
"-AZ" => false // -ZA is not a reverse of -AZ
"Tree vvig" => true // Givv eert
"$%%$" => true // palindrome
"A$&$z" => true // z$&$A
Tabela liderów
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=68757,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code
...Odpowiedzi:
RX ,
98 bajtówMocno zainspirowany Retiną, zrobiłem to kilka dni temu. Kod:
Wyjaśnienie:
Wypróbuj tutaj !
źródło
Pyth,
109 bajtówWypróbuj to skrzypce online lub sprawdź jednocześnie wszystkie przypadki testowe.
Wyjaśnienie
źródło
rz0
dwa razy, czy nie jest krótsze zapisanie go w zmiennej?q_Jrz0XJG
jest o jeden bajt krótszy.Julia, 96 bajtów
Jest to funkcja lambda, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.
Nie golfowany:
źródło
Narzędzia Bash + Linux, 56
Zwraca pusty ciąg dla Truthy i coś takiego jak
- /dev/fd/63 differ: byte 1, line 1
dla Falsey. Jeśli nie jest to do przyjęcia, możemy dodać-s
dodatkowe 3 bajty i użyć standardowych kodów powrotu Unix 0 dla Success (Truthy) i 1 dla Failure (Falsey).źródło
Siatkówka , 44 bajty
Odbitki
1
lub0
. Liczba bajtów zakłada, że plik jest zakodowany jako ISO 8859-1.Wypróbuj online!
Ta odpowiedź była w dużej mierze zainspirowana odpowiedzią sed firmy DigitalTrauma, ale wydaje mi się, że nie ma zbyt wielu podejść do tego wyzwania.
Wyjaśnienie
Ilekroć widzisz a
¶
, pierwszą rzeczą, którą Retina robi po podzieleniu kodu na linie, jest zastąpienie wszystkich tych pilcrows znakami linii. Pozwala to na włączenie kanałów dla jednego bajtu, mimo że kanały są separatorem etapów Retiny.Zaczynamy od skopiowania danych wejściowych. Dopasowujemy koniec wejścia do
$
i wstawiamy wysuw linii wraz z samym wejściem (używając$_
).Etap transliteracji. Zacznijmy regex:
.+$
. Dopasowuje drugą kopię danych wejściowych (upewniając się, że dopasowanie przebiega do końca ciągu). Tak więc tylko znaki w drugiej kopii będą transliterowane. Sama transliteracja korzysta z niektórych bardzo najnowszych funkcji.l
iL
są klasami znaków odpowiednio dla małych i wielkich liter.o
odnosi się do drugiego zestawu znaków transliteracji iR
odwraca go. Zatem dwa zestawy znaków rozwijają się do:Zauważysz, że zamienia to przypadek podczas szyfrowania Atbash, ale i tak zrobimy końcowe porównanie bez rozróżniania wielkości liter.
Teraz odwracamy drugą kopię. Niestety Retina nie ma jeszcze na to dogodnego sposobu, więc będziemy musieli przenosić jedną postać od końca do przodu na raz. Odbywa się to poprzez zmianę przeznaczenia separatora podawania linii jako znacznika, którego część nie została jeszcze odwrócona. Dopasowujemy tę część, ale przechwytujemy ostatnią postać osobno. Ta postać idzie na przód, a reszta pozostaje niezmieniona.
+
Mówi Retina to zrobić, dopóki nie jest już możliwe (bo¶
jest na końcu łańcucha).Na koniec sprawdzamy, czy dwa ciągi są takie same.
i
Sprawia wzorzec wielkości liter - wygodnie, w .NET, oznacza to, że wsteczne są również wielkości liter. Możesz zauważyć, że nie mamy już separatora między oryginalnym wejściem a zmodyfikowaną kopią. Nie potrzebujemy jednak jednego, ponieważ mają one tę samą długość, a jeśli łańcuch składa się teraz dokładnie z tego samego ciągu dwa razy (w zależności od wielkości liter), to muszą one być ciągiem oryginalnym i zmodyfikowanym. Jeśli zastanawiasz się, co stało się z końcowym podawaniem liniowym, którego użyliśmy jako znacznika, nadal tam jest, ale w wielu wyrażeniach regularnych$
dopasowuje się również przed ostatnim znakiem ciągu, jeśli ten znak jest przesuwany.Ponieważ ten etap składa się tylko z jednej linii, uważa się go za etap dopasowania, który liczy liczbę dopasowań. Jeśli dane wejściowe to palindrom Atbash, otrzymamy dokładnie jedno dopasowanie, a wynik to
1
. Jeśli nie, to wyrażenie regularne nie będzie pasować, a wynik będzie0
.źródło
\n
wyrażenia regularne i$n
podstawienia, ale to zmarnowane bajty na grę w golfa. ;)GNU Sed, 105
Wyjście 1 dla prawdy i 0 dla falsey.
Próbowałem to zrobić w Retinie, ale nie mogłem wymyślić, jak zapisać ciąg przed transliteracją Atbash do odwrotnego porównania z późniejszym. Być może istnieje lepszy sposób.
y
Komenda transliteracji Seda pozostawia wiele do życzenia.źródło
T
- zakładałem, że stosuje się go kolejno do każdej postaci, ale jeśli moje zrozumienie jest słuszne, dotyczy całej przestrzeni wzorów, co jest znacznie bardziej przydatne[\s\S]+
więc pomijając go, transliterujesz wszystko.-r
flagę na odwrotne ukośniki w\(
i\)
. Zgadzam się z tobą nay
rozkaz!𝔼𝕊𝕄𝕚𝕟, 15 znaków / 30 bajtów
Try it here (Firefox only).
Wyjaśnienie
źródło
Nawias, 658 bajtów
Działa tylko teraz dla wszystkich wielkich liter bez białych znaków, używając tej zmodyfikowanej wersji skryptu, aby obsługiwał czytanie ze standardowego wejścia:
Wyjaśnienie
źródło
Python 3,
9085 bajtówKonwertujemy dane wejściowe na wielkie litery, a następnie obliczamy ciąg Atbashed, odejmując wszystkie liczby porządkowe od 155, jeśli są w zakresie dużych liter alfabetu.
źródło
Kerf , 73 bajty
Kerf jest zastrzeżonym językiem z tej samej ogólnej rodziny co APL, J i K. Możliwe jest pisanie tajemniczych, kompaktowych onelinerów i unikanie użycia jawnych pętli:
Jednak użycie wypisanych aliasów poleceń zamiast skrótowych symboli i użycie znaczących identyfikatorów sprawia, że program jest znacznie bardziej przejrzysty i dość łatwy do naśladowania, nawet jeśli nie znasz Kerfa:
W akcji:
Kerf prawdopodobnie nie wygra wielu konkursów na kodegolfa, szczególnie przeciwko specjalnie zaprojektowanym językom, ale może warto go majstrować, jeśli podoba ci się pomysł języków z rodziny APL, ale składnia jest zbyt dziwna. ( Oświadczenie: Jestem autorem podręcznika użytkownika dla Kerf. )
źródło
Prolog, 121 bajtów
Nazywa się to atomem na wejściu, np
a('WIZARD').
.źródło
JavaScript (ES6), 91
TEST
źródło
C,
10197 bajtówPonieważ pytanie określa znaki ASCII, nie obsługuje to żadnego innego kodowania.
Wyjaśnienie
Tworzymy wskaźnik,
p
który zaczyna się na końcu łańcucha. Następnie pętla, zarówno w ruchus
ip
kierunku siebies
dobiegnie końca. Oznacza to, że każda para znaków zostanie sprawdzona dwukrotnie, ale oszczędza to kilka bajtów w porównaniu z zatrzymywaniem, gdy tylko wskaźniki się przekroczą.Przy każdej iteracji sprawdzamy, czy
*p
jest listem. Jeśli tak, sprawdź, czy*s
zawiera się w zakresie liter (ASCII 64 w górę),*p
i*s
dodaj do 27 (mod 32). Testy inne niż litery powyżej 64 nie przejdą tego testu, więc nie musimy tego sprawdzaćisalpha(*s)
.Jeśli
*p
nie jest literą, to po prostu testujemy, czy jest równa*s
. W obu przypadkach zakończymy pętlę wcześniejs
i przejdziemyp
.Jeśli
s
ip
zostały skrzyżowane, to każda para liter pasuje poprawnie, więc zwracamy wartość true; w przeciwnym razie zwracamy fałsz.Program testowy
Przekaż ciągi do przetestowania jako argumenty wiersza polecenia. Daje to prawidłowe wyniki dla wszystkich przypadków testowych. Nie ma podanego wymogu dla pustego łańcucha; moja implementacja zwraca wartość false dla tego wejścia.
źródło
f
„s deklarację typu dla prototypu stylu K & R:f(char*s)
Perl 5, 70 bajtów
Podprogram:
Zobacz w użyciu:
źródło
MATL, 23 bajty
Wykorzystuje bieżącą wersję .
Przykłady
źródło
CJam, 18 bajtów
Wypróbuj online
Działa poprzez konwersję danych wejściowych na wielkie litery, wykonywanie tłumaczenia liter, odwracanie łańcucha i sprawdzanie równości.
źródło
Japt,
3027 bajtówWypróbuj online!
Jak to działa
Jest to w dużej mierze oparte na mojej odpowiedzi Japt na Swap the Alphabet.
źródło
Python,
156112 bajtówZasadniczo tworzy słownik tłumaczenia wielkimi literami, a dane wejściowe są pisane wielkimi literami (gdyby zamiast tego wszystko było pisane małymi literami, dodałoby to 5 bajtów). Następnie, dla każdego znaku wielkiej litery, dokonaj tłumaczenia i dołącz do listy, chyba że znak nie znajduje się w alfabecie, w takim przypadku dopisz znak bez zmian. Dołącz do całej listy i porównaj z odwróconą listą.
Krzyczcie do @Artyer za publikowanie prawie dokładnie tak, jak zamierzałem zamieścić przede mną. Ale muszę potwierdzić, że to moja praca i zrobiłem to niezależnie .
Na podstawie odpowiedzi Julii Alexa A. Wypróbuj tutaj
źródło
.get(i,i)
. +1.05AB1E , 8 bajtów (niekonkurujące)
Ten język korzysta z funkcji, które datują wyzwanie, dlatego nie jest konkurencyjny.
Kod:
Wyjaśnienie:
Wypróbuj online!
źródło
Współczynnik,
118113 bajtówTo anonimowa funkcja.
Nie znam krótszego sposobu na wygenerowanie tablicy asocjacyjnej alfabetu: c
źródło
Clojure, 100 bajtów
Powinno być możliwe ograniczenie go do pojedynczej anonimowej funkcji, skrócenie około 10 dodatkowych bajtów (deklaracji), ale nie znalazłem jeszcze sposobu.
źródło
Rubinowy,
7977 bajtówAkceptuje słowo do przetestowania jako argument wiersza polecenia. Wychodzi z kodem 0 (co jest zgodne z powłoką), jeśli argumentem jest atlasowy własny palindrom, lub z kodem 1 w przeciwnym razie.
źródło
puts
wynik nie byłby krótszy niż wyjście z trójcą?$*
to pseudonim dlaARGV
.Rubinowy, 56 bajtów
Jest to anonimowa funkcja, która pobiera ciąg znaków i zwraca
true
lubfalse
. Jest to raczej niezdarne: w celu zaoszczędzenia niektórych bajtów używa destrukcyjnego wariantuupcase
(!
po nim).upcase!
niestety zwraca,nil
jeśli nic się nie zmienia (jak wszystkie dane numeryczne), więc niektóre bajty są tracone, próbując sobie z tym poradzić. Nadal działa :)źródło
MATLAB, 61 bajtów
Nie najkrótsze rozwiązanie, ale wciąż interesujące
źródło