Гра з номерними знаками Іспанії


26

Це питання заснований на питання , який я просив у іспанською мовою . Так, я попросив алгоритм з іспанської мови. :)

В Іспанії поточні номерні знаки мають такий зразок:

1234 XYZ

де XYZ - це три приголосні, взяті з повного набору іспанських приголосних (крім "Ñ", я думаю).

Іноді під час подорожі з дружиною ми використовуємо для гри. Коли ми бачимо номерний знак, ми беремо його три приголосні і намагаємося сформувати слово, яке містить ці три приголосні, і вони відображаються в тому ж порядку, що і в номерному знаку. Приклади (іспанською мовою):

BCD
    BoCaDo (valid)
    CaBezaDa (not valid)
FTL
    FaTaL (valid)
    FLeTar (not valid)
FTR
    FleTaR (valid, wins)
    caFeTeRa (valid, loses)

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

Змагання

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

  • Введення для списку слів (перший параметр) буде масивом вашого stringтипу мови . Другий параметр (три приголосні) буде іншим string. Якщо вам краще для вашої мови, розгляньте stringз трьома приголосними останній пункт усього списку параметрів. Вихід буде іншим string.
  • Слова в списку слів не будуть вигаданими або нескінченними словами, вони будуть словами, які відображаються в будь-якому стандартному словнику. Якщо вам потрібна межа, припустімо, що жодне слово у списку слів не перевищує 50 символів.
  • Якщо є кілька слів з однаковою довжиною, які могли б бути правильною відповіддю, ви можете повернути будь-яке з них. Просто переконайтеся, що ви повернете лише одне слово або порожній рядок, якщо жодне слово не відповідає шаблону трьох приголосних.
  • Ви можете повторювати приголосні в групі, тому дійсні вводи для трьох приголосних є FLRі GGG.
  • Іспанські приголосні точно такі ж, як і англійські, з додаванням "Ñ". Голосні звуки однакові з приголошенням наголошених голосних: "áéíóúü". Інших типів знаків, таких як "-" або "", не буде.
  • Можна припустити, що випадок завжди буде однаковим і в списку слів, і в трьох приголосних.

Якщо ви хочете перевірити свій алгоритм справжньою колекцією іспанських слів, ви можете завантажити файл (15,9 Мб) з Dropbox з більш ніж мільйоном слів.

Тестові справи

Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'

Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'

Input: 'hst', {'hastío' 'chest'}
Output: 'chest'

Це , тому можливо найкоротша програма, яка допомагає мені завжди перемагати дружину. :)


Як довго гарантуються слова у списку слів?
Ніл

2
У фактичних номерних знаках літера Q також не дозволена; і W є, хоча це не належний іспанський лист
Луїс Мендо

2
Чи можемо ми припустити слова зі списку, і три букви будуть усі в одному випадку?
Джонатан Аллан

1
@LuisMendo W - іспанський лист з 1969 року .
walen

1
@walen Ось чому я сказав "належним" :-) Він існує по-іспанськи, але відчуває себе іноземним
Луїс Мендо

Відповіді:


7

05AB1E , 10 8 байт

Збережено 2 байти завдяки Леву

ʒæså}éR`

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

Пояснення

ʒ         # filter list, keep only members for which the following is true
  så      # input is in the
 æ        # powerset of the current word
    }     # end filter
     é    # sort by length
      R   # reverse
       `  # push separately (shortest on top)

Я б використав headнаприкінці збереження байта, але це дозволило б вивести порожній список, якщо не відповідає.


3
3ù #keep only those of length 3навіщо вам це потрібно?
Лев

1
@Leo: Не знаю, це було нерозумно. Дякую :)
Емінья

6

MATL , 30 29 байт

xtog!s2$S"1G!'.*'Yc!@gwXXn?@.

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

Пояснення

x         % Implicitly take first input (string with three letters). Delete.
          % Gets copied into clipboard G, level 1
t         % Implicitly take second input (cell array of strings defining the
          % words). Duplicate
o         % Convert to numeric array of code points. This gives a matrix where
          % each string is on a row, right-padded with zeros
