낡은 타일 글자 맞추기


35

문제

숲 한가운데에 오두막에 갇혀 있으며, 오래된 스크래블만으로도 즐겁게 지낼 수 있습니다. 검사 결과 글자 맞추기가 너무 마모되어 각 글자의 점만 표시됩니다.

그럼에도 불구하고 당신은 게임을하기로 결정합니다. 가방에서 7 개의 편지를 꺼내 트레이에 놓으면 해당 편지의 내용을 결정해야합니다.

따라서 일반적으로 점 목록이 있으면 가능한 모든 문자열 또는 문자 목록으로 변환됩니다.


스크 러블 타일 및 배포

  • 빈 타일 2 개 (점수 0 점)
  • 1 점 : E × 12, A × 9, I × 9, O × 8, N × 6, R × 6, T × 6, L × 4, S × 4, U × 4
  • 2 점 : D × 4, G × 3
  • 3 점 : B × 2, C × 2, M × 2, P × 2
  • 4 점 : F × 2, H × 2, V × 2, W × 2, Y × 2
  • 5 점 : K × 1
  • 8 점 : J × 1, X × 1
  • 10 점 : Q × 1, Z × 1

당신이 지점의 목록이있는 경우 그래서 [10,10,8,5,1,1,1]다음 "QZJKEEE"유효 할 것이지만 "QQJKEEE"(가방 만 1 개 Q 타일 있기 때문에) 유효하지 않을 것이다


문제 별 규칙

  • 모든 입력이 유효하고 항상 7 개의 타일이 있다고 가정 할 수 있습니다 (즉, 7 개의 10 포인트 타일 목록이 아니며 9 타일이 아님)
  • 가방에서 이전에 타일을 가져 오지 않았다고 가정 할 수 있습니다 (따라서 분포는 위에 정의 된 영어 타일의 표준 분포입니다)
  • 유효한 단어를 생성 할 필요는없고 유효한 문자열 만 생성하면됩니다.
  • 각 타일마다 해당 문자가있는 한 문자열의 순서는 관련이 없습니다.
  • 포인트는 위에 정의 된 표준 영어 글자 맞추기 타일 포인트를 기반으로합니다.
  • 빈 타일의 경우 공백 문자 또는 밑줄 '_'을 출력 할 수 있습니다. 대문자 또는 소문자로 출력 할 수 있습니다.
  • 답은 List, String, Array 또는 Sequence와 같은 타일을 합리적으로 표현할 수 있습니다.

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례

가능한 모든 값을 출력 할 수 있기 때문에 엄격한 테스트 사례를 정의하기가 어렵습니다.

유효한 반환 값 이 가능한 경우 :

[10,0,10,5,8,8,0] -> "Q ZKJX "
[1,1,1,1,1,1,1] -> "EEEEEEE"
[1,2,3,4,5,8,0] -> "NDBHKJ "
[2,2,2,2,2,2,2] -> "DGDGDGD"

잘못된 반환 값 이있는 경우 :

[10,0,10,5,8,8,0] -> "Q QKJX "  - Too many Qs 
[1,1,1,1,1,1,1] -> "EEEEEE "  - Space is 0 points not 1
[1,2,3,4,5,8,0] -> "NDBH" - Too short
[1,2,3,4,5,8,0] -> "NDBHKJ  I" - Too long
[1,2,3,4,5,8,0] -> "ÉDBHKJ1" - Contains none scrabble characters
[2,2,2,2,2,2,2] -> "GDGDGDG" - Contains too many Gs (case for invalid cycling)

문자열을 출력해야합니까, 아니면 목록이 괜찮습니까?
Maltysen

리스트를 출력 할 수 있습니다. 질문을 업데이트하겠습니다.
만료 된 데이터

1
공백으로 무엇을 출력 할 수 있습니까?
Maltysen

3
권장 테스트 사례 : [2,2,2,2,2,2,2]( 사이클링 방법을 사용 D하는 G경우가 아니라 시작하는 것이 중요한 유일한 경우 )
Arnauld

1
알림은 @이며 공백이없는 사람의 이름입니다. 즉 만료 된 데이터 는 @ExpiredData가됩니다.
Tau

답변:


8

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

@supercat에서 제안한 더 짧은 변형

