Aşınmış fayans Scrabble


35

Sorun

Ormanın ortasındaki bir kabinde sıkışıp kalıyorsun, sadece kendini eğlendirmek için eski bir hurda takımı ayarlanmış. İncelemenin ardından scrabble harflerin o kadar yıpranmış olduğunu, sadece her harf için olanların görülebildiğini görüyorsunuz.

Yine de bir oyun oynamaya karar veriyorsun. Torbadan yedi harf alıyorsunuz ve onları tepsinize koyuyorsunuz, zorluğunuz bu harflerin ne olabileceğini belirlemektir.

Genelde, bir nokta listesi verilen herhangi bir dize veya harf listesine dönüştürün.


Scrabble Fayans ve Dağılımları

  • 2 boş karo (0 puan)
  • 1 puan: E × 12, A × 9, I × 9, O × 8, N × 6, R × 6, T × 6, L × 4, S × 4, U × 4
  • 2 puan: D × 4, G × 3
  • 3 puan: B × 2, C × 2, M × 2, P × 2
  • 4 puan: F × 2, H × 2, V × 2, G × 2, Y × 2
  • 5 puan: K × 1
  • 8 puan: J × 1, X × 1
  • 10 puan: Q × 1, Z × 1

Eğer bir puan listeniz varsa, [10,10,8,5,1,1,1]o "QZJKEEE"zaman geçerli olur, ancak geçerli "QQJKEEE"olmaz (çantada sadece 1 Q kiremit olduğundan)


Soruna Özel Kurallar

  • Tüm girdilerin geçerli olduğunu ve her zaman 7 fayans olacağını varsayabilirsiniz (yani, yedi 10 punto fayans listesi olmayacak ve 9 fayans olmayacaktır).
  • Daha önce torbadan çini çekilmediğini varsayabilirsiniz (bu nedenle dağıtım yukarıda tanımlandığı şekilde ingilizce çinilerin standart dağılımıdır)
  • Geçerli bir kelime, sadece geçerli bir harf dizesi oluşturmak zorunda değilsiniz.
  • İpinizin sırası, her bir kiremit için karşılık gelen bir harf olduğu sürece önemsizdir.
  • Puanlar, yukarıda tanımlandığı şekilde standart ingilizce scrabble döşeme puanlarına dayanmaktadır.
  • Büyük veya küçük harflerle çıktı alabilirsiniz; boş bir döşeme için boşluk karakteri ya da alt çizgi '_' çıktısı alabilirsiniz.
  • Cevabınız Liste, Dize, Dizi veya Sıra gibi döşemelerin herhangi bir makul gösterimi olarak verilebilir.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test Kılıfları

Açıkçası, olası herhangi bir değeri verebildiğiniz için sıkı test durumları tanımlamak zordur.

Olası bir geçerli dönüş değeri olan bazı durumlar :