g         % Convert to logical: nonzeros become 1
!s        % Sum of each row. This gives the length of each word
2$S       % Two-input sort: this sorts the array of strings according to their
          % lengths in increasing order
"         % For each word in the sorted array
  1G      %   Push first input, say 'xyz'
  !       %   Transpose into a column vector of chars
  '.*'Yc  %   Concatenate this string on each row
  !       %   Transpose. This gives a char array which, when linearized in
          %   column-major order, corresponds to 'x.*y.*z.*'
  @g      %   Push corrent word
  w       %   Swap
  XX      %   Regexp matching. Gives a cell array with substrings that match
          %   the pattern 'x.*y.*z.*'
  n       %   Number of matchings
  ?       %   If non-zero
    @     %     Push cell array with current word, to be displayed as output
    .     %     Break loop
          %   Implicit end (if)
          % Implicit end (for)
          % Implicitly display stack

6

PHP , 111 байт

$y=array_map(str_split,preg_grep("#".chunk_split($_GET[1],1,".*")."#",$_GET[0]));sort($y);echo join($y[0]??[]);

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


2
Номерний знак повинен бути рядком, а не масивом. Але вам не потрібен модифікатор.
Тит

@Titus виправлено !!
Йорг Гюльсерманн

You can suppose the case will always be the same in both the word list and the three consonants.- немає необхідності в модифікаторі регулярних виразів. Ви пробували wordwrapзамість join(str_split())?
Тіт

@Titus хороша ідея
Йорг Гюльсерманн

5

Желе ,  12 11  10 байт

ŒPċðÐfLÞḣ1

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

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

Як?

ŒPċðÐfLÞḣ1 - Main link: words; characters
   ðÐf     - filter keep words for which this is truthy:
ŒP         -   the power-set (all sub-sequences of the word in question)
  ċ        -   count (how many times the list of characters appears)
           - ...note 0 is falsey while 1, 2, 3, ... are truthy
       Þ   - sort by:
      L    -  length
        ḣ1 - head to index 1 (would use Ḣ but it yields 0 for empty lists)
           - implicit print (smashes together the list of lists (of length 1))

1
Якщо я правильно розумію ваше пояснення, це відмовиться від слова типу "боррахо" для послідовності приголосних "brc", оскільки "brc" не є підрядком "brrc"
Лев,

@Leo ах, так гарно ловити Я думаю, що це не вдасться ...
Джонатан Аллан

@Leo - добре це виправлено (чеки "існує в" на всю потужність кожного слова), але це може бути не повністю гольф ...
Джонатан Алан

5

Pyth - 22 21 19 12 11 байт

h+f/yTQlDEk

-1 Завдяки Мальтісену.

В якості введення бере 2 рядки. 1-я - 3-літерний рядок (нижній регістр), а 2-й - список малих літер.

Спробуйте тут

Пояснення:

h+f/yTQlDEk
       lDE   # Sort word list by length
  f          # Filter elements T of the word list...
    yT       # by taking the powerset...
   /  Q      # and checking whether the 3-letter string Q is an element of that.
 +        k  # Add empty string to the list (in case no results found)
h            # And take the first result (the shortest)

Старе 19-байтне рішення:

h+olNf/-T"aeiou"QEk                       

@JonathanAllan: Виправлено! Дякуємо, що вказали на це.
Марія

1
@JonathanAllan: Схоже, він редагував питання, щоб уточнити, що в цьому випадку він повинен повернути порожню рядок. Я відповідно відредагував свою відповідь.
Марія

1
У нас є мета-оператор сортування за D, тож ви можете замінити olN на lD
Maltysen

5

Brachylog v2, 11 байт

tlᵒ∋.&h⊆.∨Ẹ

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

Подання функції (У посиланні TIO є аргумент командного рядка для запуску функції як би повноцінною програмою.)

Пояснення

Просто знову прямий переклад специфікації ...

tlᵒ∋.&h⊆.∨Ẹ
t            The last element of {standard input}
   ∋.        contains the return value as an element
     &       and
      h      the first element of {standard input}
       ⊆.    is a subsequence of the return value
         ∨   alternate behaviour if no solution is found:
          Ẹ  return empty string
  ᵒ          tiebreak override: favour answers that have a low
 l           length