a=>a.map(o=n=>'?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])

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


자바 스크립트 (ES6),  137 ... 84 78 77  76 바이트

Neil의 사이클링 방법 을 사용하여 10 바이트 절약

타일 ​​목록을 반환합니다. _빈 타일에 사용 합니다.

a=>a.map(o=n=>"____FHVWGDGD_K__BCMPEEEE_ZQ__XJ"[n*20%44%32+(o[n]=-~o[n])%4])

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

어떻게?

각 포인트 수에 대해 각 그룹 의 두 번째 타일 부터 시작하여 정확히 4 개의 타일 그룹을 순환합니다 (이는 Gvs에 중요합니다 D).

 points | group | max. sequence
--------+-------+---------------
    0   | ____  | __
    1   | EEEE  | EEEEEEE
    2   | GDGD  | DGDGDGD
    3   | BCMP  | CMPBCMP
    4   | FHVW  | HVWFHVW
    5   | _K__  | K         \
    8   | _XJ_  | XJ         }--- these letters may only appear once each
   10   | _ZQ_  | ZQ        /

이 모든 그룹은 31 문자의 단일 문자열로 저장됩니다.

____FHVWGDGD_K__BCMPEEEE_ZQ__XJ
^   ^   ^   ^   ^   ^   ^   ^
0   4   8  12  16  20  24  28

주의 : 결승전 "_""_XJ_"에 액세스 할 수 없으므로에 저장하지 않아도됩니다 .

nin

in=((20×n)mod44)mod32

  n | *20 | mod 44 | mod 32 | group
----+-----+--------+--------+-------
  0 |   0 |    0   |    0   | ____
  1 |  20 |   20   |   20   | EEEE
  2 |  40 |   40   |    8   | GDGD
  3 |  60 |   16   |   16   | BCMP
  4 |  80 |   36   |    4   | FHVW
  5 | 100 |   12   |   12   | _K__
  8 | 160 |   28   |   28   | _XJ_
 10 | 200 |   24   |   24   | _ZQ_

각 그룹의 현재 위치는 객체 저장됩니다 .o


매번 o [n]을 8 씩 증가 시키면 전진을 위해 한 명의 추가 캐릭터가 필요하지만, 순 승리를 위해서는 % 4와 % 32를 모두 & 31로 대체 할 수 있습니다. 귀하를 기반으로 한 최선의 방법은입니다 a=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])). 더 짧고 "거의"버전 a=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))이지만이 방법을 사용하면 값 8과 10을 11과 12에 매핑하는 간단한 방법과 함께 문자열을 약간 조정하여 한 번에 하나씩 문제를 해결해야합니다.
supercat

@ supercat 좋은 소리! 내일 자세히 살펴 보겠습니다.
Arnauld

@supercat 또 다른 흥미로운 공식은 '_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E'이며 조회 문자열은 22 자입니다. 그러나 전체 코드는 여전히 솔루션보다 2 바이트 더 깁니다.
Arnauld

7

, 33 바이트

⭆觧⪪”&↖“Vh_z↶∕¡⌈∨₂χ¹‖◨⌊″”¶ι№…θκι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

 θ                  Input array
⭆                   Map over elements and join
     ”...”          Literal string " \nE\nDG\nBCMP\nFHVW\nK\n\n\nJX\n\nQZ"
    ⪪     ¶         Split on newlines
   §       ι        Indexed by current element
  §                 Cyclically indexed by
            №…θκι   Number of times current element has already appeared
                    Implcitly print

5

젤리 ,  31 30 27  26 바이트

“ñẒẎYñ(“Nut¦hß’ṃØA;€⁶ɓṢĖœị

문자 목록을 생성하는 정수 목록을 허용하는 모나드 링크.
-나의 이전, 아래의 엉망, 그리고 Nick Kennedy의 개선

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

출력은 입력과 동일한 순서로 제공되지 않습니다 (허용됨).

대답에 언어에 내 자신의 추가 2 개를 사용하면 자주 발생하지 않습니다! ( 그리고 ɓ여기).

어떻게?

“...“...’ṃØA;€⁶ɓṢĖœị - Link: list of integers, V     e.g. [10,1,0,3,2,1,10]
“...“...’            - list of base 250 integers          [28089224382041, 77611203526272]
          ØA         - 'ABC...XYZ'
         ṃ           - base decompress (vectorises)       ["EDMFKZZJZQ", "NGPYKZZXZZ"]
            ;€       - for €ach: concatenate:
              ⁶      -   a space                          ["EDMFKZZJZQ ", "NGPYKZZXZZ "]
               ɓ     - start a new dyadic chain with swapped arguments - i.e. f(V,that)
                Ṣ    - sort                               [0,1,1,2,3,10,10]
                 Ė   - enumerate                          [[1,0],[2,1],[3,1],[4,2],[5,3],[6,10],[7,10]]
                  œị - multi-dimensional index into       " NEGMZQ"
                       (1-based and modular)

이전 @ 30

“²rṛʂṂø5=Ɓṇ^N¥Y»⁾tky;⁶s2ɓṢĖUœị

문자 목록을 생성하는 정수 목록을 허용하는 모나드 링크.

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

이 출력도 대소 문자가 혼합되어 있습니다 (허용됨).

어떻게?

“...»⁾tky;⁶s2ɓṢĖUœị - Link: list of integers, V          e.g. [10,1,0,3,2,1,10]
“...»               - compression of dictionary entries:
                    -   "end", "GMP", "fyttes", "adj", and "xci" and the string "qz"
                    -                                         "endGMPfyttesadjxciqz"
        y           - translate with:
     ⁾tk            -   ['t', 'k']                            "endGMPfykkesadjxciqz"
         ;⁶s2ɓṢĖUœị - ...
                    - ...then like the above method (except U reverses each pair of indices)
                                                              " neGMzq"

첫 설명에 오타가 있다고 생각합니다. ' NWGMZQ'다차원 인덱스 후에는 W문자열에 아무런 의미가 없습니다 . ;)
Kevin Cruijssen

