Codegolf - Найдите Автограмму По Римским Цифрам

  • Автор темы Barca9107
  • Обновлено
  • 22, Oct 2024
  • #1

Эта задача строится на: Найдите все рефлексиконы, используя римские цифры.

Автограмма — это предложение, в котором указано количество собственных букв. Ниже представлена ​​одна из первых задокументированных автограмм, найденных Ли Сэллоузом в 1983 году:

В этой панграмме перечислены четыре буквы «а», одна «б», одна «в», две «д», двадцать девять «е», восемь «f», три «g», пять «h», одиннадцать «i», одна «j», одна «k», три «l», две «m», двадцать две «n», пятнадцать. «о», две «п», одна «к», семь «р», двадцать шесть «с», девятнадцать «т», четыре «ю», пять «в», девять «в», два «икса», четыре «ю» и одна «з».

Автограмма (панграмма) выше содержит именно то, что она делает согласно определению. Поиск автограмм на английском языке (с использованием цифр на английском языке) требует очень больших вычислительных ресурсов, поэтому вместо этого мы сосредоточимся на использовании римских цифр (I, II, III, IV...).

Ваша задача состоит в том, чтобы написать программу*, которая принимает в качестве входных данных* две строки и выдает одну действительную автограмму.

Мы назовем первую строку «вступлением» - в приведенной выше автограмме вступлением является «Эта панграмма перечисляет».

Вторую строку мы будем называть «последним разделителем», а в приведенной выше автограмме это самое последнее «и» в конце.

* «программа» может быть функцией или чем-то эквивалентным, а входные данные могут поступать из стандартного ввода, параметров функции или чего-то еще; при необходимости используйте любой разделитель между двумя строками, который вы предпочитаете. Вывод должен быть в удобочитаемом формате: сначала должно идти вступление, затем частоты, затем последний разделитель и частота последней буквы. Сортировка букв по алфавиту не требуется. Заполнители/«пустышки» разрешены (I C, I Z и т. д.), но не обязательны — заполнители можно выбрать из алфавита, используемого выбранным языком для вступления.
Вот список римских цифр [1..40] для удобства:
I II III IV V VI VII VIII IX X
XI XII XIII XIV XV XVI XVII XVIII XIX XX

XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX

XXXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL

Это пример автограммы на латыни (конечно, используйте латиницу для соответствия цифр!) (Жиль Эспозито-Фарез, 2013):

IN HAC SENTENTIA SVNT III A, I B, II C, I D, IV E, I F, I G, II H, XXXII I, I K, I L, I M, V N, I O, I P, I Q, I R, III S, V T, VII V , IV X, I Y ET I Z.
Здесь вступление — «IN HAC SENTENTIA SVNT» (подходят SVNT/SUNT), а последний разделитель — «ET». Еще больше вступлений на английском языке, если вы ищете вдохновение:

Это предложение содержит/перечисляет/включает/имеет/использует

Эта автограмма содержит/перечисляет/включает/имеет/использует
и последние разделители:
и

и последнее, но не менее важное

Barca9107


Рег
26 Mar, 2020

Тем
87

Постов
193

Баллов
638
  • 26, Oct 2024
  • #2

Excel VBA, 260 228 байт

Сэкономлено 32 байта благодаря нескольким оптимизациям Тейлора Рейна.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ⟦⁺⁺⁺θ эδ⁺⁺I §ζμ, ε
 

Подпрограмма принимает входные данные V (intro) and X (последний разделитель). Вывод осуществляется в непосредственное окно. Когда вы вставляете это в VBA, он форматирует его, добавляя пробелы, двойные кавычки в конце строки и точки с запятой в операторе отладки. Ниже представлена ​​более понятная версия с комментариями.

¿⁼⟦ικ⟧EXV№⁺θεμ

Проблема в Спеце: Автограмма не всегда может быть сгенерирована.

Я нашел несколько входных данных, которые генерируют бесконечный цикл. Я нашел ту же уязвимость в единственном опубликованном на данный момент ответе. Обычно это происходит из-за подсчета I and / or ¿⁼δ﹪δ⊕Lζ . Допустим, эта итерация имеет I but you count 25 instances of I in that iteration. The next iteration will have ≔⁻λ№⁺θεIδ но, упс, теперь у вас всего 24 экземпляра. Вы возвращаетесь к I and now you're stuck in a loop. The examples below are those that I found do not cause issues in my own code.

V ||answer||

Python3, 845 байт:

X

Попробуйте онлайн!


