İspanya plakaları oyunu


26

Bu soru dayanmaktadır ben sorulan bir soru içinde İspanyolcaya . Evet, İspanyolca dilinde bir algoritma istedim. :)

İspanya'da, mevcut plakalar şu şekle sahiptir:

1234 XYZ

XYZ, İspanyol ünsüzlerin tam setinden alınan üç ünsüzdür ('Ñ' hariç).

Bazen karımla seyahat ederken bir oyun oynarız. Bir plakayı gördüğümüzde, üç ünsüzünü alırız ve bu üç ünsüzünü içeren bir sözcük oluşturmaya çalışırız, aynı plakada göründüğü gibi. Örnekler (İspanyolca):

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

Kazanan, son örnekte görebileceğiniz gibi, en az karakter kullanan kişidir.

Meydan okuma

Bir kelime listesi ve üç ünsüz kümesi içeren en kısa programı veya işlevi yazın ve en kısa sözcüğü aynı sırada üç ünsüzü içeren listede bulur. Bu oyunun amaçları için durum önemli değil.

  • Sözcük listesi için giriş (ilk parametre) dil stringtürünüzün bir dizisi olacaktır . İkinci parametre (üç ünsüz) başka olacak string. Diliniz için daha iyiyse string, üç ünsüz ile tüm parametre listesinin son öğesini göz önünde bulundurun . Çıktı başka olacak string.
  • Kelime listesindeki kelimeler icat edilmeyecek veya sonsuz kelimeler olacak, herhangi bir standart sözlükte görünen kelimeler olacaktır. Bir sınıra ihtiyacınız varsa, kelime listesindeki hiçbir kelimenin 50 karakterden uzun olmayacağını varsayalım.
  • Aynı uzunluğa sahip, geçerli cevap olabilecek birkaç kelime varsa, bunlardan herhangi birini geri verebilirsiniz. Üç ünsüzün deseni eşleşmiyorsa, sadece bir kelime veya boş bir dize döndürdüğünüzden emin olun.
  • Üç ünsüzler için geçerli girdiler hem böylece, gruptaki ünsüzleri tekrarlayabilirsiniz FLRve GGG.
  • İspanyol ünsüzleri "Ñ" eklenmesiyle İngilizceyle tamamen aynıdır. Ünlüler, vurgulanan ünlülerin eklenmesiyle aynıdır: "áéíóúü". "-" veya "" "gibi başka bir işaret olmayacak.
  • Davanın hem kelime listesinde hem de üç ünsüzde aynı olacağını varsayalım.

Algoritmanızı gerçek bir İspanyolca sözcük koleksiyonu ile test etmek istiyorsanız, bir dosyayı (15.9 MB) Dropbox'tan bir milyondan fazla sözcükle indirebilirsiniz .

Test durumları

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'

Bu , bu yüzden her zaman karımı yenmek için bana yardımcı olan en kısa program kazanır! :)


Kelime listesindeki kelimelerin uzunluğu ne kadardır?
Neil

2
Gerçek araç plakalarında Q harfine de izin verilmez; ve W değil uygun bir İspanyol mektup rağmen olduğu
Luis Mendo

2
Listedeki kelimeleri varsayalım ve üç harf tek bir durumda olacak mı?
Jonathan Allan,

1
@LuisMendo W , 1969'dan beri İspanyolca bir mektup olmuştur .
Walen

1
@walen Bu yüzden "uygun" demiştim :-) İspanyolca'da var, fakat yabancı hissediyor
Luis Mendo

Yanıtlar:


7

05AB1E , 10 8 bayt

Leo sayesinde 2 bayt kaydedildi