Насправді ви можете майже відповісти h⊆.&t∋- міняючи наказ про оцінку, це означає, що Брахілог вибере найкоротшу відповідь за замовчуванням (як це перше обмеження, яке вона бачить , яке має досить зручне "найкоротше" як за замовчуванням прорив), - але в цьому випадку брахілог Алгоритм оцінки, на жаль, перейде в нескінченний цикл, якщо відповідь насправді не знайдеться. Тож майже половина відповіді присвячена розгляду справи про відсутність відповідної відповіді. Вже тоді lᵒперерив "тайбрек" (що технічно є своєрідним)за замовчуванням розрив переважних елементів, що ближче до початку списку), становить лише два байти; інші три походять від необхідності виводити порожню рядок саме тоді, коли вихід не знайдений, на відміну від вартості Брахілога за замовчуванням значення "без рішень" (тому що остаточне .буде неявним, якби нам не потрібно було слідувати за ним ).

Цікаво, що в Брахілозі раніше була реалізована функція, яка зберегла б тут байт. В якій -то момент, ви можете отримати елементи з вхідного аргументу , використовуючи ?₁, ?₂і т.д. синтаксис; це дозволить вам переставити програму на tlᵒ∋.⊇?₁∨Ẹ, що становить лише 10 байт. На жаль, реально використана реалізація насправді не працювала (і призвела до порушення багатьох інших робочих програм), тому її було відмінено. Однак ви можете вважати, що програма є "концептуально" 10 байтами.


4

Хаскелл 129 125 74 байти

import Data.List
l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0

КРЕДИТ до @nimi


1
Ви можете замінити праворуч mapі filterрозуміння списку. Оскільки у вас вже є Data.Listсфера застосування, ви можете використовувати sortOn lengthта вибрати головку, щоб знайти елемент з мінімальною довжиною. Нарешті, зробіть yфункцію інфіксації. Все це робить fі kзайвим: l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0.
німі

ти правий! Я тільки почав займатися гольфом! Спасибі!
Давід Спартаро

1
Ще один: якщо перемкнути імпорт в Data.Lists, ви можете використовувати argminзамість sortOnі зберегти !!0: l#w=argmin length[...]. Data.Listsмає багато приємних функцій
німі

3

Perl, 53 байти

48 байт код + 5 для -paF.

$"=".*";($_)=sort{$a=~y///c-length$b}grep/@F/,<>

Це має перевагу того факту , що списки інтерпольовані в m//оператора використовувати $"змінні , яка змінює вихідну рядок введення від psrдо , p.*s.*rякий потім відповідають для кожного додаткового слова і упорядковано на length.

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


Якщо я вставив "adsd" у ваш список, програма не зможе його знайти. Перший символ, який потрібно знайти, не повинен бути першим у слові.
Чарлі

@CarlosAlejo Для введення даних потрібна нова лінія, працює добре: Спробуйте в Інтернеті! . Це все ж застало мене поза охороною, оскільки <<<оператор додає це для мене в командному рядку!
Дом Гастінгс

3

JavaScript (ES6), 77 75 72 байт

Візьме 3 приголосні cта список слів lу синтаксисі каррі (c)(l). Обидва входи очікуються в одному випадку.

c=>l=>l.map(w=>x=!w.match([...c].join`.*`)||!x[w.length]&&x?x:w,x='')&&x

Тестові справи


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`)) за 72, я думаю
LarsW

@LarsW Дійсно, дякую! Однак я обрав інший підхід для дотримання нового правила: або порожній рядок, якщо жодне слово не відповідає шаблону трьох приголосних .
Арнольд

3

R, 101 байт

Перший раз гольф! Я впевнений, що це можна якось зменшити

Бере рядок x і символьний вектор y можливих входів

w=pryr::f((b=y[sapply(gsub(paste('[^',x,']'),'',y),function(l)regexpr(x,l))>0])[which.min(nchar(b))])

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

Редагувати: Моя версія була 135, дякую Scrooble за -34!


1
Ласкаво просимо до PPCG! Це виглядає як фрагмент, де вхід знаходиться у твердо кодованих змінних. Відповіді повинні бути або повноцінними програмами, або функціями, що телефонують. Ви можете ознайомитися з цим (або іншими відповідями на R) щодо можливих методів вводу / виводу.
Мартін Ендер

2

Сітківка , 58 байт

O#$^`¶.+
$.&
s`^((.)(.)(.).*¶(?-s:(.*\2.*\3.*\4.*)))?.*
$5

Спробуйте в Інтернеті! Бере три приголосні на одному рядку, а потім список слів у всіх наступних рядках. Пояснення: Oсортує список, ¶.+виключаючи перший рядок, #цифровий $набір за $.&довжиною. Потім шукається відповідність лінії, що включає в себе три приголосні по порядку. Якщо існує відповідний рядок, ніж останній, тобто найкоротший, такий рядок стає висновком, інакше вихід порожній. ?-s:Тимчасово вимикає ефект , s`так що тільки одна лінія відповідає.