Изменить: из-за того, что исходный набор римских цифр достигает только ≔⪫⮌EΦ⁺E⟦ικλ⟧∧μ⁺⁺§υμ §XVIνE⁻αζ⁺⁺§υ⊕№⁺θημ μμ⎇νμ⁺⁺η μ, ε , certain inputs that produce frequencies I потерпит неудачу. Однако, используя генератор римских цифр, можно обрабатывать любую частоту:

V ||answer||

Р, 325 269 байт

-56 байт благодаря @Giuseppe.

X

Попробуйте онлайн!

Берет FχFχF⁴⁰« (introduction) and ≔⁻α⪪⁺θη¹ζ (последний разделитель) в качестве входных данных и, если возможно, возвращает автограмму.

Как упоминал @Инженер Тост, автограммы с римскими цифрами не всегда могут быть сгенерированы, поэтому я добавил возможный исход I when an autogram can not be found. This assumes that fillers (I C, I Z) не могу использоваться для решения этой проблемы бесконечного цикла (поскольку можно по желанию удалить наполнители, чтобы прийти к стабильному решению).

 

Oksa.elistratov


Рег
04 May, 2011

Тем
78

Постов
176

Баллов
566
  • 26, Oct 2024
  • #3

Древесный уголь, 162 158 байт

V