[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"

Geçersiz dönüş değeri olan bazı durumlar :

[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)

Bir dizge çıkarmam gerekiyor mu yoksa bir liste tamam mı?
Maltysen

Bir liste çıktısı alabilirsiniz, ben soruyu güncelleyeceğim
Süresi dolmuş veriler

1
Boşluk için ne yazdırabilirim?
Maltysen

3
Önerilen test durumu: [2,2,2,2,2,2,2]( bir bisiklet yöntemi kullanılıyorsa Dziyade başlamanın önemli olduğu tek durum G)
Arnauld

1
Bildirimler @ alanından sonra kişinin adıdır. Yani Süresi Dolmuş Veriler , @ExpiredData olur.
Tau

Yanıtlar:


8

JavaScript (ES6), 72 bayt

@Supercat tarafından önerilen daha kısa bir değişken

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

Çevrimiçi deneyin!


JavaScript (ES6),  137 ... 84 78 77  76 bayt

Neil'in bisiklet yöntemini kullanarak 10 bayt kurtardı

Bir kiremit listesi döndürür. _Boş fayanslar için kullanır .

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

Çevrimiçi deneyin!

Nasıl?

Her sayı için , her grubun ikinci kutucuğu ile başlayan, tam olarak 4 kutucuktan oluşan bir grup arasında geçiş yapıyoruz (bu, Gvs için önemlidir 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        /

Tüm bu gruplar tek bir 31 karakter dizisi olarak saklanır:

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

NB : Biz nihai depolanması gerekmez "_"in "_XJ_"yine erişilebilir asla gibi.

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_

Her gruptaki geçerli konum nesnede saklanır .o


Her seferinde o [n] 8 ile ilerlemek, ilerleme için bir ekstra karaktere mal olur, ancak bir net kazanç için% 4 ve% 32'nin ikisini de & 31 ile değiştirmesine izin verir. Elimden gelenin en iyisini yapacağım a=>a.map(o=n=>('?ED?BWQ?_EG?CFZ?_EDJMH?K?EGXPV'[n*9.4+(o[n]=7-~o[n])&31])). Daha kısa, "neredeyse" bir versiyon ise a=>a.map(o=n=>("_EDBFK_EDCHJQEGMVXZEGPW"[n+(o[n]=5-~o[n])%24]))bu yaklaşımın 8 ve 10 ile 11 ve 12 arasındaki değerleri eşleştirmek için kompakt bir yol ve ayrıca bir bire bir sorunu çözmek için dizeye hafif bir ayarlama yapması gerekiyor.
Supercat,

@supercat Kulağa hoş geliyor! Yarın daha yakından bakacağım.
Arnauld,

@supercat Başka bir ilginç formül, '_??VKWZHQFP?M?CGBGXDJD'[(n*96+(o[n]=32-~o[n]))%68%33]||'E'sadece 22 karakterden oluşan bir arama dizgisine sahiptir. Tam kod yine de çözümünüzden 2 byte daha uzun.
Arnauld,

7

Kömür , 33 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

 θ                  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

Jöle ,  31 30 27  26 bayt

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

Bir karakter listesi üreten bir tamsayı listesini kabul eden bir monadik Bağlantı.
- önceki, aşağıda ve Nick Kennedy'nin geliştirilmesinin karmaşası

Çevrimiçi deneyin!

Çıkış, girişle aynı sırada verilmez (buna izin verilir).

Dile kendi eklemelerimin 2'sini bir cevapta kullanmak pek sık olmaz! ( ve ɓburada).

Nasıl?

“...“...’ṃØ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)

önceki @ 30

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

Bir karakter listesi üreten bir tamsayı listesini kabul eden bir monadik Bağlantı.

Çevrimiçi deneyin!

Bunun çıkışı da karışık durumda (buna izin veriliyor).

Nasıl?

“...»⁾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"

Sanırım ilk açıklamada bir yazım hatası yaptın. ' NWGMZQ'sonra çok boyutlu indeks içine Wdize herhangi bir olmadan oldukça bir başarı olacaktır . ;)
Kevin Cruijssen

1
@KevinCruijssen - yws, yazım hatası fixwd; Teşekkürler!
Jonathan Allan,

4

Pyth - 92 86 83 81 80 75 60 52 49 42 36 bayt

Girdi boyunca dolaşır ve mevcut harfleri gösterir. Sadece bu puan kategorisi için 7 tane veren her bir mektubum var. Şimdi paketlenmiş dize kodlaması kullanıyoruz.

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, bu kodlama önce orijinal mektup dizesidir: "_ E DG BCMP FHVW K JX QZ".

Çevrimiçi deneyin .



3

05AB1E , 70 52 39 38 29 26 25 bayt

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

@ExpiredData sayesinde -18 bayt .
-13 byte aynı genişlemeyi kullanarak @Maltysen'in Pyth cevabından 7 nolu ebadı uzattı .
-9 byte @JonathanAllan'ın Jelly cevabının limanı oluşturarak , bu yüzden onu hak ettiğinden emin ol! @Emigna
sayesinde -3 bayt .

Bir karakter listesinde sonuçlanır ve küçük harfler ve boşluklar için boşluk kullanır.

Çevrimiçi deneyin veya bazı test durumlarını doğrulayın .

Açıklama:

