Панограми, що перераховуються самостійно


12

Панграми

Швидка бура лисиця перестрибнула над ледачим собакою.

Це приклад панграми - речення, яке містить кожну букву алфавіту хоча б один раз.

Самостійної перерахування панграма є пропозицією , який відповідає критеріям , щоб бути панграма, виробляючи аналіз його власного підрахунку букв.

Прикладом досягнення цього є речення

Ця панграма містить чотири As, один B, два Cs, один D, тридцять Es, шість Fs, п’ять Gs, сім Hs, одинадцять Is, один J, один K, два Ls, два Ms, вісімнадцять Ns, п'ятнадцять Os, два Ps , один Q, п’ять Rs, двадцять сім Ss, вісімнадцять Ts, два Us, сім Vs, вісім Ws, два Xs, три Ys, і один Z.


Змагання

Створіть функцію, введенням якої є рядок, що веде в інвентар літер. У прикладі введення буде "Ця панграма містить". Кількість кожної літери має бути у письмовій формі та сприяти відображенню кількості літер.


Правила

  • Оксфордська кома необов’язкова
  • Використовуйте амперсанд перед Z (або, у жорсткому режимі, включіть можливість перемикання між "&" та "та" у функції)
  • Кожна літера вважається загальною кількістю літер
  • Немає письмових номерів
  • Це тому найкоротший код у байтах виграє
  • У HONO у г о подружньої пари в ці вихідні, цифри повинні бути написані на Королеви англійською мовою. наприклад, nine hundred and ninety-nine Gsдля 999 випадків букви G і nine hundred and nine Gsдля 909.
  • Накази величини повинні бути записані в стандартній конвенції про короткомасштабне іменування

Корпусні кромки

  • Є деякі випадки, коли код застрягне в циклі - наприклад, якщо є два ОС, код збільшить кількість до трьох Ос, що змушує код знову рахувати два Ос. Якщо обчислення будь-якого іншого листа , перш ніж повертатися до цього не може вирішити цю проблему, розгляне введення помилковий стартер і вихід false, nullабо порожній рядок.
  • Якщо лист має понад 999 зустрічей, введення слід вважати помилковим початком.

Випробування

  • "Ця панграма містить" повинна вивести приклад речення

8
Я не перевіряв це, але я впевнений, що є випадки, коли ви не можете побудувати правильне рішення, яким повинен бути результат у такому випадку? Наприклад, якщо у вас є рядок, який містить два o-s без слова для підрахунку, то, коли ви пишете це з two, у всій рядку зараз є три o-s, тобто слово зараз неправильне, перемикаючи це робить його знову неправильним та ін.
Ніт

2
Яке найбільше письмове число має підтримувати рішення? Сто, тисяча, мільйон?
Ніт

7
Приємне перше запитання! Однак я особисто рекомендую обмежити максимальну кількість букв до 999 або, можливо, навіть, лише 99. Це зробить виклик більш доступним для мов, які не мають вбудованих текстів у десятковий текст, зберігаючи все задоволення. (Крім того, можливо, навіть неможливо перевірити записи з мільйонами букв на деяких мовах.)
Арнольд


1
Rob enjoys any sentence with two As, two Bs, two Cs, one D, thirty five Es, four Fs, three Gs, nine Hs, eight Is, two Js, one K, two Ls, one M, twenty two Ns, eighteen Os, one P, one Q, nine Rs, twenty three Ss, twenty three Ts, three Us, four Vs, eleven Ws, one X, seven Ys, & one Z.
Час Браун

Відповіді:


6

Пітон 2 , 615 байт

def g(n):S=str.split;D=S('z one two three four five six seven eight nine');K=' fif six seven eigh nine';n,m=n/100,n%100;e,d=m/10,m%10;return' '.join([D[n],'hundred']*(n>0)+([S('ten eleven twelve thir four'+K)[d]+'teen'*(d>2)]if 9<m<20else[S('twen thir for'+K)[e-2]+'ty']*(e>0)+[D[d]]*(d>0)))
from random import*
X='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def f(p):
 T=set();s='';i=0
 while 1:
	Q=s.upper().count;t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'
        if s==t:return i,t
	if t in T:t=''.join(c*max(1,t.upper().count(c)+(randint(0,6)-3)*(random()<0.25))for c in X)
	T.add(t);s=t;i+=1

Спробуйте в Інтернеті!

Функція fприймає pпрефікс рядка; і повертає кортеж цілого числа, що представляє кількість виконаних кроків, і автограму.

Функція gкодує число 1<=n<=999до його англійського рядка; він займає 291 байт, приблизно половину від загальної кількості байтів. Код

Q=s.upper().count
t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'

кодує рядок sу (потенційно автограмову) панграму t.

Ми перебираємо процес, сподіваючись на ситуацію, коли ми знайдемо tтаку, що tє автограмою (тобто де t==s). Якщо ми потрапляємо в цикл, ми випадковим чином підштовхуємо підрахунок букв повністю спеціальним чином.

Для більшості значень pцей процес очікується на TIO. Зазвичай мільйони можливостей вивчаються перед тим, як знайти «виграшну» комбінацію.

Я взагалі не маю доказів, але я здогадуюсь: (а) крім вичерпного грубого пошуку, схожого на те, що описує тут автор і Лі реалізує апаратно (!), Цей тип випадкових евристичних творів є як добре, як ви можете отримати; і (b) не знайдеться рішення для багатьох (більшості?) початкових фраз p.


map(chr,range(65,91))зберігає деякі байти.
ბიმო
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.