Jak pisał George Orwell w 1984 roku :
Napisz program lub funkcję, która pobierze jedno z sześciu głównych słów z cytatu Orwella i wyświetli swój odpowiednik.
Konkretnie:
[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance
Żadne inne pary wejścia / wyjścia nie są wymagane.
Powinieneś założyć, że słowa są zawsze w pełni małe, jak powyżej. Alternatywnie, można założyć, że słowa są zawsze w pełni wielkie litery: WAR -> PEACE
, PEACE -> WAR
, itd.
Najkrótszy kod w bajtach wygrywa.
code-golf
string
kolmogorov-complexity
Hobby Calvina
źródło
źródło
w p f s i
) nie ma nigdzie indziej w żadnym z tych słów. Intrygująca właściwość.Odpowiedzi:
05AB1E , 30 bajtów
05AB1E używa CP-1252 .
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
Proste podejście
ignorance strength war peace freedom slavery
źródło
ignorance strength war peace freedom slavery
Czuję, że brakuje mi kilkunastu kroków!JavaScript (ES6), 80 bajtów
Jak to działa
Używamy małej tabeli przeglądowej opartej na kodzie ASCII drugiego znaku każdego słowa, zwracając indeks jego odpowiednika.
Na marginesie, jeśli dopuszczono mieszaną wielkość liter, użycie
war PEACE FREEDOM slavery IGNORANCE strength
modulo 6 doprowadziłoby do idealnego skrótu.Test
Pokaż fragment kodu
źródło
z
a następnie kompresujesz ciągatob
zapisując 8 bajtów?atob
otrzymujesz ciąg, który jest w większości prawidłowy javascript - ostatecznie musisz uciec tylko `\` i zamykający cytat. Opublikowanie go na tej stronie może być trudne, ale nie unieważnia to odpowiedzi. Zobacz odpowiedź perla napisaną przez smisGalaretka , 24 bajty
Wypróbuj online!
Jak to działa
Najpierw token
indeksuje do słownika Jelly, aby utworzyć ciąg
który
Ḳ
dzieli się na spacje, aby uzyskać tablicę ciągówµ
rozpoczyna nowy, monadyczny łańcuch, z argumentem tej tablicy łańcuchów, który jest również bieżącą wartością zwracaną.ɠ
odczytuje jeden wiersz danych wejściowych ze STDIN ii
znajduje swój indeks poprzedniej wartości zwracanej, tj. wygenerowaną tablicę łańcuchów.Teraz
^1
bierze bitową XOR tego indeksu i 1 . Nawet dla indeksów - należy pamiętać, że indeksy są Jelly 1 opartych i modułowe, więc siła ma indeks 1 i ignorancja ma indeks 6 / 0 - to zwiększa indeks; w przypadku wskaźników nieparzystych zmniejsza je.Na koniec
ị
pobiera ciąg o tym indeksie z argumentu łańcucha.źródło
Mathematica, 84 bajty
Wyjaśnienie
Więcej „arytmetyki” ze sznurkami! Podobnie jak w połączonej odpowiedzi, opiera się to na tym, że można „pomnożyć” ciągi w Mathematica, co pozostawi je bez oceny (podobnie jak pomnożenie dwóch nieprzypisanych zmiennych
x*y
), ale Mathematica zastosuje podstawowe uproszczenia, takie jak czynniki anulujące w podziale.Więc zaczynamy przechowując trzy pary jako produktów
x
,y
,z
odpowiednio i pomnożyć je wszystkie razem:To ocenia na
(Mathematica automatycznie sortuje czynniki, ale nie dbamy o porządek.)
Dzielimy to przez dane wejściowe, aby usunąć słowo, którego nie chcemy
.../#
, ponieważ Mathematica anuluje czynniki. Na przykład, jeśli dane wejściowe"peace"
byłyby zakończone:Wreszcie pozbędziemy par nie jesteśmy zainteresowani, zastępując każdego
x
,y
iz
z1
. Ponownie, uproszczenie Mathematiki jest w tym1*a
zawsze ważnea
. Ta część składa się z:Zaletą jest to, że Mathematica wie, że mnożenie jest
Orderless
tak, że znajdzie to dwa czynniki niezależnie od tego, czy sąsiadują one z produktem, czy nie. Tylko słowo przeciwne do danych wejściowych nie jest już sparowane w produkcie, więc nie można go usunąć i pozostaje ono jedynym wyjściem.źródło
WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&
.WordList
jest fajny. Przyjmowanie listy znaków jako danych wejściowych i zwracanie ciągu wydaje się jednak nieco podejrzane. ;) To powiedziawszy, możesz zrobić 4 bajty lepiejx[[7-Position[x={"war","slavery","ignorance","strength","freedom","peace"},#][[1,1]]]]&
.<|#->#2&~MapThread~{x={"war","slavery","ignorance","strength","freedom","peace"},Reverse@x}|>
dla 94 bajtówVim, 60 bajtów
Wypróbuj online! w kompatybilnym wstecz tłumaczu V.
Oczywiście, gdybyśmy przeszli na V, moglibyśmy zaoszczędzić jeden bajt , używając wygodniejszej metody wprowadzania. Ale ponieważ jest to tak niewielka różnica, wolałbym używać wersji innej niż golfowa.
Wyjaśnienie:
źródło
C (gcc) ,
120107 bajtówMaksymalne nadużycie wskaźnika! Wymaga maszyny little-endian i 64-bitowej długości.
Kod zawiera kilka niedrukowalnych elementów, ale kopiowanie i wklejanie powinno nadal działać.
Wypróbuj online!
źródło
Python, 81 bajtów
Lub o tej samej długości:
źródło
l
jako opcjonalny argument.Perl 6 , 61 bajtów
W przypadku znaków niedrukowalnych pokazanych jako (ponieważ StackExchange usuwa je inaczej):
Oto
xxd
zrzut heksowy:Wersja rozszerzona (znaki niedrukowalne zastąpione sekwencjami ucieczki oraz dodane białe znaki i komentarze):
źródło
Bash ,
100878678 bajtówWypróbuj online!
Druga litera każdego słowa jednoznacznie identyfikuje to słowo, dlatego używam tego znaku jako nazwy zmiennej; wartość tej zmiennej jest odpowiadającym innym słowem.
Na przykład druga litera
peace
toe
, a słowo odpowiadającepeace
towar
, więc ustawiłeme=war
.Biorąc pod uwagę ciąg wejściowy, drugi znak tego ciągu jest używany jako nazwa zmiennej do pobrania pożądanego odpowiedniego słowa, przy użyciu pośredniej interpretacji parametrów bash.
źródło
TI-Basic,
1038477 bajtówZmniejszenie do jednej linijki pozwoliło zaoszczędzić wiele bajtów!Haha, jak ironiczne było to stwierdzenie ...źródło
Perl , 63 bajty
62 bajty +
-p
flaga.Wypróbuj online!
ord
zwraca kod znakowy pierwszego znaku słowa wejściowego.Po tym
%6
mamy:Więc mamy
slavery
istrength
zarówno powrocie 1 (ponieważ oba zaczynają się tą samą literą), a żaden powrocie 2. Stąd dodamy1
dostrength
(to jedyne słowo, które będzie pasować/h/
), a my mamy każde słowo mapowane do indeksu od 0 do 5źródło
R, 86
8792bajtówZmieniono na nienazwanej funkcji i
gsub
dosub
kilku bajtów. Wgrep
określa, które z 3 łańcuchów stosuje się, a wejście jest usuwany z tego łańcucha zsub
.źródło
PHP, 70 bajtów
źródło
Befunge,
8988 bajtówWypróbuj online!
Wyjaśnienie
Zaczynamy od wypchnięcia wszystkich możliwych ciągów wyjściowych na stos, zakończonych zerem. Ta sekwencja jest wykonywana od prawej do lewej, więc wartości są wypychane w odwrotnej kolejności, ponieważ w takiej kolejności postacie będą potrzebne, gdy zostaną ostatecznie wyświetlone.
Następnie odczytujemy pierwsze dwa znaki ze standardowego wejścia, co jest wszystkim, czego potrzebujemy do zidentyfikowania ciągu wejściowego. Jeśli weźmiemy wartość ASCII pierwszej litery mod 2, plus drugiej litery mod 7, otrzymamy unikalny numer z zakresu od 2 do 7.
Liczbę tę można następnie wykorzystać jako rodzaj indeksu na liście ciągów na stosie. Iteracyjnie zmniejszamy indeks (po raz pierwszy o 2) i dla każdej iteracji usuwamy jeden ciąg ze stosu z sekwencją
>_
.Gdy indeks osiągnie zero, zostaje nam prawidłowy ciąg wyjściowy na górze stosu, więc używamy prostej sekwencji wyjściowej ciągu, aby zapisać wynik na standardowe wyjście.
źródło
:-<
i@>:#
„emotikonów” :)Pyke, 29 bajtów
Wypróbuj tutaj!
źródło
C, 93
@ Odpowiedź Arnaulda przeniesiona do C.
źródło
C (gcc) ,
113108 bajtówWszystkie wystąpienia
\0
mogą być zastąpione rzeczywistymi bajtami NUL dla celów oceny.t+*--t-47
jest niezdefiniowanym zachowaniem; to może / nie będzie działać z innymi kompilatorami.Wypróbuj online!
źródło
JavaScript (ES6), 71
78O wiele nudniej niż odpowiedź Arnaulda, ale też krótsza.
Teraz dodałem kodowanie za pomocą
btoa
. W zakodowanym ciągu są 4 bajty, których nie mogę opublikować na tej stronie, nawet jeśli są to prawidłowe znaki w ciągu javascript. Więc użyłem ucieczki heksowej w formularzu\xHH
. Każda z tych ucieczek jest liczona jako 1 bajt.Zakodowany ciąg to
strength0ignorance0peace0war0slavery0freedom
Ten ma 82 lata i nie uwzględnia wielkości liter
Test
źródło
CJam, 52 (tylko ASCII)
Wypróbuj online
Uwaga: znakami spacji są znaki tabulacji (jeden przed i jeden po „EK {”)
Wyjaśnienie:
Część do „+” dekompresuje ciąg „niewolnictwo”, używając konwersji podstawowej:
ciąg (traktowany jako tablica kodów znaków) → (podstawa 144) liczba → (podstawa 26) tablica liczb → (dodając „a” do każdego liczba) ciąg
źródło
> <> (Ryba),
8478 bajtówWypróbuj online!
Zaczynamy pływać od lewego górnego rogu, kierując się w prawo. Najpierw ładujemy stos za pomocą 0. Następnie czytamy pierwszą literę input (
i
), odrzucamy ją (~
), czytamy drugą literę (i
) i zmniejszamy jej wartość ASCII modulo 10 (a%
). Odwzorowuje to odpowiednio a, e, r, l, g it na 7, 1, 4, 8, 3 i 6 - nazwijmy ten numer N..
wyskakuje dwie wartości ze stosu - N i 0 - i przeskakuje do linia N, znak 0.Po skoku ryba wykonuje jeden tik przed wykonaniem instrukcji, więc ignoruje pierwszy znak i płynie przez linię N, która ładuje odpowiednie słowo na stos. Na koniec przechodzimy do linii 2, która wypisuje cały stos i kończy działanie.
źródło
JavaScript, 78 bajtów
Jest to rodzaj portu mojej odpowiedzi w języku Python . Przechowujemy słowa w ciągu, w którym każde znajduje się w przeciwnej pozycji niż jego odpowiednik. Znajdujemy indeks danego słowa
w
i pobieramy go od końca, aby zwrócić wynik.Fragment testowy:
źródło
Pari / GP, 86 bajtów
Pari / GP jest interaktywnym tłumaczem, nie potrzebujemy „print” -cmd do wydruku; jednak narzędzie Try-It_Online potrzebuje „print” -cmd, więc oddzieliłem to do „stopki”.
Definiujemy „funkcję obiektu” (litera O przypomina mi pięknie funkcję Orwella ... ;-)):
Następnie zadzwoń
Wypróbuj online!
(Zauważ, że w Pari / GP podane tutaj tokeny nie są łańcuchami, lecz legalnymi nazwami zmiennych! Do zmiennych tych nigdy nie należy przypisywać żadnej wartości)
źródło
Skumulowane, 70 bajtów
Wypróbuj tutaj! Pobiera dane wejściowe na stosie i pozostawia dane wyjściowe na stosie. Na przykład:
Ten kod jest dość zrozumiały. Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe:
źródło
'LF
zrobić?@x
ustawia zmienną,'...'
jest ciągiem iLF
jest zmienną linefeedJolf, 35 bajtów
Istnieje wiele niedrukowalnych materiałów. Oto zrzut heksowy, choć niewiele zdziała:
Oto link online.
Zasadniczo kod wygląda następująco:
źródło
Właściwie 56 bajtów
Wypróbuj online!
Niestety, bez wbudowanych kompresji, krócej jest nie kompresować łańcucha i ręcznie go dekompresować.
Wyjaśnienie:
źródło
Haskell, 104
111bajtówPomysł:
fromEnum
, przesuń 3 kroki w prawo (moduł 6) i przekonwertuj z powrotem na słowo kluczowe::O
to konieczne, ponieważ wnioskowanie typu ma pewne problemy. Podanief
podpisuf :: O -> O
miałoby ten sam efekt, ale nie jest takie krótkie.Edytować:
Zastąpiony
przez
dzięki @Laikoni.
źródło
f
jest krótsze:f s=toEnum$mod(3+fromEnum s)6
Dyalog APL , 66 bajtów
Albo jeden z tych:
'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞
używa tej metody (wymaga⎕IO←0
ustawień domyślnych w wielu systemach).'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞
wykonuje wyszukiwanie, a następnie wybiera odpowiedni element z odwróconej listy.źródło
Qbasic,
13899 bajtówD$
przechowuje wszystkie słowa z lewej strony mantry, a następnie wszystkie słowa z prawej strony. Każde słowo jest wypełnione spacjami do dokładnie 9 liter na słowo.D$
następnie dołącza się do siebie.Następnie
instr
służy do znalezienia indeksu słowa wprowadzonego przez użytkownika. Druga część mantry jest zawsze przechowywana dokładnie 9 * 3 pozycji dalej w łańcuchu, więc drukujemy podłańcuch zaczynając od tej pozycji, przyjmując 9 znaków.źródło
SmileBASIC, 92 bajty
źródło
Python , 80 bajtów
W jakiś sposób wygrał z Xnorem!
Jest to nienazwana funkcja lambda, która zwraca wynik.
Wypróbuj online!
Lista słów jest ułożona w taki sposób, że każde z nich znajduje się w przeciwnej pozycji do swojego odpowiednika. Biorąc pod uwagę słowo
w
, znajdujemy jego indeks na liście słów, a następnie bitowo NIE (~
). Odwraca to wszystkie bity, które są obliczanen => -n-1
. Z powodu ujemnego indeksowania Pythona uzyskuje przeciwny indeks na liście.Jako rodzaj niezamierzonej premii, możesz przekazać dowolną listę wyrazów przeciwieństw do tej funkcji jako drugi argument.
źródło