To wyzwanie jest zasadniczo identyczne z tym z tą tylko różnicą: teraz można tasować litery w dowolnym miejscu ciągu.
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" -> "EEWOOHRNTET"
)
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.Litery można tasować w dowolnym miejscu ciągu.- 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
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(dzięki, ETHproductions!)
źródło
"ONEWESTV" -> 27
(zawiera liczbę, która tak naprawdę się nie pojawia)Odpowiedzi:
Python 2 , 123 bajty
Pełny program pobierający cytowane dane i wypisujący numer Johna.
Wypróbuj online! lub zobacz zestaw testowy
W jaki sposób?
Pracujmy z przykładem „NEONSEXTOWNII” (aby uzyskać 1269, i być nieco Leisure Suite Larry -esque!)
Najpierw
c=map(input().count,"OWHUFXSGIQ")
pobiera dane wejściowe i liczy liczbę każdego zOWHUFXSGIQ
nich - są to litery, które pojawiają się w każdej liczbie w porządku rosnącym, przy czym 2,4,6 i 8 mają „własne” litery (WUXG
) oraz dodatkową literę,Q
aby dodać zero do końca i wyrównaj długość wynikowej listy. Na przykład:Wpisy 1, 3, 5, 7 i 9 wymagają dostosowania, aby poprawić liczebność pozostałych liter. Jest to wykonywane przez następną pętlę:
Zauważ, że wpisy do dostosowania są naprzemiennymi (1,3,5,7,9,1,3,5, ...), więc możemy dodać dwa do zmiennej indeksu na każdym kroku i modulo o 10, aby pozostać w zasięg, jeśli musimy przejść więcej niż jeden raz (co robimy). Aby zaoszczędzić niektóre bajty, możemy zwiększyć o jeden i modulo o 5 i użyć podwójnego indeksu.
Ponieważ korekty dla 9 wymagają najwięcej pracy, zaczynamy od tego - znajduje się ona w indeksie 8, więc zaczynamy od
i=4
. Łańcuch"71735539994"
podaje następnie indeksyj
wartości, które należy usunąć na każdym etapie (gdzie zapewniliśmy, że dziewiąty indeks będzie zawierał zero przy użyciu"Q"
podczas tworzeniac
);c[i*2]-=c[int(j)]
wykonuje każdy indywidualny regulację ii=-~i%5
przenosii
do następnego wskaźnika (gdzie-~i
jest-(-1-i)
lubi+1
zapisywanie nawiasach(i+1)%5
) utrzymująci*2
w granicachc
.W ten sposób najpierw odejmujemy liczbę w indeksie
j=7
od liczby w indeksiei*2=8
, odejmując liczbę „G” zliczoną od liczby „I”, dostosowując odliczanie „NINE” o (poprawną) liczbę „Ośmiu” ( który ma również „I”). Następnie przechodzimy doi=0
(-~4%5 = (4+1)%5 = 0
), odwołując się do indeksu,i*2 = 0
który jest dla „JEDNEJ”, i odejmujemy wartość znalezioną przy indeksiej=1
wpisu zliczającego „W”, a zatem „DWIE”, dostosowując liczbę „O” w dół. Pod koniec pętli mamy poprawione liczby:więc pozostaje tylko wydrukować to, co
c
teraz reprezentuje (1269
).i
jest teraz z powrotem na0
, więc zwiększamy go na początku pętli i używamy jako naszej cyfry:Tylne tiki,
`i`
są skrótem Python2, dlarepr(i)
którego pobiera ciąg znaków reprezentujący obiekt (dany znak cyfry jako ciąg) i pomnożenie łańcucha przez liczbę tworzy nowy ciąg z wielu powtórzeń (tutaj pokazujemy tylkon=0
odwrócenie`i`
od powiedz"5"
do""
in=1
obracając utrzymanie powiedzenia"6"
jak"6"
, ale działa również dla większych liczb całkowitych dodatnich, więc"3"*4
staje się"3333"
na przykład).źródło
05AB1E , 31 bajtów
Wypróbuj online!
Wyjaśnienie
Bardzo nieefektywny przy dużych nakładach.
źródło
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: czy możesz trochę wyjaśnić, staram się zrozumieć, w jaki sposób można wygenerować dowolny ciąg.‘
ogranicza skompresowany ciąg wielkich liter słów oddzielonych spacjami.Z
środkiZ
. Wszystkie pozostałe pary 2-symbolowe oznaczają skompresowane słowo ze słownika 05AB1E . Na przykład€µ
tłumaczy się jakoONE
.2419
. Symbole musimy są symbole, które są następnie24
i19
w Dokumentach . W naszym przypadku jest to24=Ÿ
i19=™
takHELLO
byłoby‘Ÿ™‘
Retina ,
11297 bajtówWypróbuj online!
-12 bajtów dzięki @Neil
-3 bajty przy użyciu klas L znaków w transpozycji
Jak to działa
Zasadniczo polega to na tym, że litery są używane tylko w niektórych nazwach numerów. Na przykład
SIX
jest jedyną nazwą zawierającąX
. Staje się to trudniejsze z uwagi na fakt, że niektóre słowa nakładają się na litery, na przykład obaFIVE
iSEVEN
za pomocąV
. Można to poprawić, identyfikując sięFIVE
zF(.*)V
.źródło
GH
iNO
będą przylegać, z wyjątkiem wszelkich poprzednich8
lub1
wcześniejszej zmiany ...}`GH
8
może zadziałałoby8
-}
spowodowałoby to, że postacie zostałyby ponownie posortowane, w ten sposób umieszczając wszystkie pozostałeG
iH
razem.NO -> 1
, co było wygodne.Kotlin 1.1 ,
359352331327325 bajtówZgłoszenie
Nie działa na TryItOnline, ponieważ Kotlin 1.1 nie jest obsługiwany
Test
Logika
Użyłem powyższego arkusza, aby znaleźć najprostszy sposób rozwiązania każdej litery
Edycje
źródło
var s=""
ireturn s
dor=""
ireturn r
poprzez ponowne wykorzystanie wejścia-String, które nie są już potrzebne w tym punkcie? Nigdy wcześniej nie programowałem w Kotlinie, więc być może mówię tu bzdury. ; pfinal
domyślnie. Hmm, jeszcze jedna rzecz, w którą możesz grać w golfa: umieśćvar s=""
pierwszą metodę i zastąpval f=r.split("").
jąval f=r.split(s).
. Znów nie mam pojęcia, czy to działa. Szkoda, że TIO nie obsługuje jeszcze wersji 1.1, w przeciwnym razie sam bym wypróbował te sugestie, zanimGalaretka , 37 bajtów
Wypróbuj online!
-1 dzięki Jonathan Allan .
źródło
NINEFIVE
,THREEFIVE
). Czy to błąd, czy kod jest po prostu nieefektywny?Œ!
oznacza „permutacje”)...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 bajtówObjaśnienie kodu:
-14 Dzięki Olivier Grégoire
źródło
Java 8,
346345344336327 bajtówWypróbuj tutaj.
Ogólne wyjaśnienie:
Patrzyłem na występowanie każdego znaku w alfabecie:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(odejmującF=5
).O=1; N=9
.N
ma dwa wystąpieniaNINE
, musiałem zrobić dodatkowy-1
dla każdego wystąpieniaN
, więc użyłemI=9
zamiast tego (odejmując trzy poprzednie dopasowania zamiast dwóch).Objaśnienie kodu:
źródło
Perl 5 , 100 bajtów
Kod 99 bajtów + 1 bajt dla
-n
przełącznika.Wypróbuj online!
źródło
Python 3 , 225 bajtów
Wypróbuj online!
Prosto: najpierw usuń cyfry oznaczone konkretną literą.
źródło
Python 3 , 125 bajtów
Wypróbuj online!
Po przeczytaniu powiązanego wyzwania zdałem sobie sprawę, że jest to odmiana rozwiązania Python firmy mdahmoune , które samo opiera się na rozwiązaniu ES6 Draco18s , ale hej, przynajmniej straciliśmy dwa bajty.
Podobnie jak to rozwiązanie, obliczamy odpowiedź poprzez liniową kombinację liczby wystąpień niektórych liter. Krótko kodujemy kombinacje liniowe, pisząc je jako słowa, do których należy dodać dwie pierwsze litery, a następnie wszystko odjąć. Czasami potrzebna jest postać do wypełnienia pierwszych dwóch znaków; używamy tego, aby ukryć cyfrę, którą chcemy wyprowadzić (która nigdy nie pojawi się na wejściu, więc nie wpłynie na nasz algorytm), którą wyodrębniamy
min
.źródło
R, 154
Wypróbuj online!
źródło
Aksjomat, 351 bajtów
niepomentowane wyniki
źródło