Відтворити речення


12

Цей виклик складається з двох частин. Переможцем стане рішення з найменшим загальним числом байтів. Для обох викликів слід використовувати однакову мову.

Частина 1:

Напишіть функцію або програму, яка приймає речення з лише дійсними словами як вхідні та виводить список використаних символів, кількість разів вживання кожної літери та кількість літер у кожному з слів у вихідному реченні. Вихід з цієї програми повинен бути дійсним входом до наступної програми (саме так, як вона виводиться)

Додаю приклади та детальні правила далі.

Частина 2:

Напишіть функцію або програму, яка сприймає вихідні дані з першої програми як вхідні та використовує цей список англійських слів і відтворює речення з інформацією з виводу. Речення не повинно бути таким же, як вихідне.

Більше інформації. правила та обмеження:

Частина 1:

  • Перший вхід може бути у будь-якому відповідному форматі, з лапками чи без, як аргумент функції або від STDIN, з дужками або без.
  • Вхідне речення не буде містити розділових знаків або спеціальних символів, крім періоду / крапки в кінці. За винятком символу періоду, всі символи, які знаходяться на вводі, будуть у списку слів.
  • Перша літера речення буде з великої літери, решта - з малої літери.
  • Вихід частини 2 повинен починатися з тієї самої верхньої літери, що і вихідне речення (тому перетворення введення в малі регістри не рекомендується (але добре).
  • Вихід може бути у будь-якому відповідному форматі:
    • Повинно бути можливість копіювати та вставляти вихід безпосередньо в наступну програму / функцію
    • Жодних змін не можна робити при вставці копій, весь вихід повинен бути скопійований і вставлений як ціле, а не по частинах.
    • Наприклад, ви можете вивести гістограму всіх букв в алфавіті або лише тих, що використовуються (загалом, все, що потрібно для заповнення частини 2)
    • Не можна виводити список символів, де повторюються декілька подій. Наприклад, The queueне може дати вихід: Teeehquu (3,5)він повинен бути що - щось на кшталт: Tehqu, (1 3 1 1 2),(3 5).

Частина 2:

  • Програма / функція повинна приймати введення точно так само, як і в частині 1 (один виняток, див. Коментар нижче щодо прийому імені файлу як вхідного).
    • Якщо навколишні дужки, лапки або подібні потрібні для розбору вхідних даних, вони повинні бути частиною виводу з частини 1.
  • Список слів можна знайти тут.
    • Список слів можна зберегти як локальний w.txt, або його можна отримати з URL-адреси. URL буде рахувати лише 5 байт, тож вам не потрібен URL-скорочувач.
    • Якщо програма не може відкрити файл , не читаючи ім'я в якості вхідних даних з STDIN (я вважаю , що це є і в разі Pyth , по крайней мере), то ім'я файлу може бути прийнято в якості окремого вхідного аргументу.
  • Результатом повинно бути лише речення (список дійсних слів), що закінчується періодом та необов'язковим новим рядком.
    • У висновку повинні бути слова з тією ж кількістю літер, що і вихідне речення в частині 1 (у правильному порядку)
    • Усі букви, які були використані в початковому реченні, повинні бути використані в новому висновку.
    • Речення повинно починатися з тієї самої верхньої літери, що і початкове вхідне речення, і закінчуватися крапкою.

Обидві частини:

  • Жодна з частин не повинна зайняти більше 2 хвилин на виконання (випадкове підбирання слів, поки не буде досягнуто рішення, не приймається).

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

Приклади:

У наведених нижче прикладах показано кілька різних форматів вводу та виводу. Багато інших прийнято.

Частина 1:

Вхід:

Zulus win.

Тип виходу 1:

Z i l n s u w
1 1 1 1 1 2 1
5 3

Тип виходу 2:

(('Z',1),('i',1),('l',1),('n',1),('s',1),('u',2),('w',1)), (5,2)

Тип виходу 3:

'Zilnsuuw',[1,1,1,1,1,2,1],[5,2]

Частина 2:

Введення: Точна копія виводу з частини 1. Вихід:

Zulus win.

Зауважте, що інші комбінації слів приймаються до тих пір, поки вони починаються з а Z, а перше слово має 5 літер, а друге - 3.

Виграє найкоротший код у байтах.



@ LegionMammal978: Так, ви можете це зробити за такими обмеженнями: Вихід з f1цього вкладеного продукту f2повинен містити всі дані, вказані в виклику. Жодні додаткові дані не можуть бути частиною результатів f1. Жодні дані не можуть бути "збережені", щоб f1зробити інформацію доступною під час її виклику f2. f1може приймати лише один рядок як вхід на дзвінок
Стюі Гріффін

1
Шанс отримати одне і те ж речення з більш ніж 3-ма словами насправді дуже поганий, я думаю
Eumel

Загалом, так, але є багато випадків, коли ви, ймовірно, отримаєте те саме речення. Якщо вашій бабусі набридло переробляти ваш старий светр, це може бути: "кинути повторне в'язання". Я не перевіряв, але я думаю, що ваша бабуся все-таки буде закриватись після другої частини. Також комбінації довших слів можуть повернути те саме речення.
Стюі Гріффін

1
@StewieGriffin Ви можете легко отримати "Перуку ... вау". повернемось із прикладом речення.
question_asker

Відповіді:


5

LabVIEW, 166 LabVIEW примітивів

Перш за все, я не створив дві окремі програми, тому що Labview робить потік даних, тому Theres насправді не потребує.

Зберігає гістограму з першим елементом = код коду першої літери від 1-26 ходу на суму. Lenght просто зберігається в масиві.

У першому слові в гістограмі є 3 чеки, перша буква, довжина та доступні літери. Перевірка першої літери припиняється після першого слова.

Я перевіряю гістограму, зменшуючи її для кожної літери і перевіряючи, чи не впаде вона нижче 0.

Якщо я знайшов своє N-е слово, і немає слів, які можна скласти ліворуч від літер, я почну видаляти слова з довідника і повторювати N-е слово і так далі, поки не знайду рішення.

Це може бути, а може і не спрацювати з пропозиціями, оскільки для обчислення це займе вічно (мій приклад зайняв уже кілька секунд).

Що я спробував

In: Zulus win.
Out: Zulus win.

In: Dovecot flagships oleander.
Out: Dolphin advocates forelegs.

In: Abash abel mammal test.
Out: Amass abbe hamlet malt.


3

Python 2.7, 353 байт

На жаль, я не можу перевірити його на фактичному ATM-файлі w.txt, оскільки QPython для Android не може обробляти введення / виведення файлів. Це працювало з даними, які я скопіював і встав.

Частина 1, 76 байт

h=lambda s:({c:s.count(c)for c in s if c.isalnum()},map(len,s[:-1].split()))

В: 'Hi there.'

Вийшов: {'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)

так, список, що містить:

  • хешмап з гістограмою

  • список підрахунків листів

Частина 2, 277 байт

import itertools as i
m=lambda c:' '.join([s for s in i.product(*[[w for w in open('w.txt')if len(w)==length]for length in c[1]])if sorted(''.join(s))==sorted(sum([[k.lower()]*n for k,n in c[0].items()],[]))and s[0][0]==filter(str.isupper,c[0])[0].lower()][0]).capitalize()+'.'

Я дуже радий, що мені вдалося зробити його на 100% чистим функціоналом. Не впевнений, чи допомагає це фактично з гольфу, але я, безумовно, отримав частину обфускування правильно: D Ось більш зручна для людини версія птахів. 2 (точно такий же потік, але зі назвами змінних):

from itertools import product

def matching(counts):
  histo, word_lengths = counts
  first_letter = filter(str.isupper, histo)[0].lower()

  letters_nested = [ [char.lower()]*count for char, count in histo.items() ]
  letters = sum(letters_nested, [])

  word_options = [[word for word in open('w.txt') if len(word)==length] for length in word_lengths]

  sentences = product(*word_options)

  valid = [sentence for sentence in sentences if sorted(''.join(sentence))==sorted(letters) and sentence[0][0]==first_letter]
  return ' '.join(valid[0]).capitalize()+'.'

3

Perl, 516 504 байт

включає 2х +1 для -p

@l=map{length}/\w+/g;s/\w/$c{$&}++/eg;@h=map{"$_$c{$_}"}keys%c;$_="@h @l";chomp(@w=`cat w.txt`);s/([A-Z])1//;$o=$1;s/(\w)(\d)/$h{$1}=$2,''/eg;@L=/\d/g;$l=shift@L;@O=$_,s/^.//,g([@L],%h)&&last for grep{$l==length&&/^$o/i&&h(\%h,substr$_,1)}@w;$_="@O.";s/^./uc$&/e;sub g{my%g;($R,%g)=@_;my@R=@$R;if($j=shift@R){s/./$g{$&}--/eg;my@C=grep{$j==length&&h(\%g,$_)}@w;push(@O,$_),g([@R],%g)and return 1 or pop@O for@C;0}else{1}}sub h{($y,$z)=@_;my%T;$z=~s/\w/$T{$&}++/eg;$K=1;$K&=$T{$_}<=$y->{$_}for keys%T;$K}

Потрібно мати w.txtу форматі unix ( \nзакінчення рядків). Використовує catдля читання файлу; зміни на typeдля Windows.
Збережіть oneliner вище в 534.plі запустіть як echo Test. | perl -p 534.pl.

Досить великий, але це початок - багато можливостей для гольфу, але я просто хотів опублікувати його, щоб зробити LabVIEW відповідь менш самотньою ;-). Я пропустив оптимізацію для виконання другої секунди, економивши 30+ байтів.


Перший фрагмент (73 байти):

@l=map{length}/\w+/g;s/\w/$c{$&}++/eg;@h=map{"$_$c{$_}"}keys%c;$_="@h @l"

Він виробляє гістограму та слово довжини у компактному форматі. Для введення Zulus win.він виробляє вихід 2-го типу без (,), які тут не потрібні:

s1 l1 u2 Z1 w1 i1 n1 5 3

Ось це, невольф:

sub i{
    $_=shift;                       # get parameter
    @l = map{length} /\w+/g;        # cound word lengths
    s/\w/$c{$&}++/eg;               # count letters in hash %c
    @h=map{"$_$c{$_}"}keys%c;       # construct letter-frequency pairs
    "@h @l"                         # implicit interpolation with $" (space) separator
}

Другий фрагмент (441 байт)

Ця основна частина стосується вводу-виводу та особливої ​​обробки першої літери, використовуючи підпрограми gта hперелічені нижче.

sub o {
    $_=shift;
    chomp(@w=`cat w.txt`);          # load the wordlist.

    s/([A-Z])1//; $o=$1;            # get and remove the uppercase character,
    s/(\w)(\d)/$h{$1}=$2,''/eg;     # reconstruct histogram in hash %h.
    @L=/\d/g;                       # get the word counts.

    $l = shift @L;                  # get the first word length.

    @O = $_,                        # initialize output with first word,
    s/^.//,                         # strip first char of word
    g([@L],%h) && last              # call the main algoritm and quit on success

    for grep {                      
            $l==length &&           # check length
            /^$o/i &&               # only match words starting with the uppercase char
            h(\%h,substr$_,1)       # check if the word satisfies the histogram
        } @w;                       # iterates all words (speedups removed).

    $_="@O.";                       # construct output sentence.
    s/^./uc$&/e;                    # make first char uppercase.
    $_
}

Ця рекурсивна функція приймає копію гістограми, копію рахунків, що залишилися, та поточне слово. Якщо масив довжини слів порожній, повертає значення true. В іншому випадку він зменшує кількість гістограм для літер у даному слові, приймає наступну довжину слів і знаходить список відповідних слів зі списку слів. Для кожного відповідного слова воно повторюється.

sub g {
    my%g;                           # local version of histogram
    ($R,%g)=@_;                     # get parameters.
    my@R=@$R;                       # dereference arrayref copy of word lengths.

    if($j=shift @R)                 # get the next word-length.
    {
        s/./$g{$&}--/eg;            # update histogram

        my @C =                     # get a list of suitable words.
        grep { $j==length && h(\%g,$_) }
        @w;

        push(@O,$_),                # append word to output
        g( [@R], %g )               # recurse.
            and return 1            # true: append word we're done.
            or pop @O               # remove word from output
        for @C                      # (for some reason the @C=grep doesn't work here)

        ;0
    } else { 1 }                    # no more words, done!
}

І нарешті, цій підпрограмі надається гістограма слова та речення. Він обчислює нову гістограму для слова і перевіряє, чи всі букви зустрічаються не частіше, ніж дозволено гістограмою речення.

# check if first histogram is within bounds of second
sub h{
    ($y,$z)=@_;
    my%T; $z =~ s/\w/$T{$&}++/eg;    # calc histogram

    $K=1;
    $K &= $T{$_} <= $y->{$_}
    for keys %T;#$_[0];
    $K
}

Ви можете вставити фрагменти без заготівлі ( sub i/o/g/h) в один файл і додати нижче тестовий код.

sub t {
    print $i=i(shift),$/,o($i),$/x2;
    %c=%h=@L=@X=@O=();
}

t "Test.";                              # Test.
t "Zulus win.";                         # Zulus win.
t "Happy solstice.";                    # Happy solstice.
t "Abash abel mammal test.";            # Abase alms embalm that.
t "Dovecot flagships oleander.";        # Dangled horoscope festival.
t 'This code requires further golfing.';# Tech deer fighting ferrous liquors.

  • оновлення 504 : збережіть 12 байт, усунувши а substrта параметр для sub g.

Бачу, крадуть мої приклади! Жартівлюся, що раси - це веселий XD
Eumel

@Eumel Так, вони відрізнялися від твоїх, тому я включив їх :-)
Кенні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.