Попробуйте онлайн! Ссылка на подробную версию кода. Ограничен по диапазону до 9. X s, 9 ≔⁻⪪α¹⪪XVI¹α с и 39 F⁴F⪪”{⊞‴ΣAº⧴θπ⪪λpAz” ⊞υ⁺×Xικ s so that it will complete in a reasonable amount of time on TIO. Outputs all of the autograms that it can find. Letters are not in sorted order. Explanation:

I

Сгенерируйте все римские цифры до 39.

V

Удалить буквы X , F⁴F⪪”{⊞‴ΣAº⧴θπ⪪λpAz” ⊞υ⁺×Xικ≔⁻⪪α¹⪪XVI¹α≔⁻α⪪⁺θη¹ζFχFχF⁴⁰«≔⪫⮌EΦ⁺E⟦ικλ⟧∧μ⁺⁺§υμ §XVIνE⁻αζ⁺⁺§υ⊕№⁺θημ μμ⎇νμ⁺⁺η μ, ε≔⁻λ№⁺θεIδ¿⁼δ﹪δ⊕Lζ¿⁼⟦ικ⟧EXV№⁺θεμ⟦⁺⁺⁺θ эδ⁺⁺I §ζμ, ε и FALSE from the uppercase alphabet variable because they're a special case.

S

Получите все оставшиеся заглавные буквы, которых нет во вступлении или разделителе.

I

Перебрать все поддерживаемые номера function(I,S){library(stringr) p=paste t=str_count f=str_flatten u=toupper r=as.roman l=LETTERS a=r((e<-t(u(f(c(I,S))),l)+1)+t(f(as.roman(e)),l)) n=1;i=F while(!i&&n<=9){s=p(I,p(append(p(a,l),S,25),collapse=", ")) b=r(t(u(s),l)) i=identical(a,b) n=n+1 a=b} "if"(i,s,i)} s, import roman #third party Python module (https://pypi.org/project/roman/) from collections import* c=Counter d={'I': 1, 'II': 2, 'III': 3, 'IV': 4, 'V': 5, 'VI': 6, 'VII': 7, 'VIII': 8, 'IX': 9, 'X': 10, 'XI': 11, 'XII': 12, 'XIII': 13, 'XIV': 14, 'XV': 15, 'XVI': 16, 'XVII': 17, 'XVIII': 18, 'XIX': 19, 'XX': 20, 'XXI': 21, 'XXII': 22, 'XXIII': 23, 'XXIV': 24, 'XXV': 25, 'XXVI': 26, 'XXVII': 27, 'XXVIII': 28, 'XXIX': 29, 'XXX': 30, 'XXXI': 31, 'XXXII': 32, 'XXXIII': 33, 'XXXIV': 34, 'XXXV': 35, 'XXXVI': 36, 'XXXVII': 37, 'XXXVIII': 38, 'XXXIX': 39, 'XL': 40} e='ABCDEFGHIJKLMNOPQRSTUVWXYZ' g={d[i]:i for i in d} def t(s,f): s=s+''.join(g.get(b,roman.toRoman(b))+a for a,b in f.items());return all(s.count(i)==f[i]for i in f) def n(a,k): if not a:yield k else: for i in range(k[a[0]], k[a[0]]+(max(i.count(a[0])for i in d)*26)+1):yield from n(a[1:],{**k,**{a:k[a]+b for a,b in c(g.get(i,roman.toRoman(i))).items()}}) def f(q,w): for i in n(e,c((s:=(q+w).replace(' ',''))+e)): k=[j for j in i if j not in s and i[j]==1] for x in range(len(k)): if t(s,(r:={a:b for a, b in i.items()if a not in k[:x]})):return q+' '+', '.join(g.get(r[v],roman.toRoman(r[v]))+' '+v for v in[*r][:-1])+' '+w+' '+g.get(r[[*r][-1]],roman.toRoman(r[[*r][-1]]))+' '+[*r][-1] print(f('VVVVVV','AND')) # 'VVVVVV IX V, II A, II N, II D, I G, I H, XXVIII I, I J, I K, I L, I M, I O, I P, I Q, I R, I S, I T, I U, I W, IV X, I Y AND I Z' песок > 40 s.

40

Создайте суффикс автограммы, используя только буквы. from collections import* c=Counter e='ABCDEFGHIJKLMNOPQRSTUVWXYZ' g='_ I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL'.split() d={v:k for k,v in enumerate(g)} def t(s,f): s=s+''.join(g[b]+a for a,b in f.items());return all(s.count(i)==f[i]for i in f) def n(a,k): if not a:yield k else: for i in range(k[a[0]], k[a[0]]+(max(i.count(a[0])for i in d)*26)+1):yield from n(a[1:],{**k,**{a:k[a]+b for a,b in c(g[i]).items()}}) def f(q,w): for i in n(e,c((s:=(q+w).replace(' ',''))+e)): k=[j for j in i if j not in s and i[j]==1] for x in range(len(k)): if t(s,(r:={a:b for a, b in i.items()if a not in k[:x]})):return q+' '+', '.join(g[r[v]]+' '+v for v in[*r][:-1])+' '+w+' '+g[r[[*r][-1]]]+' '+[*r][-1] , z "IN HAC SENTENTIA SVNT", "ET" IN HAC SENTENTIA SVNT III A, II C, IV E, II H, XIX I, V N, III S, V T, VI V, ET III X. z "My very nice sentence contains", "and" My very nice sentence contains III A, IV C, II D, VI E, XXXI I, II M, VII N, II O, II R, III S, III T, VII V, IV X, and III Y. z "This autogram uses", "and last but not least" This autogram uses VI A, II B, II D, III E, II G, II H, XXXVI I, III L, II M, III N, III O, II R, VI S, VII T, IV U, VIII V, and last but not least IV X. z "This iiii sentence uses", "and finally" This iiii sentence uses III A, II C, II D, V E, II F, II H, XXXI I, III L, V N, V S, III T, II U, VI V, IV X, and finally II Y. , XXIV I and any other letters in the intro and separator.

XXV I

Посмотрите, сколько XXIV I s we are short.

V

Можем ли мы составить количество I s using letters not present in the intro or separator?

Sub z(a, b) Do ' Loop through all the characters A-Z For i = 65 To 90 c = Chr(i) ' Split the string on that character to count its occurrences ' Here, we use the two inputs and the result of the last search (s) ' The 1 at the end makes it a text comparison so capitalization doesn't matter [A1] = UBound(Split(a + b + s, c, , 1)) ' If we found any ([A1]>0), then add that count to the working string (t) ' Excel has a built-in function to convert Arabic numerals to Roman numerals so long as it's between 1 and 3999 inclusive. If [A1] Then t = t + [Roman(A1)] + " " + c + ", " Next ' If the working string (t) matches the last result (s) then exit the loop If t = s Then Exit Do ' Otherwise, reset the last result and working string s = t t = "" Loop ' We haven't included the "last separator" at the right spot so let's do that u = Split(s, ",") For i = 0 To UBound(u) - 2 r = r + u(i) + "," Next ' Ouput the "intro", most of the result, the "last separator", and the last item from the result Debug.Print a; " "; r; " "; b; u(i); "." End Sub

Сделайте числа b s and a совпадение?

Sub z(a,b) Do For i=65To 90 c=Chr(i) [A1]=UBound(Split(a+b+s,c,,1)) If[A1]Then t=t+[Roman(A1)]+" "+c+", Next If t=s Then Exit Do s=t t=" Loop u=Split(s,",") For i=0To UBound(u)-2 r=r+u(i)+", Next Debug.?a" "r" "b u(i)". End Sub

Если да, то объедините вступление с необходимыми дополнительными буквами и суффиксом и выведите полученную автограмму.

 

Core2duo


Рег
22 Feb, 2014

Тем
66

Постов
208

Баллов
548
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно