Сам перечисляющие панграммы

12

Pangrams

Быстрая, коричневая лиса, перепрыгнула через ленивого пса.

Это пример панграммы - предложения, которое содержит каждую букву алфавита хотя бы один раз.

Самостоятельной перечислении панграмма является предложением , который удовлетворяет критериям , чтобы быть панграмма, производя анализ его собственного подсчета букв.

Примером достижения этого является предложение

Эта панграмма содержит четыре As, один B, два C, один D, тридцать Es, шесть F, пять G, семь H, одиннадцать Is, один J, один K, два Ls, два M, восемнадцать N, пятнадцать Os, два P , один Q, пять рупий, двадцать семь Ss, восемнадцать Ts, два Us, семь V, восемь W, два X, три Y и один Z.


Соревнование

Создайте функцию, в которой вводом будет строка, ведущая в список букв. В этом примере вводом будет «Эта панграмма содержит». Количество каждой буквы должно быть в письменной форме и вносить вклад в отображаемое количество букв.


правила

  • Оксфордская запятая необязательна
  • Используйте амперсанд перед Z (или, для жесткого режима, включите возможность переключения между «&» и «и» в функции)
  • Каждая буква учитывается в общем количестве букв
  • Нет неписанных чисел
  • Это поэтому выигрывает самый короткий код в байтах
  • В HONO у г о супружеской пары в эти выходные, цифры должны быть написаны на Королевы английском языке. например, nine hundred and ninety-nine Gsдля 999 вхождений буквы G и nine hundred and nine Gsдля 909.
  • Порядки должны быть записаны в стандартном соглашении по сокращенному именованию

Краевые случаи

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

Тестовые случаи

  • «Эта панграмма содержит» должно выводить пример предложения
обкрадывать
источник
8
Я не проверял это, но я уверен, что есть некоторые случаи, когда вы не можете создать правильное решение, каким должен быть выход в этом случае? Например, если у вас есть строка, которая содержит два- os без слова для счетчика, то, когда вы записываете его с помощью two, вся строка теперь имеет три- os, что означает, что слово теперь неверно, переключение делает его снова неправильным и т.д.
Нит
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

Python 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. Как правило, миллионы возможностей проверяются, прежде чем найти «выигрышную» комбинацию.

У меня нет никаких доказательств, но я предполагаю, что: (а) кроме исчерпывающего поиска методом грубой силы, подобного тому, что описал автор оригинала Ли Саллоус и реализующий аппаратно (!), Этот тип случайной эвристики примерно таков: хорошо, как вы можете получить; и (б) не будет решений для многих (большинства?) исходных фраз p.

Час Браун
источник
map(chr,range(65,91))сохраняет несколько байтов.
ბიმო