c=map(input().count,"OWHUFXSGIQ")
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
s=""
for n in c:i+=1;s+=`i`*n
print s
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 z OWHUFXSGIQnich - 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ę, Qaby dodać zero do końca i wyrównaj długość wynikowej listy. Na przykład:
[2,1,0,0,0,1,1,0,2,0] <- c
O W H U F X S G I Q <- is the counts of these letters
1 2 3 4 5 6 7 8 9 0 <- which "relate to" these digits in John's number
2 4 6 8 0 <- these will be correct as the letters are unique to their words
Wpisy 1, 3, 5, 7 i 9 wymagają dostosowania, aby poprawić liczebność pozostałych liter. Jest to wykonywane przez następną pętlę:
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
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 indeksy jwartoś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 tworzenia c); c[i*2]-=c[int(j)]wykonuje każdy indywidualny regulację i i=-~i%5przenosi ido następnego wskaźnika (gdzie -~ijest -(-1-i)lub i+1zapisywanie nawiasach (i+1)%5) utrzymująci*2 w granicach c.
W ten sposób najpierw odejmujemy liczbę w indeksie j=7od liczby w indeksie i*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 do i=0( -~4%5 = (4+1)%5 = 0), odwołując się do indeksu, i*2 = 0który jest dla „JEDNEJ”, i odejmujemy wartość znalezioną przy indeksie j=1wpisu zliczającego „W”, a zatem „DWIE”, dostosowując liczbę „O” w dół. Pod koniec pętli mamy poprawione liczby:
[1,1,0,0,0,1,0,0,1,0] <- c (for 1223333448 it would be: [1,2,4,2,0,0,0,1,0,0])
1 2 3 4 5 6 7 8 9 0
więc pozostaje tylko wydrukować to, co cteraz reprezentuje ( 1269). ijest teraz z powrotem na 0, więc zwiększamy go na początku pętli i używamy jako naszej cyfry:
s=""
for n in c:i+=1;s+=`i`*n
print s
Tylne tiki, `i`są skrótem Python2, dla repr(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 tylko n=0odwrócenie `i`od powiedz "5"do ""i n=1obracając utrzymanie powiedzenia "6"jak "6", ale działa również dla większych liczb całkowitych dodatnich, więc "3"*4staje się "3333"na przykład).
"ONEWESTV" -> 27(zawiera liczbę, która tak naprawdę się nie pojawia)