1
@ KevinCruijssen-yws, 오타 fixwd; 감사!
Jonathan Allan

4

Pyth- 92 86 83 81 80 75 60 52 49 42 36 바이트

사용 가능한 문자가 튀어 나와 입력을 반복합니다. 나는 그 점 범주에 대해 7을 제공하는 각 문자 중 하나를 가지고 있습니다. 이제 압축 문자열 인코딩을 사용합니다.

K[M*L7c."B_êº çÑOÒ
7âCkÑ"\Lm.)@K

K                       Assign to K       
 [M                     Map list(for popping). Uses a quirk of M to splat each first
  *L7                   Map repeating each string by 7
   c      \L            Split on occurrences of 'L'
    ."..."              Packed string encoding of the needed letters
m              (Q)      Map on input (input is taken implicitly)
 .)                     Pop. This returns the first element after removing it
  @K                    Index into K
   (d)                  The loop variable is given implicitly

Btw, 이것은 인코딩 전의 원래 문자 문자열 "_ E DG BCMP FHVW K JX QZ"입니다.

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



3

05AB1E , 70 52 39 38 29 26 25 바이트

{ε.•3Oû}α›ηö‡.ÝŽ{•2ôÁyèNè?

-18 덕분에 바이트 @ExpiredData . @Maltysen 의 Pyth 응답
에서 크기 7까지 동일하게 사용하여 -13 바이트 . @JonathanAllan 의 Jelly 답변 포트를 생성하여 -9 바이트 이므로 그를 찬성해야합니다. @Emigna 덕분에 -3 바이트 .

문자 목록을 생성하고 소문자와 공백을 공백으로 사용합니다.

온라인으로 시도 하거나 더 많은 테스트 사례를 확인 하십시오 .

설명:

{                      # Sort the (implicit) input-list
 ε                     # Map each character `y` in this list to:
  .•3Oû}α›ηö‡.ÝŽ{•     #  Push compressed string "endgmpfykkzzzzjxzzqz "
                  2ô   #  Split into parts of size 2
                    Á  #  Rotate it once towards the left so the space is leading
  yè                   #  Use integer `y` to index into the string-pairs
    Nè                 #  Then get the `N`'th character of the string-pair (with automatic
                       #   wraparound), where `N` is the index of the loop

이 05AB1E 광산의 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 이유를 이해하는 .•3Oû}α›ηö‡.ÝŽ{•것입니다 "endgmpfykkzzzzjxzzqz ".


이전 38 바이트 답변 :

.•Mñ&Àû«ì{₆v*Å+µ-•#ðšε7∍}IvDyèн©?ε®õ.;

온라인으로 시도 하거나 더 많은 테스트 사례를 확인 하십시오 .

설명:

.•Mñ&Àû«ì{₆v*Å+µ-•    # Push compressed string "e dg bcmp fhvw k   jx  qz"
                  #   # Split on spaces: ["e","dg","bcmp","fhvw","k","","","jx","","qz"]
                   ðš # Prepend a space to this list
 ε7∍}                 # Extend each string to size 7:
                      #  ["       ","eeeeeee","dgdgdgd","bcmpbcm","fhvwfhv","kkkkkkk","","","jxjxjxj","","qzqzqzq"]
     Iv               # Loop `y` over the input-list:
       Dyè            #  Get the `y`'th string from a copy of the list
          н           #  Get it's first character
           ©?         #  Store it in the register, and print it without trailing newline
        ε             #  Then map each string in the list to:
         ®õ.;         #   Remove the first occurrence of the character from the register

이 05AB1E 광산의 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 이유를 이해하는 .•Mñ&Àû«ì{₆v*Å+µ-•것입니다 "e dg bcmp fhvw k jx qz".


사용할 수 없습니까 " 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"?
만료 된 데이터

물론 @ExpiredData 아. 당신은 단지 7 글자를 그립니다. 감사합니다! 그것을 바꿀 것입니다.
Kevin Cruijssen

1
{v대신 7Fy대신에 3 바이트를 저장할 수 있습니다 I{Nè.
Emigna

@Emigna 아 물론입니다. 감사합니다!
Kevin Cruijssen



1

젤리 , 34 32 바이트

“¿RÇĊƈ⁸⁾%ỵṆþœsṀṂ’ṃØAṣ”A;⁶ẋ€7⁸ịḢ€

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

나는 이것을 쓸 때 짧은 젤리 답변이 있다는 것을 보지 못했고 이것은 다른 접근법을 사용하므로 게시 할 가치가 있다고 생각했습니다.

2 바이트를 절약 한 @JonathanAllan에게 감사합니다!


base-decompression을 사용 하면 2 바이트를 절약 할 수 있습니다.
Jonathan Allan

1

파이썬 (3) , 178 (142) 135 127 112 117 바이트

def f(l):
 d=list(map(list,"  _EEEEEEE_DDDDGGG_BBCCMMP_FFHHVVW_K___JX__QZ".split('_')))
 return[d[i].pop()for i in l]

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

cdlane 덕분에 -1 바이트

mathmandan 덕분에 정확한


"-> in"in 111
cdlane

d=list(map(list,"...".split('_')))다른 바이트 저장
cdlane

이 함수 f는 이름을 지정할 필요가 없으므로 2 바이트를 절약 할 수 있습니다. 그러나 f의 항목을 사용 d하므로 "제출을 수반하는 다른 코드를 레스트하지 않고 기능을 임의로 재사용 할 수 있어야한다"는 합의 요구 사항에 맞는지 잘 모르겠습니다. 예를 들어, f([10,0,10,5,8,8,0])두 번 이상 실행 하면 오류가 발생합니다. 여기에서 메타 토론을 참조하십시오. codegolf.meta.stackexchange.com/a/7615/36885
mathmandan

0

파이썬 2 , 102 바이트 (또는 아마도 95?)

(파이썬 3에도 좋습니다.)

lambda a:''.join([r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a))

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

나는 다음이 받아 들여질 것이라고 생각하지 않는다.

lambda a:[[r*7for r in'_ E DG BCMP FHVW K * * JX * QZ'.split()][x][:a.count(x)]for x in set(a)]

이 두 번째 버전은 다음과 같은 출력을 제공합니다 ['__', 'JX', 'QZ', 'K']. 따라서 글자는 정확하지만 포인트 값으로 수집됩니다. (만약 이것이 허용된다면 7 바이트를 절약 할 수 있습니다.)


0

PHP , 101 바이트

$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($argv as$t){echo$c=($d=$b[$t])[0];$b[$t]=substr($d,1).$c;}

독립형 프로그램으로 명령 행을 통해 입력하십시오.

$ php s.php 10 0 10 5 8 8 0
"Q_ZKJX_"

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

또는 함수로서 112 바이트

function($a){$b=[_,E,DG,BCMP,FHVW,K,8=>JX,0,QZ];foreach($a as$t)$b[$t]=substr($d=$b[$t],1).$c[]=$d[0];return$c;}

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

산출

[10,0,10,5,8,8,0]   "Q_ZKJX_"
[1,1,1,1,1,1,1]     "EEEEEEE"
[1,2,3,4,5,8,0]     "EDBFKJ_"
[2,2,2,2,2,2,2]     "DGDGDGD"


0

펄 6 , 63 바이트

*>>.&{(<_ E DG BCMP FHVW K _ _ JX _ QZ>[$_]x 7).comb[%.{$_}++]}

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

<_ E DG BCMP FHVW K _ _ JX _ QZ> # array indexed on tile value
(<...>[$_] x 7)     # pull letters for this value, repeat 7 times to catch E
          %         # anonymous stateful hash
           .{$_}    # element for this tile value
                ++  # post increment value to move position
       .comb[...]   # characters to array, pull this incrementing index

따라서 기본적으로 각 타일 값에 대한 오프셋 조회를 유지하고 오프셋을 사용하여 사용 가능한 세트에서 문자를 가져와 필요한만큼 증가시킵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.