ʒæså}éR`

Çevrimiçi deneyin!

açıklama

ʒ         # 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)

Kullanmış olurdu headbir byte tasarruf sonunda ama bu çıkış bir eşleşme yoksa boş bir liste olur.


3
3ù #keep only those of length 3Niçin buna ihtiyacın var?
Leo

1
@ Leo: Bilmiyorum, bu benim aptallığımdı. Thanks :)
Emigna 17:17

6

MATL , 30 29 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!


2
Plaka, bir dizi değil bir dize olmalıdır. Ama değiştiriciye ihtiyacın yok.
Titus

@Titus düzeltildi!
Jörg Hülsermann

You can suppose the case will always be the same in both the word list and the three consonants.- regex değiştiricisine gerek yok. wordwrapBunun yerine denedin join(str_split())mi?
Titus

@Titus iyi fikir
Jörg Hülsermann

5

Jöle ,  12 11  10 bayt

ŒPċðÐfLÞḣ1

Küçük harfli listelerin (kelimelerin) ve küçük harfli listelerin (harflerin) bir listesini kabul eden ve harflere eşit bir alt-sıra içeren en kısa kelimelerin ilkini basan (veya hiç değilse, hiçbir şey içermeyen) tam bir program ).

Çevrimiçi deneyin!

Nasıl?

Œ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
Açıklamanızı doğru bir şekilde anlarsam, bu "brc", "brc" ünsüzleri dizisi için "borracho" gibi bir kelimeyi reddeder, çünkü "brc", "brrc" nin alt dizisi değildir
Leo

@Leo ah, evet iyi yakalama başarısız olacağını düşünüyorum ...
Jonathan Allan

@Leo - tamam (her kelimenin tam güç seti için "var") kontrol edilir fakat tamamen golf oynamayabilir ...
Jonathan Allan

5

Pyth - 22 21 19 12 11 bayt

h+f/yTQlDEk

-1 Maltysen'e teşekkürler.

Giriş olarak 2 satır alır. 1, 3 harfli dizedir (küçük harf) ve 2. harf küçük harflerin bir listesidir.

Burada dene

Açıklama:

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)

Eski 19 baytlık çözüm:

h+olNf/-T"aeiou"QEk                       

@JonathanAllan: Sabit! Gösterdiğin için teşekkürler.
Maria,

1
@JonathanAllan: Bu durumda boş bir dize döndürmesi gerektiğini açıklığa kavuşturmak için soruyu düzenlediği anlaşılıyor. Cevabımı buna göre düzenledim.
Maria,

1
D'de bir sort-by-meta operatörümüz var, bu yüzden OLN'i lD ile değiştirebilirsiniz
Maltysen

5

Brachylog v2, 11 bayt

tlᵒ∋.&h⊆.∨Ẹ

Çevrimiçi deneyin!

İşlev sunumu. (TIO bağlantısının, tam bir programmış gibi bir işlevi çalıştırmak için bir komut satırı argümanı vardır.)

açıklama

Şartnamenin tekrar direkt çevirisi ...

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

Aslında neredeyse cevap verebilirsiniz h⊆.&t∋- değerlendirme sırasını değiştirmek Brachylog'un varsayılan olarak en kısa cevabı seçeceği anlamına gelir (ilk kısıtlama olduğu gibi, varsayılan bir tiryaki olarak en uygun "en kısa" olan) - ancak bu durumda, Brachylog Cevap algoritması ne yazık ki, cevabın gerçekte bulunmaması halinde sonsuz bir döngüye girecektir. Bu nedenle, yanıtın neredeyse yarısı, uygun bir cevap bulunmadığı halini ele almaya adanmıştır. O zaman bile, lᵒtiebreak geçersiz kılınır (teknik olarak bir türdür, bundan faydalanır)varsayılan listenin başlangıcına yakın olan öğeleri tercih etmenin varsayılan bölümü) yalnızca iki bayttır; diğer üçü, Brachylog'un varsayılan "çözüm yok" sentinel değerinin tersine (özellikle bunu takip etmek zorunda kalmazsak kesin .olacağı için) olduğu gibi, özellikle çıktı bulunmadığında boş bir dizge çıktısı almaktan geliyor .

İlginçtir, Brachylog'da daha önce uygulanmış ve burada bir bayt biriktirmiş olan bir özellik var. Bir noktada, kullanmakta parametreli elemanları ayıklamak ?₁, ?₂vb sentaksı; Bu tlᵒ∋.⊇?₁∨Ẹ, yalnızca 10 bayt olan programı yeniden düzenlemenizi sağlar . Ne yazık ki, kullanılan uygulama aslında işe yaramadı (ve birçok çalışan programın bozulmasına neden oldu), bu nedenle geri döndürüldü. Yine de, programın "kavramsal olarak" 10 bayt uzunluğunda olduğunu düşünebilirsiniz.


4

Haskell 129 125 74 bayt

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

@ KREDİTE @nimi


1
En doğru olanı mapve filterbir liste kavrayışıyla değiştirebilirsiniz. Zaten sahip olarak Data.Listkapsamında, kullanabileceğiniz sortOn lengthve minimal uzunlukta eleman bulmak için koparmak. Son olarak, ybir ek işlevi işlevi yapın. Bütün bu markaları fve kgereksiz: l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0.
nimi

haklısın! Golfe yeni başladım! Teşekkürler!
Davide Spataro

1
Bir tane daha: içe aktarmayı değiştirirseniz Data.Lists, argminyerine kullanabilirsiniz sortOnve !!0:: l#w=argmin length[...]. Data.Listssahip çok güzel işlevlerini
nimi

3

Perl, 53 bayt

İçin 48 bayt kodu + 5 -paF.

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

Bu yansıtılmadan listeler olmasından yararlanır m//operatör kullanmaktadır $"gelen ilk giriş dizesini değiştirir değişken psriçin p.*s.*rdaha sonra her kelimenin için eşleştirilmiş olan ve üzerinde sıralanır length.

Çevrimiçi deneyin!


Listenize "adsd" eklerseniz, programınız bulamaz. Bulunacak ilk karakterin, kelimenin ilkinde olması gerekmez.
Charlie

@CarlosAlejo Girişin yeni bir satırsonu ihtiyacı var, sonra çalışıyor: Çevrimiçi deneyin! . <<<Operatör benim için komut satırında eklediği gibi Bu olsa da beni nöbetçi yakaladı !
Dom Hastings

3

JavaScript (ES6), 77 75 72 bayt

Kesişen söz diziminde 3 ünsüz cve kelime listesini alır . Her iki giriş de aynı durumda bekleniyor.l(c)(l)

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

Test durumları


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))72 için bence
LarsW

@LarsW Gerçekten, teşekkürler! Ancak yeni kurala uyması için başka bir yaklaşım seçtim: ya da üç ünsüzün deseni ile eşleşen bir kelime yoksa boş bir dize .
Arnauld,

3

R, 101 bayt

İlk kez golf! Bunun bir şekilde yoğunlaşabileceğinden eminim

X dizesini ve olası girdilerin karakter vektörünü y alır.

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

Çevrimiçi deneyin!

Düzenleme: Benim sürüm 135 oldu, teşekkürler -34 için Scrooble!


1
PPCG'ye Hoşgeldiniz! Bu, girişin sabit kodlanmış değişkenlerde olduğu bir snippet'e benziyor. Cevapların tam programlar veya çağrılabilir işlevler olması gerekir. Olası G / Ç yöntemleri için buna (veya diğer R cevaplarına) göz atabilirsiniz .
Martin Ender

2

Retina , 58 bayt

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

Çevrimiçi deneyin! Üç ünsüzü bir satırda ve ardından sonraki tüm satırlarda bulunan sözcüklerin listesini alır. Açıklama: Sayısal olarak uzunlukla girilen ilk satırı hariç Otutanları listeler . Ardından sırayla üç ünsüz içeren bir çizgi için bir eşleşme aranır. Uygun bir hat sondan daha kısa, yani en kısa ise, bu satır çıkış olur, aksi halde çıkış boştur. Geçici olarak etkisini kapatır yalnızca bir satır eşleşir böylece.¶.+#$$.&?-s:s`


