To zadanie jest dość proste i wykorzystuje trzy różne znaki „operatora”. Twoim zadaniem jest, biorąc pod uwagę prostą sekwencję liter, należy wykonać następujące czynności, aby zakodować za pomocą <
, >
, *
. Możesz wybrać użycie wielkich lub małych liter, nie musisz obsługiwać obu.
Wyjaśnienie szyfru
Szyfr jest prosty, używasz operacji inkrementacji i dekrementacji, aby przechodzić od litery 1 do litery końcowej, *
będąc funkcją „wysyłania”. Operatorem „inkrementacji” będzie >
i „decrement” będzie <
.
Przykład z użyciem słowa adbc
:
- Zacznij od pierwszej litery słowa, wypisz tę literę.
a
- Następnie użyj
>
i<
(jak pieprzenie mózgu), aby „nawigować” bieżącą literę do następnej.a>
spowodowałoby „podniesienie”a
o 1 do literyb
.a<
spowodowałobyz
to, że obniżasz literę (jest ona zawijana, zawsze musisz wybrać kierunek, w wyniku czego NAJMNIEJ liczba operacji). - Po wypisaniu poprawnej zminimalizowanej kombinacji
<
i wypisanie>
a*
oznacza, że osiągnęliśmy następną literę.
Kroki do zakodowania adbc
to:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Przykłady
Kroki do zakodowania aza
to:
a # a
a<* # az
a<*>* # aza
Więcej przykładów:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Zasady
- Jesteśmy kodowania nie dekodowania, więc nie bałagan że up.
- Możesz założyć, że wiadomość będzie zawierać litery
[A-Z]
lub[a-z]
twój wybór. - Możesz użyć dowolnego nieliterowego / numerycznego / zarezerwowanego znaku do oznaczenia
*
(EG$
). - Musisz mieć zakończenie
*
, nie ma to miejsca na powtórzenia. - Możesz założyć, że nie ma pustych łańcuchów, ale możliwy jest pojedynczy znak.
- Jeśli jest w jednakowej odległości do następnej litery, możesz wybrać kierunek.
- To jest golf golfowy , wygrana o najniższej liczbie bajtów.
Proszę wyjaśnić swoją odpowiedź, pomaga to innym w nauce w ten sposób.
abcdefghijklmnopqrstuvwxyz
i nie jest własnym wkładem?zl
powinienem użyć>
.alphabet
jest moim zdaniema>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
izl
powinien byćz>>>>>>>>>>>>*
ibanana
powinien istnieć drugie rozwiązanieb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @ jorg dobre połowy, naprawione wszystkie, były wysiłkiem ręcznym.Odpowiedzi:
Galaretka , 17 bajtów
Używa spacji zamiast
*
(spacja⁶
lub nowa linia⁷
, zapisuje jeden bajt”*
).Działa z każdym wielkie wyłącznie lub małymi literami tylko.
Wypróbuj online! lub zobacz zestaw testowy (gdzie te miejsca są zastępowane przez
*
dla ułatwienia czytania).W jaki sposób?
źródło
Kod maszynowy 8086,
70 6867 bajtówJak to działa:
źródło
Python 3 , 87 bajtów
Wypróbuj online!
Działa z małymi lub dużymi literami.
Program buduje ciąg wyjściowy
r
podczas iteracji znaków w ciągu wejściowym. Przechowuje poprzedni znak jakop
i oblicza operację zwiększania, aby przejść odp
nowej postacic
.Odstęp między znakami wynosi
ord(c)-ord(p)
i wynosi(ord(c)-ord(p)-13)%26-13
modulo 26 do przedziału[-13..12]
. Wynik ujemny oznacza, że krócej jest go obniżyć, a wynik dodatni oznacza, że trzeba go zwiększyć. To musi być przekonwertowane na ciąg>
lub w<
zależności od znaku. Zamiast używaćabs
warunkowego lub warunkowego, korzystamy z mnożenia ciągów Pythona,s*n
dając pusty ciąg, gdyn
jest ujemny. W wyrażeniu'<'*-d+'>'*d
źle podpisana część nie ma znaczenia.Stan początkowy jest obsługiwany przez podzielenie danych wejściowych na pierwszy znak, a resztę za pomocą rozpakowywania Pythona 3
r,*s=input()
. Początkowy znak służy do rozpoczęcia budowy łańcucha, a także początkowego „poprzedniego” znaku.Podziękowania dla ovs za zasugerowanie przejścia na Python 3 w celu rozpakowania.
źródło
Python 3 ,
11093 bajtyWypróbuj online!
źródło
JavaScript (ES6),
118109107 bajtówŁańcuch wejściowy nie rozróżnia wielkości liter.
Jak to działa
W przeciwieństwie do Pythona, operator modulo JS zwraca liczbę mającą ten sam znak co dywidenda, a nie dzielnik. Ponadto
repeat()
metoda JS generuje błąd, gdy otrzymuje liczbę ujemną, zamiast zwracania pustego ciągu (i tak jest znacznie dłuższy niż zwykły*
).Są to raczej niekorzystne zachowania dla tego wyzwania. Lepiej więc zidentyfikujmy konkretny przypadek, zamiast polegać na matematycznych sztuczkach. (Co nie znaczy, że takie sztuczki nie istnieją, ale raczej, że ich nie znalazłem.)
Poniżej znajduje się tabela opisująca 4 możliwe przypadki, gdzie
d
jest podpisana odległość między obecną postacią a poprzednią:Przypadki testowe
Pokaż fragment kodu
źródło
PHP, 127 bajtów
Przypadki testowe
PHP, 137 bajtów
Przypadki testowe
źródło
JavaScript (ES6),
111103 bajtówOryginalna wersja, która zajęła 111 bajtów, zanim dostosowałem sztuczkę @ Arnaulda do ustawiania
n
podczas obliczeńp
, myślę, że prawdopodobnie jest to inna sztuczkas
zamiast,n
ale robi się późno, więc nie będę się tym przejmować:źródło
Haskell (lambdabot),
161153 bajtówWypróbuj online!
Wyjaśnienie:
źródło
EXCEL VBA 130 bajtów
Uruchom go z okna Excel VBA Natychmiastowe.
Wyjaśnienie:
Prosta pętla, która z funkcją String może powtarzać „>” lub „<” n liczbę razy, gdzie n jest różnicą ascii między ciągiem znaków i i + 1.
źródło
Java 7-, 232 bajty
Prawie trywialne rozwiązanie. Nie golfił i skomentował:
źródło
C, 170 bajtów
Szczegółowe na żywo
źródło
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 113 bajtówPoszedłem inną drogą do innych rozwiązań JS, ale nie wyszło to zbyt dobrze - oto co mam do tej pory:
Oryginał, 131 bajtów
Pokaż fragment kodu
źródło
([x,...s])=>x+s.map(...)
oszczędza 12 bajtów. Pamiętaj, że powinieneś również dołączyć znak na końcu. Sugeruję użycie liczby, która`1`+1
zamiast kosztuje tylko 2 bajty`*`
.join
skutkowałoby niepoprawnym wyjściem dla pojedynczych liter. Jednak przeniesienie znaku do wydruku w ramach tejmap
metody kosztuje tylko 1 bajt.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
za 111 bajtówreduce
, ale okazało się, że to 115 bajtów.C ++,
210190 bajtówMoja pierwsza próba gry w golfa!
k przechowuje, które z <,> lub * do wydrukowania. Najpierw po prostu drukuje pierwszy element tablicy, a następnie uruchamia pętlę od pierwszego do ostatniego elementu tablicy. j przechowuje poprzedni element, a następnie porównując, czy j bliżej * a przez <lub> ustaw odpowiednio k na <,>, a następnie wypisz k, a następnie uruchom tę pętlę, aż j stanie się równe p. Następnie po każdym zakończeniu drugiego wydruku w pętli *.
źródło
*p!=0
można go zastąpić*p
. Jestem pewien, że przestrzeń w tym miejscuchar *a
jest również niepotrzebna. Potrzebny będzie również do#include <iostream>
iusing namespace std;
(chociaż myślę, że to może być tańsze tylko dodaćstd::
), aby ta pełna odpowiedź.std::
lubusing namespace std;
Prawdopodobnie będziesz również potrzebować#include <iostream>
w swojej liczbie bajtów.05AB1E , 17 bajtów
Wypróbuj online!
Wyjaśnienie
Zastosowania
>
,<
oraz<space>
do określenia przyrostu , ubytku , przedkładaźródło
Haskell ,
167168126 bajtówTeraz za pomocą rozwiązania arytmetycznego xnor. Wywołaj z
e str
gdziestr :: String
jest ciąg znaków do zakodowania.źródło
Haskell , 109 bajtów
Wypróbuj online! Wykorzystuje podejście xnor . Zadzwoń z
f "somestring"
.źródło