스페인 번호판 게임


26

이 질문은 기반으로 내가 묻는 질문스페인어 . 예, 스페인어로 된 알고리즘을 요청했습니다. :)

스페인에서는 현재 번호판이 다음과 같은 패턴을 갖습니다.

1234 XYZ

여기서 XYZ는 전체 스페인어 자음 세트에서 가져온 세 자음입니다 ( 'Ñ'제외).

때로는 아내와 함께 여행 할 때 게임을하기 위해 사용합니다. 우리는 번호판을 볼 때 3 개의 자음을 취하여 번호판과 같은 순서로 나타나는 3 개의 자음을 포함하는 단어를 만들려고합니다. 예 (스페인어) :

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.
  • 스페인어 자음은 영어와 정확히 동일하며 "Ñ"가 추가됩니다. 모음은 "áéíóúü"라는 강조된 모음의 표현과 동일합니다. "-"또는 " '"와 같은 다른 종류의 마크는 없습니다.
  • 단어 목록과 세 자음 모두에서 대소 문자가 항상 같다고 가정 할 수 있습니다.

실제 스페인어 단어 모음으로 알고리즘을 테스트하려면 백만 개가 넘는 단어가 포함 된 Dropbox에서 파일 (15.9MB)을 다운로드 할 수 있습니다 .

테스트 사례

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'

이것은 이므로 아내가 항상이기는 ​​것을 돕는 가장 짧은 프로그램 일 수 있습니다! :)


단어 목록의 단어는 얼마나 오래 보장됩니까?
Neil

2
실제 번호판에서 문자 Q 도 허용되지 않습니다. 및 W는 하지 적절한 스페인어 편지 비록입니다
루이스 Mendo

2
목록의 단어를 가정하고 세 글자가 모두 하나의 경우에 적용될 수 있습니까?
Jonathan Allan

1
@LuisMendo W1969 년 이래로 스페인 편지 였습니다 .
walen

1
@walen 그래서 나는 "적절한"이라고 말했다 :-) 그것은 스페인어로 존재하지만 외국 느낌입니다
루이스 멘도

답변:


7

05AB1E , 10 8 바이트

Leo 덕분에 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왜 이것이 필요합니까?
Leo

1
@ 레오 : 아니, 그건 바보입니다. 감사합니다 :)
Emigna

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

@Titus 고정!
Jörg Hülsermann 2016 년

You can suppose the case will always be the same in both the word list and the three consonants.-정규식 수정자가 필요하지 않습니다. wordwrap대신 사용해 보셨습니까 join(str_split())?
Titus

@Titus good idea
Jörg Hülsermann 2016 년

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"는 "brrc"의 하위 문자열이 아니기 때문에 "brc"의 자음 시퀀스에 대해 "borracho"와 같은 단어를 거부합니다.
Leo

@ 레오 아, 그래, 좋은 캐치 나는 그것이 실패 할 것이라고 생각 ...
Jonathan Allan

@ 레오-잘 고정되어 있습니다 (각 단어의 전체 전원 세트에 대해 "존재"를 확인)하지만 완전히 골프되지 않을 수 있습니다 ...
Jonathan Allan

5

Pyth- 22 21 19 12 11 바이트

h+f/yTQlDEk

-1 Maltysen에게 감사합니다.

2 줄을 입력으로받습니다. 첫 번째는 3 글자 문자열 (소문자)이고 두 번째는 소문자 단어 목록입니다.

여기 사용해보십시오

설명:

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 :이 경우 빈 문자열을 반환해야한다는 것을 명확히하기 위해 질문을 편집 한 것 같습니다. 그에 따라 답변을 편집했습니다.
Maria

1
u는 신분증과 OLN 교체 할 수 있도록 우리는 일종의별로 D 메타 연산자를 가지고
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

