Wytyczne
Scenariusz
John ma ważną liczbę i nie chce, aby inni ją widzieli.
Postanowił zaszyfrować numer, wykonując następujące czynności:
Jego liczba jest zawsze ciągiem malejącym (tj. "1123"
)
Przekształcił każdą cyfrę w angielskie słowa. (tj. "123" -> "ONETWOTHREE"
)
A następnie, losowo ułóż litery. (tj. "ONETWOTHREE" -> "ENOWTOHEETR"
)
John czuł, że jego liczba jest w tym bezpieczna. W rzeczywistości takie szyfrowanie można łatwo odszyfrować :(
Zadanie
Biorąc pod uwagę zaszyfrowane ciągi, Twoim zadaniem jest odszyfrowanie go i zwrócenie oryginalnego numeru.
Zasady
- To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach
- Możesz założyć, że ciąg wejściowy jest zawsze poprawny
- Łańcuch wejściowy zawiera tylko wielkie litery
- Oryginalne numery są zawsze ułożone w porządku rosnącym
- Możesz zwrócić liczbę w formacie ciągu lub liczby całkowitej
- Litery będą tasowane tylko między jednym słowem, a nie między całym ciągiem.
- Liczby będą tylko od 1 do 9 włącznie (
ONE
doNINE
)
Możliwy nieszyfrowany ciąg
Oto lista ciągów zaraz po ich przekonwertowaniu na ciągi z liczb:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Przykłady
"NEO" -> 1
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
code-golf
permutations
algorithm
Amorris
źródło
źródło
Odpowiedzi:
Galaretka ,
3837 bajtówMonadyczny link pobierający listę znaków (ciąg znaków) i zwracający liczbę całkowitą.
Wypróbuj online!
Używa bardzo różne metody do Pietu1998 za Jelly odpowiedź ,
ale ma taką samą liczbę bajtów(I rzeczywiście, że możeto nie skończyć jako mniej)!Nie opiera się na monotoniczności pierwotnego numeru (więc wejście
HTREEWTONOE
mogłoby działać na przykład).W jaki sposób?
Najpierw zauważ, że same słowa (a zatem i wszelkie ich anagramy) można zmienić na te o długości 4, usuwając dowolne R, G i S i zastępując dowolne OS dwoma znakami (powiedz „12”) i dowolnymi X trzema znakami ( powiedz „345”).
Następnie możemy odwzorować iloczyn porządkowy tych znaków na liczby od 1 do 9, stosując arytmetykę modulo, w zależności od naszego wyboru („12345”), a następnie wyszukać je na uporządkowanej liście cyfr. Kod faktycznie najpierw rzutuje na znaki, a następnie zastępuje liczby porządkowe, ale jest również możliwe w 37 bajtach ze znakami, np. „DIAAE” ( spróbuj ).
źródło
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 bajtów-4 bajty: po całym tym golfie zapomniałem wprowadzić zmienną jednorazowego użytku. Pierdnięcie mózgu.
-2 bajty: Wcięcie w podwójnych odstępach → wcięcie w pojedynczej tabulacji (dzięki Coty Johnathan Saxman); zwróć uwagę, że nie wyświetla się to poprawnie w odpowiedzi.
Ungolfed (kompatybilny z python 3):
Wyszukiwarka liczb magicznych:
Wyjaśnienie:
Miałem wrażenie, że mogę zmiażdżyć bity ASCII i podsumować je w jakiś sposób, aby ustalić, kiedy mam pełne słowo. Początkowo próbowałem zadzierać z
3**ord(letter)
oczekiwanymi wynikami i porównywać je, ale przyniosło to bardzo duże liczby. Wydawało mi się, że byłoby właściwe, aby nieco brutalnie wymusić niektóre parametry, a mianowicie moduł (aby upewnić się, że liczby są małe) i mnożnik, aby rozproszyć liczby w różny sposób w całym zakresie modułu.Ostatecznie zmieniłem zmienną mnożnika na zmienną wpływającą na samą moc, ponieważ (z prób i błędów), która w jakiś sposób dała mi nieco krótszą odpowiedź golfową.
A powyżej widać wyniki tego brutalnego forsowania i trochę ręcznego grania w golfa.
Pierwotnym powodem wyboru
3**x
jest to, że wiedziałem, że możesz reprezentować każdą liczbę. Najbardziej powtarzającymi się cyframi, które miała dowolna liczba, są dwie (thrEE, sEvEn, NiNe itp.), Więc postanowiłem pomyśleć o każdym wejściu jako o liczbie 3. W ten sposób mogłem (mentalnie) przedstawić je jako coś w rodzaju10100000000010020000
(trzy; 1 wt
gnieździe, 1 wr
gnieździe, 1 wh
gnieździe i 2 we
gnieździe). Każda liczba w ten sposób otrzymuje unikalną reprezentację, którą można łatwo poskładać, iterując ciąg znaków i sumując niektóre liczby, i kończy się to niezależnie od rzeczywistej kolejności liter. Oczywiście nie okazało się to idealnym rozwiązaniem, ale obecne rozwiązanie wciąż jest napisane z myślą o tym pomyśle.źródło
\x83
,\x8e
oraz\x92
w ciągu.SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
. Działa, jeśli umieszczę tamcoding
komentarz, ale zyskuje 15 dodatkowych bajtów.Python 2 ,
131127 bajtówWypróbuj online!
Na podstawie poprawionej wersji rozwiązania JavaScript Draco18s .
źródło
vars
!PHP , 164 bajty
Wypróbuj online!
PHP , 179 bajtów
w oparciu o poprzednie podejście najpierw sprawdź liczby parzyste, a następnie nieparzyste w porządku rosnącym
Wypróbuj online!
PHP , 201 bajtów
Wypróbuj online!
źródło
ENOOWTWTOWOT
$i++<9
i$i
zamiast$i<10
i++$i
(-1 bajt);_405162738[$i]
zamiast$i%2?$i/2+4:$i/2-1
(-4 bajtów) (też$i/2+~($i%2*-5)
by działało, ale to jest o jeden bajt dłużej.)JavaScript (ES6),
288150144 bajtówDłuższy niż
pozostałe dwainne wpisy JS, ale pomyślałem, że rzuciłbym ciekawe podejście, które może zadziałać dla kogoś w innym języku.Zasadniczo możemy ustalić, co następuje:
Wystąpienie tych liter oznacza, że cyfra istnieje w pierwotnym numerze. Stąd możemy wywnioskować resztę cyfr:
W tym dwa skomplikowane przypadki:
Zarówno
1
i9
obszar Hard stosunkowo. W JEDNYM,E
pojawia się więcej niż raz w niektórych słowach (SEVEN
ma dwa) tak jak robiN
(NINE
), więc utknęliśmy w sprawdzaniu,O
które zdarzenie występuje w dwóch innych miejscach, na szczęście oba są proste.Dla NINE dziewięć jest trudne, bez względu na to, jak je pokroisz.
W ten sposób otrzymujemy tę mapę:
9 jest w stanie odwoływać się do siX, eiGht i Five (z 5 foUr odwołań wstecznych) za pomocą zmiennych przypisań, oszczędzając bajty. Dzięki Neilowi do tego wykorzystuje kilka cech JS, z którymi jestem bardzo obcy (na przykład tyknięcia wstecz przy rozbieraniu
('
na pół) i faktycznie zbliża się znacznie do pomysłu, który naszkicowałem na papierze, zanim spróbowałem go zakodować (Zostawiłem 9 jako „to, co zostało”, myśląc o tym jako „jeśli widzę, żeX
mogę to usunąć i anS
iI
z łańcucha, a następnie ...”, tak że po czterech prostych przypadkach kolejne 3 stałyby się prosty).Powodem tego, że ten wpis jest interesujący jest to, że może on obsługiwać dowolny tasowany ciąg jako dane wejściowe. tzn. zamiast tasowania pojedynczych słów, możemy przetasować cały ciąg znaków, co moim zdaniem pierwotnie robił John:
źródło
s.split(t).length-1
, 2 bajty za pomocąs.repeat(n>0&&n)
(dlaczego w każdym razie n jest mniejsze od zera? Zapisuje 7 bajtów). Zaoszczędź kilka bajtów, deklarującg
w zakresies
, abyś nie musiał ciągle go przekazywać, a jeszcze lepiej, aby był to szablon otagowany, który oszczędza w sumie 55 bajtów (przed 9 poprawkami). Zapisz się więcej bajtów, zapisując powtarzających się wartości w tymczasowych i Ogoliłem kilku bardziej wyłączyć za pomocąmap
:s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
.Mathematica, 133 bajty
wkład
wydajność
źródło
c@#[[i]]
zamiastc[#[[i]]]
? Możesz być w stanie zapisać kolejny bajt przy użyciu składni infix~
naTable
.C #, 218 bajtów
Krótka wersja:
Wersja rozszerzona:
Wypróbuj ONLINE!
Będąc moim pierwszym wpisem nie jestem pewien co do zasad ... Liczę tylko rozmiar klasy użytej do deszyfrowania, a nie kod, który to testuje, prawda?
Edytować
A dla zabawy - oto, co zacząłem robić, nie czytając pełnych zasad: S - Zobacz to w IdeOne . Odszyfrowuje, nawet jeśli znaki z jednej cyfry można zaszyfrować w dowolnym miejscu ciągu.
Edytuj 2
Skrócono zgodnie ze wskazówkami TheLethalCoder. Dzięki!
Edytuj 3
A teraz Tytus ogolił się z jeszcze kilku bajtów. Dzięki!
źródło
public static
. Możesz przekonwertować na anonimową metodę, taką jaks=>{<do stuff>return"";}
. Możesz użyćvar
kilka razy, deklarowanie razem zmiennych oszczędza bajty tjint i=1,j;
. Tworzenie tablicy z łańcucha i dzielenie na nią jest zwykle krótsze (chociaż w tym przypadku nie sprawdziłem), tj"ONE|TWO".Split('|')
. Możesz użyć<0
zamiast==-1
s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
JavaScript (ES6),
142139 bajtówZaoszczędzono 3 bajty dzięki Neilowi .
Obecnie nie korzysta z liczb, zawsze są ułożone w porządku rosnącym
źródło
"axbxc".split`x`.join``
. Jak to się nazywa? Nie mogę znaleźć niczego w Google.split
ijoin
x=`foo${5+5}bar`
), Są otagowane, gdy wywołujesz funkcję, używając ich bez parens:foo`foo${5+5}bar`
co jest tym samym, cofoo(['foo','bar'], 10)
f(s.slice(y))
jest zawsze ciągiem, więc nie potrzebujesz''+
go wcześniej.Galaretka , 38 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
"EIGHTNINE"
:)3
z2.2
korzystania mniejsza górna granica, która pozwala łatwo obliczyć 789 bez zmiany zasady pracy.2
byłoby fajnie, ale dla niektórych danych wejściowych z dużą liczbą szóstek ledwo by to nie zawiodło.JavaScript (ES6), 221 bajtów
Przykładowy fragment kodu:
źródło
Siatkówka , 160 bajtów
Wypróbuj online! Luźno oparty na odpowiedzi PowerShell @ TessellatingHeckler.
źródło
Siatkówka , 88 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
PowerShell , 182 bajty
Wypróbuj online!
Nieskluczony, ale niedziałający kod:
np.
(?<3>[THRE]{5})
dopasowuje klasę znakówTHRE
, aby mogła dopasować je w kolejności i musi dopasować dowolną z tych postaci pięć razy obok siebie, a grupa przechwytywania nosi nazwę „3”, aby odwzorować nazwy za pomocą liczb.Prymitywna kompresja poprzez zamianę powtarzającego się tekstu
})|(?<
na az
.źródło
C ++,
296, 288 bajtówKrótka wersja:
Pełna wersja:
Wypróbuj ONLINE!
Edycja:
1) 200-> 296 bajtów, w celu włączenia przestrzeni nazw i definicji N do liczby, jak sugeruje orlp 2) 296-> 288, za użycie makra, dzięki Zacharý
źródło
N
iusing namespace std;
do swojej liczby bajtów.Q
zaraz po niej, bez żadnych innych dodatków.Rubin,
138114110 bajtówLiczba bajtów obejmuje 1 bajt dla
-p
opcji.Co?
To:
jest literałem wyrażenia regularnego, które poprzez interpolację łańcuchów zwraca:
Jeśli przypiszemy to do
regex
, resztę kodu można nieco uchwycić: Każde dopasowanie na wejściu jest zastępowane numerem grupy przechwytywania, wyodrębnionej z magicznej zmiennej$~
zawierającej bieżące dane dopasowania:Wypróbuj online!
źródło
Java 8,
198256 bajtów+58 bajtów .. z powodu regexu poprzedniej wersji, która nie działała poprawnie (pasowało również do „EEE”; „EEN”; itp.)
Wyjaśnienie:
Wypróbuj tutaj.
źródło
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
jest to, że pasuje on równieżEEN
na końcu tego przypadku testowego do części ósmej i dziewiątej. I wątpię, czy istnieje regex pasujący do tych wszystkich:ENO|EON|NEO|NOE|OEN|ONE
bez dopasowaniaEEE;EEN;EEO;...
dla wszystkich liczb krótszych niż 40 bajtów .. Może mogę coś zrobić, używającsubstring
i odwracając sprawdzanie liczb, ale tak naprawdę nie mam teraz czasu, aby to rozgryźć.Java (OpenJDK 8) , 181 bajtów
Wypróbuj online!
Pozwoliłem sobie ponownie wykorzystać szablon TIO Kevina Cruyssena . Mam nadzieję, że nie masz nic przeciwko;)
źródło
s.substring
. Najgorsze jest to, że używams.substring
w mojej obecnej odpowiedzi, lol .. Ach cóż, +1 ode mnie. Cieszę się, że już prawie weekend ..05AB1E ,
3631 bajtówWypróbuj online!
Zobacz, jak działa z debugowaniem: TIO z debugowaniem
źródło
FURONESEV
zwracaFUR1SEV
:(Perl 5 , 102 + 1 (-n) = 103 bajty
Wypróbuj online!
źródło
map{...}
często może być zastąpionymap...,
,length
iy///c
są zazwyczaj wymienne zbyt (nie zawsze mniejsza, gdy nie działa on$_
jednak!), Zamiastwhile
,++$,x s/^$i//
jest krótszy, a jeśli zmieni-n
się-p
można dołączyć do `$ \` zamiast dzwonićprint
! Wypróbuj online!Python 3 ,
238236 bajtówWypróbuj online!
Rozwiązanie brute-force, nie wykorzystuje niemniejszalności cyfr.
Dzięki @Mr. Xcoder do zapisywania 2 bajtów!
źródło
def f(s):
w swojej liczbie bajtów, to nie jest funkcja anonimowawhile len(s)>0
zwhile len(s)
e
do nagłówka funkcji dla -1 bajtu. Ponadtoexec
wyrazy listy mogą zaoszczędzić bajty przy wcięciach.PHP, 141 bajtów
starsza wersja, 151 bajtów :
zapętla cyfry od 1 do 9, licząc niepowtarzalne znaki w słowie i odejmując liczbę znaków nie unikatowych, drukując cyfrę w drodze.
Mimo że drukowanie odbywa się w drodze, liczba cyfr musi być zapisana, aby
9
obudowa mogła działać.Uruchom jako potok z
-nR
lub spróbuj online .Zaoszczędziłoby to 4 dodatkowe bajty do przechowywania liczby cyfr
$a[$i]
zamiast$a[$i+48]
i używania ASCII1
i7
(w cudzysłowach) zamiast samych znaków cyfr.awaria
ONE
nie jest jedynym słowem zO
, więc musi odjąć liczbę dlaW
(tylko pojawia się wTWO
) iU
(tylko pojawia się wFOUR
) i tak dalej.NINE
jest wyjątkowy, ponieważ nie ma sposobu, aby po prostu odjąć, jeśli użyłem liter (wymagałoby toI-X-G-F+U
lubN-O-S+W+U+X
), więc zamiast tego używam liczb.PHP, 160 bajtów
zakłada wszystkie duże litery; postacie mogą być wszędzie zakodowane.
Uruchom jako potok z
-nR
lub spróbuj online .wyjaśnienie
zapętla słowa cyfrowe, licząc wystąpienia ich unikalnych znaków na wejściu oraz w procesie zmniejszając liczbę innych znaków. „Inne znaki” mogą oznaczać wszystkie inne znaki w słowie; ale tylko biorąc pod uwagę te, które będą potrzebne później zaoszczędzono 19 bajtów.
Przekształcenie
str_repeat
pętli w pętlę łączoną pozwoliło zaoszczędzić 5 bajtów.A użycie zmiennych zmiennych do liczby cyfr pozwoliło zaoszczędzić kolejne 8.
awaria
źródło