Dwa ciągi znaków są „odpowiednikiem Cezara”, jeśli odległość (zliczanie w górę) między odpowiednimi znakami jest taka sama. Tak, wymyśliłem ten termin. Oto przykład:
„Abc” i „Cde” są równoważne, ponieważ
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
Wielkie litery nie mają znaczenia.
„Cześć” i „Świat” nie są odpowiednikami Cezara, ponieważ
distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15
„Abcd” i „Yzab” są odpowiednikami Cezara, ponieważ
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Musisz napisać pełny program, który pobiera dwa ciągi ze STDIN i wypisuje prawdziwą wartość, jeśli są one równoważne Cezarowi, i wartość fałsz, jeśli tak nie jest.
Prawidłowe dane wejściowe
Ponieważ wielkie litery nie mają znaczenia, jest dopuszczalne, jeśli Twój program wymaga, aby dane wejściowe były pisane małymi literami, wszystkie dużymi literami lub dowolną mieszanką, o ile jest to określone w odpowiedzi.
Na wejściu nie będzie spacji ani interpunkcji.
Wejścia będą tej samej długości.
Odpowiedzi:
Pyth, 9 bajtów
Te dwa ciągi znaków są zapisane małymi literami, oddzielone znakiem nowej linii.
Demonstracja.
Jak to działa:
.r
jest funkcją tłumaczenia obrotowego Pytha. Odwzorowuje każdy element w pierwszym argumencie od pierwszego wystąpienia w drugim argumencie do następnego wpisu w drugim argumencie. W tym przypadku drugim argumentem jestG
mały alfabet, więc jest to równoważne przesunięciu Cezara o 1.Umieszczenie
=
przed funkcją powoduje, że jest ona na miejscu. W ten sposób=.rzG
przypisuje przesunięcie Cezara oz
jeden doz
. Zauważ, żez
jest inicjowany do pierwszego wiersza wprowadzania w Pyth.To wyrażenie jest używane w mapie.
m=.rzGG
stosuje tę transformację doz
26 razy, raz dla każdego elementuG
, i zapisuje wyniki na liście. Daje to listę wszystkich możliwych przesunięć Cezaraz
.Na koniec
}w
sprawdza, czy następny wiersz danych wejściowych znajduje się na tej liście.źródło
CJam,
171211 bajtów1 bajt zapisany przez Dennisa.
Sprawdź to tutaj.
Oczekuje, że pierwszy ciąg będzie pisany małymi literami, a drugi - dużymi literami. Odbitki
1
dla łańcuchów równoważnych Cezarowi i0
innych.Wyjaśnienie
Powodem, dla którego potrzebujemy pierwszego łańcucha pisanego małymi literami, a drugiego pisanego dużymi literami jest zapewnienie, że różnica jest zawsze dodatnia. W przeciwnym razie przyjęcie modulo może zwrócić coś negatywnego i niekoniecznie będzie unikalne, nawet dla łańcuchów równoważnych Cezarowi.
źródło
26f%
do zapisania jednego bajtu.!
nie miałbym 0 lub 1, ale pustą lub niepustą tablicę.Python2,
68677069 BajtówPython3,
6766 bajtówUngolf jest trochę trudny, więc po prostu wyjaśnij:
zip(*raw_input().split())
pobiera dane wejściowe, dzieli je na listę dwóch słów, zakładając, że słowa są oddzielone spacją. Następnie każde słowo jest przekazywane jako parametrzip
funkcji za pomocą*
operatora.zip
Funkcja stworzy listę par liter, listów w tej samej pozycji.(ord(y)-ord(x))%26for x,y in ...
To po prostu przekształca listę 2 liter w generator wyrażenia odległości między tymi literami.{...}
redukuje to wyrażenie do zbioru, zasadniczo wyrzucając duplikatylen(...)<2
sprawdza, czy w zestawie pozostała tylko jedna pozycja (lub 0 dla pustych ciągów), co w zasadzie oznacza, że wszystkie litery miały tę samą odległość.print
wyprowadza tę wartośćDzięki xnor za przypomnienie mi
set(...)
można go zastąpić,{...}
a wcześniejsza przestrzeńfor
nie jest wymagana. Również dzięki Josay dla osób<=1
do<2
optymalizacji.źródło
<=1
do „<2”.{...}
zamiastset((...))
. Twój kod musi faktycznie wydrukować wynik.lambda
oszczędności podczas pisaniaprint
lubreturn
.for
; leksyk Python poprawnie dzieli26for
.APL (15)
Potrzebuje wielkich liter i drukuje albo,
1
albo0
tak:Wyjaśnienie:
↑⍞⍞
: odczytaj dwie linie z klawiatury i ustaw znaki w macierzy N × 2.⎕A⍳
: dla każdego znaku znajdź miejsce, w którym występuje⎕A
(wielkie litery).-⌿
: dla każdej kolumny odejmij drugą wartość od pierwszej wartości26|
: weź mod-26 każdej z tych liczb.≢∪
: znajdź liczbę unikalnych wartości na liście1=
: porównaj to z1
.źródło
J, 19 bajtów
Listy w tej samej pozycji powinny mieć tę samą literę.
Po przekonwertowaniu obu ciągów wejściowych na ich reprezentację punktu kodowego
&(3&u:)
porównujemy1
z długością#
wierzchołka~.
modułu 2626|
różnicy-
dwóch tablic. Nub będzie,1
jeśli wszystkie odległości Cezara są takie same.Stosowanie:
Wypróbuj online tutaj.
źródło
Julia,
918783 bajtówNiegolfowane + wyjaśnienie:
Wykorzystuje to fakt, że ciągi w Julii mogą być traktowane jako tablice znaków, a operacje arytmetyczne można wykonywać na wartościach znaków. Ciągi wejściowe mogą mieć dowolną kombinację wielkich liter, o ile wielkość liter w każdej pozycji jest zgodna między ciągami.
źródło
C99,
92 bajty z błędem10192 bajtyCałkiem proste; zakłada, że słowa są odpowiednio pierwszym i drugim argumentem. Kompilowany z
-std=c99
.źródło
JavaScript ( wersja robocza ES7 ), 87 bajtów
Wymaga, aby dane wejściowe były takie same.
źródło
CJam, 13 bajtów
Wymaga, aby pierwszy znak w każdym słowie był pisany wielkimi literami, a inne małymi.
Wypróbuj tutaj . ( Firefox tutaj .)
Szkoda, że warianty APL nie obsługują arytmetyki postaci ...
Wyjaśnienie
źródło
Perl, 80
Edycja : Nieudana optymalizacja przeszła do kodu golfowego. Teraz pasuje do wersji bez golfa. (Liczba bajtów była jednak poprawna).
Uruchom z Perlem w wersji 5.10 (
perl -M5.10.0
lubperl -E …
) dlasay()
. Lekko rozszerzona wersja:Kod wyprowadza
1
(prawda w Perlu), jeśli ciągi są równoważne Cezarowi, a pusty ciąg (fałsz w Perlu), jeśli nie są. Jeśli jest to zbyt luźna interpretacja, muszę dodać 2 bajty, dlasay$p+0
których drukuje1
lub0
.Wielkość liter musi się zgadzać między wejściami.
źródło
-i
drugiego ciągu, który zapisałby go w zmiennej$^I
. Ponadto użycie-E
zamiast-e
podczas działania w wierszu poleceń zapewni cisay
za darmo, dzięki czemu możesz go używać bez dodawania żadnych bajtów. Spróbuj uruchomić to:perl -iteststring -E'say$^I'
Być może uda ci się to skrócić za pomocą-i
lewy.-i
sztuczka jest fajna (i nie wiedziałem!). W tym przypadku nie sądzę, że to pomaga, ponieważ$^I
jest dłuższe niż<>
.-M5.10.0
. (Ale wspomniałem o-E
przełączniku w edycji)Matlab,
4948 bajtówTo było naprawdę szybkie. Niestety zdobycie sznurka ze standardowego wejścia jest dość drogie.
Zauważ, że podobnie jak większość, jeśli nie wszystkie odpowiedzi, rozróżniana jest wielkość liter.
EDYCJA: odcięto jeden bajt, definiując anonimową funkcję!
źródło
Prolog, 56 bajtów
Nie wszystkie kombinacje przypadków są obsługiwane.
stosowanie
Wypróbuj online tutaj
źródło
C, 97 bajtów
źródło
d
i zadeklarujesza
typ zewnętrzny poza parametrami, takimi jak:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Scala, 57 bajtów
Trochę dłużej niż inne i zasadniczo równoważne, ale jest w innym stylu językowym!
Mam również tę wersję (56 bajtów):
Ale nie wiem, czy działanie x 1 USD jest zbiegiem okoliczności czy z założenia ...
źródło
x$1
działa bezx
definiowania?Python 2, 80 bajtów
Pobiera 2 podobnie napisane ciągi ze standardowego wejścia oddzielone spacją:
Testowany na następujących przypadkach testowych:
źródło
Python 2 -
241237188147 bajtówPobiera dane wejściowe jako małe litery ujęte w cudzysłowy, oddzielone spacjami. Musi być lepszy sposób ...
Niegolfowane (260 bajtów nieparzystych)
źródło
"
s dodatkowych w danych wejściowych.R, 83
84Dosyć podobnie jak inne rozwiązania. Konwertuj ciągi na wektor liczb całkowitych. Zmodyfikuj różnicę wektorów o 26. Wykonaj unikat na liście, sprawdzając, czy długość wynosi 1. Oczekuje, że wielkość liter będzie taka sama w odpowiednich znakach w każdym łańcuchu.
Czeka na wprowadzenie dwóch ciągów
źródło
<2
raczej niż==1
.1
0
Matlab / Octave,
5352Dane wejściowe powinny być w tym samym przypadku.
Niestety Matlab nie radzi sobie dobrze z wprowadzaniem danych przez użytkownika. Jako anonimowy uchwyt może to być tylko 35 bajtów:
Matlab traktuje znaki ciągu jako wektor liczb. Odejmowanie daje nam różnicę i
unique
przekształca ten wektor w wektor zawierający tylko unikalne wartości. Jeśli jest tylko jedna liczba, słowa są równoważne caeser i isscalar zwraca 1, w przeciwnym razie zwróci 0.źródło
bash,
7148Korzystanie ze „standardowego” programu uniksowego
caesar(6)
.Nowa wersja (z dużą pomocą @DigitalTrauma):
1
za prawda lub nic za fałsz.Jeśli dozwolone jest wprowadzanie za pomocą argumentów wiersza poleceń, można je skrócić do 39 bajtów :
Stara wersja rekordu:
źródło
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
Wynik znajduje się we$?
wbudowanej zmiennej, gdzie 0 == FAŁSZ i 1 == PRAWDA, zgodnie ze standardową semantyką powłoki.seq -f | bash
. Wynik w$?
nie jest poprawny przez mój odczyt wyzwania, ale tak jak mój kod, twój nie wyświetla niczego dla fałszu i coś dla prawdy (z wyjątkiem przypadku granicznego dwóch pustych ciągów wejściowych). W każdym razie byłoby to oszustwem, gdybyś użył tego wszystkiego w mojej odpowiedzi, może powinieneś przesłać własne.[ 0 == 0 ] ; echo $?
i[ 0 == 1 ] ; echo $?
> <> (Ryby) , 50 bajtów
Oczekuje, że litery w tej samej pozycji będą miały tę samą wielkość liter.
Wyjaśnienie
i:3b*(?v
wczytuje pierwsze słowo do stosu za pomocą88+0.
zapewniając skok w pętli~ri-&
usuwa~
spację oddzielającą od stosu, odwraca stosr
(pierwsza litera będzie na górze), czyta pierwszą literę drugiego słowai
, oblicza przesunięcie od pierwszej litery pierwszego słowa-
i zapisuje go w rejestrze&
.l?!^i-&:&-2d*%0)?v
odczytuje każdą kolejną literę drugiego słowa odejmując go od odpowiedniej litery pierwszego słowa, która znajduje się na górze stosu, odejmuje przesunięcie&:&-
zapisane w rejestrze i sprawdza, czy wynikiem jest 0 mod 262d*%
. Jeśli nie, drukuje 0 i kończy0n;
.c1.
zapewnia skok pętli.1n;
.źródło
KDB (Q), 35 bajtów
Wyjaśnienie
Test
źródło
Java 281
rozszerzony:
Mógłbym zaoszczędzić 14 bajtów, gdybym pozbył się konwertowania wszystkiego na wielkie litery, ale wydaje mi się, że lepiej jest zostawić to.
źródło
Galaretka , 5 bajtów
Wypróbuj online!
Zwraca dodatnią liczbę całkowitą dla ekwiwalentu, w przeciwnym razie 0
Jak to działa
źródło