실제로 목록의 시작 부분에 가까운 요소를 선호하는 기본 순위 지정으로 거의 응답 할 수 있습니다. )는 단지 2 바이트입니다. 다른 세 개는 Brachylog의 기본 "솔루션 없음"센티넬 값과 달리 출력을 찾을 수 없을 때 빈 문자열을 출력 할 필요 가 있습니다 .h⊆.&t∋ - Brachylog은 (그것이 보는 첫 번째 제약 조건으로 기본적으로 짧은 답을 선택할 것이라는 평가 순서 수단을 교환 하지만,이 경우에, Brachylog의 - 오히려 편리한 "짧은"기본 타이 브레이크 등이있다) 실제로 답변을 찾지 못하면 평가 알고리즘은 불행히도 무한 루프로 들어갑니다. 따라서 답변의 거의 절반이 적절한 답변이없는 경우를 처리하는 데 전념합니다. 그럼에도 불구하고 lᵒ타이 브레이크 재정의 (기술적으로는 일종의.

흥미롭게도, 이전에 Brachylog에서 구현되어 여기에 바이트를 저장 한 기능이 있습니다. 어느 시점 ?₁에서 ?₂, 등을 사용하여 입력 인수에서 요소를 추출 할 수 있습니다. 그러면 프로그램을 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있으므로 헤드를 사용 하고 선택하여 최소 길이의 요소를 찾을 수 있습니다. 마지막으로, yinfix 함수를 만드십시오 . 이 모든 차종 fk불필요한 : l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0.
nimi

네가 옳아! 나는 방금 골프를 시작했다! 감사!
Davide Spataro 2012 년

1
하나 더 : 당신이 가져 오기를 전환하는 경우 Data.Lists, 당신이 사용할 수있는 argmin대신 sortOn과 저장 !!0: l#w=argmin length[...]. 좋은 기능Data.Lists많이 있습니다
nimi

3

펄, 53 바이트

48 바이트 코드 + 5 -paF.

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

이것은 보간으로 나열한다는 사실을 활용 m//조작자가 이용할 $"에서 초기 입력 문자열을 변경 변수 psrp.*s.*r각각의 추가 단어와 매칭되는에 정렬된다 length.

온라인으로 사용해보십시오!


목록에 "adsd"를 삽입하면 프로그램에서 찾지 못합니다. 찾은 첫 번째 문자는 단어의 첫 번째 문자 일 필요는 없습니다.
Charlie

@CarlosAlejo 입력은 후행 줄 바꿈이 필요합니다 . . <<<운영자가 명령 줄에서 나를 추가 함에 따라 그것은 나를 조심스럽게 잡아 냈습니다 !
Dom Hastings

3

자바 스크립트 (ES6), 77 75 72 바이트

3 개의 자음 cl카레 구문 의 단어 목록을 가져옵니다 (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 참으로 감사합니다! 그러나 새 규칙을 준수하기 위해 다른 접근법을 선택했습니다 . 세 자음 패턴과 일치하는 단어가없는 경우 빈 문자열 입니다.
Arnauld

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였습니다. -34의 Scrooble에 감사드립니다!


1
PPCG에 오신 것을 환영합니다! 이것은 입력이 하드 코딩 된 변수에있는 스 니펫과 같습니다. 답은 완전한 프로그램이거나 호출 가능한 함수 여야합니다. 가능한 I / O 방법에 대해 이것 (또는 다른 R 답변)을 살펴볼 수 있습니다 .
Martin Ender

2

망막 , 58 바이트

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

온라인으로 사용해보십시오! 세 개의 자음을 한 줄에 취한 다음 모든 후속 줄에있는 단어 목록을 가져옵니다. 설명 : 길이를 기준으로 숫자가 지정된 첫 번째 행을 제외 O하고 목록을 정렬합니다 . 그런 다음 세 자음이 순서대로 포함 된 줄을 찾습니다. 적합한 라인이 마지막 라인보다 존재하는 경우, 즉 가장 짧은 라인은 출력이되고, 그렇지 않으면 출력은 비어 있습니다. 은 일시적으로 효과 꺼집니다 만 한 줄이 일치되도록합니다.¶.+#$$.&?-s:s`


1
그것들이 3 개의 배꼽인지 3 개의 가슴인지는 결정할 수 없습니다.
Charlie

@CarlosAlejo 우연히 Eccentrica Gallumbits를 생각하고 있습니까?
Neil

Total Recall에서 외계인을 생각하고 있었지만 Eccentrica도 옵션이 될 수 있습니다 ... :)
Charlie

2
@CarlosAlejo 분명히 Mary는 Eccentrica Gallumbits에 경의를 표합니다.
Neil

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

자바 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;}

@Nevay 덕분에 -6 바이트 .

설명:

온라인으로 사용해보십시오.

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;}
Nevay


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'이 이러한 조합 중 하나인지 확인하십시오. false는 0, true는 1을 반환합니다.

/-이 결과로 1 (앞서 밀었던)을 나눕니다. 0을 Infs로 변경

@gn -현재 단어의 길이를 가져옵니다

*-길이에 나누기 결과를 곱하십시오. 단어에 3자를 포함 할 때의 길이를 그대로 반환합니다. 그렇지 않으면Inf

v -이러한 결과를 단일 배열로 수직으로 연결

] -폐회로

&X< -해당 배열에서 최소값의 색인을 가져옵니다. 즉, 문자를 포함하고 최소 길이의 단어가있는 색인

2G -두 번째 입력을 다시 누릅니다

w -최소 인덱스를 스택 맨 위로 가져옵니다.

) -최소 색인이있는 단어 배열로 색인하여 최소 길이의 유효한 단어를 반환합니다.

(암시 적 출력)


더 오래된 :

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

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.