1
Üç göbek ya da üç göğüs olduğuna karar veremem.
Charlie

@CarlosAlejo Eccentrica Gallumbits'ı şans eseri düşünüyor musunuz?
Neil

Total Recall'dan uzaylıyı düşünüyordum ama Eccentrica da bir seçenek olabilir ... :)
Charlie

2
@ CarlosAlejo Anlaşılan Mary, Eccentrica Gallumbits'e saygı duyuyor.
Neil

1

Pip , 17 bayt

@:qJ`.*`N_FI#_SKg

Sözcük listesini komut satırı argümanları ve ünsüzlerin stdin'den alır. Çevrimiçi deneyin!

açıklama

                   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 bayt

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 sayesinde -6 bayt .

Açıklama:

Çevrimiçi deneyin.

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 bayt: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 bayt

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

Çevrimiçi deneyin!

x- Açıkça ilk girişi yapın (üç harfli dize) ve silin. Pano G'ye, seviye 1'e otomatik olarak kopyalanır (bu kısım @Luis Mendo'nun cevabından ilham almıştır ).

" - Örtülü olarak ikinci girişi yapın (sözcüklerin hücre dizisi), bunun üzerinden geçin.

l - Daha sonra kullanılmak üzere 1 tuşuna basın

1G - İlk girişi itin ('psr' deyin)

@g - Geçerli sözcüğü dizi olarak it

3XN- nchoosek- Kelimeden 3 harfin tüm kombinasyonlarını al

Xm- 'psr' plaka kodunun bu kombinasyonlardan biri olup olmadığına bakın. False için 0, true için 1 döndürür.

/- 1'i (daha önce ittiğimiz) böylelikle bölüştürmek. 0'ları Infs olarak değiştirir.

@gn - Mevcut kelimenin uzunluğunu al

*- Uzunluğu bölme sonucuyla çarpın. Kelimenin 3 karakteri içerdiği haliyle uzunluğu döndürür, aksi halde döndürürInf

v - Bu sonuçları dikey olarak tek bir dizide birleştirir.

] - Kapatma halkası

&X< - bu diziden asgari değerin indeksini alınız, yani harfleri içeren ve asgari uzunluktaki kelimenin bulunduğu indeks

2G - İkinci girişi tekrar itin

w - Min endeksini yığının üstüne geri getirin

) - Min kelimesiyle kelimelerin dizisine indeksleyin, minimum kelimeyle geçerli kelimeyi döndürün

(Örtük çıktı.)


Daha eski:

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

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
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.