1
Я не можу визначити, чи це три пупок або три груди.
Чарлі

@CarlosAlejo Ви думаєте про Ексцентрику Галлумбітс випадково?
Ніл

Я думав про прибульця з Total Recall, але Ексцентрика теж може бути варіантом ... :)
Чарлі

2
@CarlosAlejo Мабуть, Мері - це шана Ексцентрика Галлумбітса.
Ніл

1

Піп , 17 байт

@:qJ`.*`N_FI#_SKg

Візьме список слів як аргументи командного рядка, а приголосні з stdin. Спробуйте в Інтернеті!

Пояснення

                   g is list of cmdline args (implicit)
              SKg  Sort g using this key function:
            #_      Length of each item (puts shortest words first)
          FI       Filter on this function:
  q                 Line of input
   J`.*`            joined on regex .* (turns "psr" into `p.*s.*r`)
        N_          Count regex matches in item (keeps only words that match)
@:                 Get first element of result (using : meta-operator to lower precedence)
                   If the list is empty, this will give nil, which results in empty output

1

Java 8, 132 126 байт

s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}

-6 байт завдяки @Nevay .

Пояснення:

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

s->a->{              // Method with two String-array parameters and String return-type
  String r="";       //  Result-String, starting empty
  for(String x:a)    //  Loop over the words
    r=(x.length()<r.length()
                     //   If a word is smaller than the current `r`,
      |r.isEmpty())  //   or `r` is still empty
      &x.matches(r.format(".*%s.*%s.*%s.*",s))?
                     //   And if the word is valid
       x             //    Change `r` to the current word
      :              //   Else:
       r;            //    Leave `r` the same
  return r;}         //  Return the result

1
126 байт:s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
Невай


0

MATL , 28 27 26 байт

x"l1G@g3XNXm/@gn*v]&X<2Gw)

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

x- Неодмінно візьміть перший ввід (рядок з трьома літерами) та видаліть його. Копіюється автоматично у буфер обміну G, рівень 1 (ця частина була натхненна відповіддю @Luis Mendo ).

" - Неодмінно візьміть другий вхід (масив комірок слів), перейдіть через нього.

l - Натисніть 1, щоб пізніше використовувати

1G - натисніть перший ввід (скажіть "psr")

@g - Натисніть на поточне слово як масив

3XN- nchoosek- Отримайте всі комбінації 3 букв із слова

Xm- Перевірте, чи є код номерного знака 'psr' однією з цих комбінацій. Повертає 0 для помилкових та 1 для істинних.

/- Поділ 1 (що ми підштовхували раніше) за цим результатом. Змінює 0s на Infs

@gn - Отримайте довжину поточного слова

*- Помножте довжину на результат ділення. Повертає таку довжину, коли слово містить 3 символи, інакше повертаєтьсяInf

v - вертикально з'єднайте ці результати в єдиний масив

] - закрити петлю

&X< - отримати індекс мінімального значення з цього масиву, тобто індексу, де було знайдено слово, що містить літери та з мінімальною довжиною

2G - Знову натисніть другий вхід

w - Поверніть міні-індекс на вершину стека

) - Індексуйте в масив слів з мінімальним індексом, повертаючи дійсне слово з мінімальною довжиною

(Неявний вихід.)


Старіші:

x"@g1Gy3XNXm1w/wn*v]&X<2Gw)

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.