{                      # 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

Bu 05AB1E madenin ucu bakın (bölüm kompres dizeleri sözlükte parçası olmayan nasıl? ) Anlamak için .•3Oû}α›ηö‡.ÝŽ{•olduğunu "endgmpfykkzzzzjxzzqz ".


Önceki 38 baytlık cevap:

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

Çevrimiçi deneyin veya bazı test durumlarını doğrulayın .

Açıklama:

.•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

Bu 05AB1E madenin ucu bakın (bölüm kompres dizeleri sözlükte parçası olmayan nasıl? ) Anlamak için .•Mñ&Àû«ì{₆v*Å+µ-•olduğunu "e dg bcmp fhvw k jx qz".


Kullanamaz " 0eeeeeee0ddddggg0bbccmmp0ffhhvvw0k000jx00qz"mısın
Süresi dolmuş veriler

Elbette @ExpiredData Ah. Sadece 7 harf çizersin .. Teşekkürler! Değişecek.
Kevin Cruijssen

1
Bunun {vyerine 7Fve yyerine 3 bayt kaydedebilirsiniz I{Nè.
Emigna

Tabii ki @Emigna Ah .. Teşekkürler!
Kevin Cruijssen

2

C (gcc) , 110 bayt

_[]={0,7,14,21,0,0,22,0,24};f(char*s){for(;*s+1;s++)*s=*s?*s-1?"DDDDGGGBBCCMMPFFHHVVWKJXQZ"[_[*s-2]++]:69:32;}

Çevrimiçi deneyin!

_Diziyi, "DDDDGGGBBCCMMPFFHHVVWKJXQZ"0 ve 1 istisnalarıyla dinamik olarak statik dizeye dizin olarak kullanır .

Bağımsız değişken, -1yerinde -1-terminated bir dizeye dönüştürülen -terminated bir puan dizisidir.




1

Jöle , 34 32 bayt

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

Çevrimiçi deneyin!

Bunu yazdığımda daha kısa bir Jelly cevabı olduğunu görmemiştim ve bu farklı bir yaklaşım kullanıyor, bu yüzden de göndermeye değer olduğunu düşündüm.

2 byte tasarruf için @JonathanAllan teşekkürler!


Baz-dekompresyon kullanarak, şunları yapabilirsiniz 2 bayt kaydetmek
Jonathan Allan

1

Python 3 , 178 142 135 127 112 117 bayt

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

Çevrimiçi deneyin!

Cdlane sayesinde -1 bayt

mathmandan sayesinde doğru


"-> içinde" için 111
cdlane

d=list(map(list,"...".split('_')))başka bir bayt kaydetmek için
cdlane 22

Bu işlevin fmuhtemelen adlandırılması gerekmez, böylece 2 bayt kaydedebilirsiniz. Bununla birlikte, fgirişlerini tüketir d, bu nedenle "işlev, gönderime eşlik eden başka bir kodu ... yeniden başlatmadan, sık sık yeniden kullanılabilir olması gerektiği" fikrine uyduğundan emin değilim. (Örneğin, bir f([10,0,10,5,8,8,0])kereden fazla çalıştırmak bir hatayla sonuçlanır.) Lütfen burada meta tartışmaya bakın: codegolf.meta.stackexchange.com/a/7615/36885
mathmandan

0

Python 2 , 102 bayt (veya belki 95?)

(Python 3 için de iyidir.)

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

Çevrimiçi deneyin!

Aşağıdakilerin kabul edilebilir olacağını düşünmüyorum:

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

Bu ikinci sürüm gibi çıktı verecek ['__', 'JX', 'QZ', 'K']. Böylece harfler doğru olur, ancak puan değerinde toplanırlardı. (Bu kabul edilebilir olsaydı, 7 bayt kurtarırdı.)


0

PHP , 101 bayt

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

Bağımsız bir program olarak, komut satırı üzerinden giriş yapın:

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

Çevrimiçi deneyin!

Veya işlev olarak 112 bayt

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

Çevrimiçi deneyin!

Çıktı

[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

Perl 6 , 63 bayt

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

Çevrimiçi deneyin!

<_ 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

Bu nedenle, temelde, her karo değeri için ofsetlerin aranmasını sağlar ve mevcut setten bir karakter çekmek için ofseti kullanarak bunları gerektiği gibi artırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.