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
Un programa completo que toma la entrada citada e imprime el número de John.
Pruébalo en línea! o ver un conjunto de pruebas
¿Cómo?
Trabajemos con el ejemplo "NEONSEXTOWNII" (para obtener 1269, y ser algo así como Leisure Suite Larry -esque!)
Primero c=map(input().count,"OWHUFXSGIQ")
toma datos y cuenta el número de cada uno de OWHUFXSGIQ
ellos: estas son letras que aparecen en cada número en orden ascendente, con 2,4,6 y 8 con sus letras "propias" ( WUXG
), más una letra adicional, Q
para agregar un cero hasta el final y haga que la longitud de la lista resultante sea uniforme. Por el ejemplo:
[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
Las entradas para 1, 3, 5, 7 y 9 deben ajustarse para corregir la abundancia de las otras letras. Esto se realiza mediante el siguiente ciclo:
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
Tenga en cuenta que las entradas para ajustar son alternativas (1,3,5,7,9,1,3,5, ...), por lo que podemos agregar dos a una variable de índice en cada paso y módulo por 10 para permanecer en rango si necesitamos atravesar más de una vez (lo que hacemos). Para guardar algunos bytes, podemos incrementar en uno y módulo en 5 y usar el doble del índice.
Dado que los ajustes para 9 requieren la mayor parte del trabajo, comenzamos allí; reside en el índice 8, así que comenzamos en i=4
. La cadena "71735539994"
luego proporciona los índices, j
de los valores a eliminar en cada etapa (donde nos hemos asegurado de que el noveno índice contendrá cero al usarlo "Q"
al crear c
); c[i*2]-=c[int(j)]
realiza cada ajuste individual y i=-~i%5
pasa i
al siguiente índice (donde -~i
está -(-1-i)
o i+1
guarda paréntesis (i+1)%5
) manteniendoi*2
dentro de los límites de c
.
Por lo tanto, primero restamos el número en el índice j=7
de ese en el índice i*2=8
, restando el número de "G" contadas del número de "I", ajustando la cuenta regresiva "NUEVE" por el número (correcto) de "OCHO" que también tiene un "yo"). Luego nos movemos hacia i=0
( -~4%5 = (4+1)%5 = 0
), haciendo referencia al índice i*2 = 0
que es para "UNO" y restamos el valor encontrado en el índice de j=1
la entrada que cuenta "W" y, por lo tanto, "DOS", ajustando la cuenta de "O" s hacia abajo. Al final del ciclo tenemos los conteos corregidos:
[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
así que todo lo que queda es imprimir lo que c
ahora representa ( 1269
). i
ahora está de vuelta en 0
, así que lo incrementamos al comienzo del ciclo y lo usamos como nuestro dígito:
s=""
for n in c:i+=1;s+=`i`*n
print s
Los ticks posteriores `i`
son una abreviatura de Python2 para la repr(i)
cual se obtiene una representación de cadena de un objeto (el carácter de dígito en cuestión como una cadena) y la multiplicación de una cadena por un número crea una nueva cadena de tantas repeticiones (aquí solo mostramos el n=0
giro `i`
desde decir "5"
hacia ""
y n=1
girando manteniendo decir "6"
como "6"
, pero también funciona para enteros positivos más grandes, por lo que se "3"*4
convierte "3333"
por ejemplo
"ONEWESTV" -> 27
(incluye un número que en realidad no aparece)