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
Повна програма з цитованим введенням та друком номера Джона.
Спробуйте в Інтернеті! або побачити тестовий набір
Як?
Давайте попрацюємо з прикладом "NEONSEXTOWNII" (щоб отримати 1269, і бути дещо Leisure Suite Larry -esque!)
Спочатку c=map(input().count,"OWHUFXSGIQ")приймає введення та підраховує кількість кожного OWHUFXSGIQ- це букви, які відображаються в кожному номері у порядку зростання, 2,4,6 та 8 мають свої "власні" літери ( WUXG), а також додаткові літери, Qщоб додати нуль до кінця і зробіть довжину отриманого списку рівним. Для прикладу:
[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
Записи для 1, 3, 5, 7 та 9 потребують коригування, щоб виправити величину інших літер. Це виконується наступним циклом:
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
Зауважте, що записи для коригування є альтернативними (1,3,5,7,9,1,3,5, ...), тому ми можемо додати дві до змінної індексу на кожному кроці та модуль на 10, щоб залишитися в дальність, якщо нам потрібно пройти більше одного разу (що ми робимо). Щоб зберегти кілька байт, ми можемо збільшити на один, а по модулю - на 5 і використовувати подвійний індекс.
Оскільки коригування для 9 вимагає найбільшої роботи, яку ми починаємо там - вона знаходиться в індексі 8, тому ми починаємо з i=4. Потім рядок "71735539994"дає індекси, jзначень, які слід видалити на кожному етапі (де ми гарантували, що дев'ятий індекс буде містити нуль, використовуючи "Q"при створенні c); c[i*2]-=c[int(j)]виконує кожну індивідуальну настройку і i=-~i%5переходить iдо наступного індексу (де -~iзнаходиться -(-1-i)або i+1збереження дужки (i+1)%5) збереженістьi*2в межах c.
Таким чином, ми спочатку віднімаємо число в індексі j=7від цього в індексі i*2=8, віднімаючи число "G" s, відлічене від числа "I" s, коригуючи відлік "NINE" на (правильне) число "EIGHT" s ( який також має "Я"). Потім переходимо до i=0( -~4%5 = (4+1)%5 = 0), посилаючись на індекс, i*2 = 0який є для "ONE", і віднімаємо значення, знайдене в індексі, j=1підрахунком запису "W" і, отже, "TWO", коригуючи кількість "O" s вниз. До кінця циклу маємо виправлені підрахунки:
[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
тому залишається лише роздрукувати те, що cзараз являє собою ( 1269). iтепер повернуто на 0, тому ми збільшуємо його на початку циклу і використовуємо його як наш цифр:
s=""
for n in c:i+=1;s+=`i`*n
print s
Задні тики, `i`є скороченням Python2, для repr(i)якого отримується рядкове представлення об'єкта (розрядний символ, про який йде мова, як рядок) і множення рядка на число створює нову рядок, що багато повторюється (тут ми показуємо лише n=0поворот `i`із сказати "5"до ""та n=1повороту зберігання говорять "6"як "6", але це також працює для більших натуральних чисел, так "3"*4стає, "3333"наприклад.)
"ONEWESTV" -> 27(включає число, яке насправді не відображається)