Dokuz seviyeli bir kelime tahmin oyunu oluşturun


11

Temeller:

Mümkün olan en az karakterle (seçtiğiniz dilinizde) dokuz seviyeli bir kelime tahmin oyunu sağlamanız gerekir.

Metrikler:

  • Bir kelime listesi (satır başına bir kelime, bir satırsonu karakteriyle ayrılmış olarak) sağlayın (örn. /usr/share/dict/wordsVeya benzeri olabilir). Bir dosya adını veya kelime listesinin kendisini çözümünüze eklemek iyi olur.
  • Artan kelime uzunluğuna sahip 9 seviye sağlayın (4 karakterli ->12 karakterli kelimeler ):
Seviye 1: Kelime listesinden 4 karakter içeren rastgele bir kelime
Seviye 2: Kelime listesinden 5 karakter içeren rastgele bir kelime
... ...
Seviye 8: Kelime listesinden 11 karakter içeren rastgele bir kelime
Seviye 9: Kelime listesinden 12 karakter içeren rastgele bir kelime
  • Her seviyede, rastgele seçilen bir kelimeyi listeden gizleyin (belirli bir kelime uzunluğu ile) ve belirli sayıda karakteri yıldız işareti ( *) ile değiştirin. Sayı karakterlerinin yerine: current_word_length / 3(yuvarlak aşağı). Rastgele hangi yerine karakter.
  • Oyuncunun kelimeyi 'tahmin etmesine' ( tryseviye başına sadece bir tane ) izin ver, geri bildirim ver ( correctya da wrong) ve puanları buna göre ver. Doğru olduğunda, oyuncu kazanır number_of_obfuscated_characters * 10 points.
  • Her seviyenin sonunda geçerli puanı yazdırın.

Biçim (& örnek G / Ç):

Aşağıdaki biçimlendirme şemasına uyduğunuzdan emin olun:

Seviye 1 # seviye başlığı
======= # 
g * ek # gizlenmiş kelime
geek # kullanıcı girişi
doğru # tahmin doğrulaması
puan: 10 # baskı puanı
            #  
Seviye 2
=======
l * nux
linux
doğru
puan: 20

3. seviye
=======
ran ** m
rasgele
doğru
puan: 40

...

Seviye 9
=======
sem *** hareket * ettik
semiinactive
yanlış
puan: 90

Kazanan:

En kısa çözüm (kod karakter sayısına göre). İyi eğlenceler golf!


Sem ** act ve BTW'nin çözümü nedir ?
Joe Z.

@JoeZ. maybe sem***act*ve==>semelfactive
dev-masih

Yanıtlar:


5

Perl, 180 karakter

@w=<>;for$n(4..12){@x=grep/^.{$n}$/,@w;$_=$w=$x[rand@x];vec($_,rand$n,8)=42while($==$n/3)>y/*//;print"Level @{[$n-3]}
=======
$_";say<>eq$w?($@+=$=)&& correct:wrong,"
score: $@0
"}

Ruby Perl'i mi yeniyor? Yapmayacak! :-)

Jsvnm'in Ruby çözümü gibi, ancak Joel Berger'in Perl kodundan farklı olarak, bu komut dosyası bir kelime listesinin dosya adını komut satırı parametresi olarak alır. Yani, şu şekilde çalıştırmalısınız:

perl -M5.010 guessword.pl /usr/share/dict/words

İşte bir de-golfed versiyonu:

@w = <>;
for $n (4..12) {
    @x = grep /^.{$n}$/, @w;
    $_ = $w = $x[rand@x];
    vec($_, rand $n, 8) = 42 while ($= = $n/3) > y/\*//;
    print "Level @{[ $n-3 ]}\n=======\n$_";
    say <> eq $w ? ($@ += $=) && correct : wrong, "\nscore: $@0\n"; 
}

Açıklamada vec($_, rand $n, 8) = 42 while ($= = $n/3) > y/*//birkaç ilginç numara var. İlk olarak 42, bir yıldız işaretinin ASCII kodudur; vecbir dizede tek karakter değiştirmek için kullanmanın , bunu yapmaktan daha kısa olduğu ortaya çıkar substr. İkincisi, değişken $=yalnızca tamsayı değerleri alır, bu yüzden gizli harflerin sayısını saklamak için kullanmak beni kurtarır int. Son olarak, y/*//harf çevirisi işlecini kullanarak bir dizedeki yıldız sayısını saymanın kısa bir yoludur.

Düzenleme: $@Skoru 10'a bölmek ve çıkış sırasında ona bir sıfır eklemek için kullanarak 7 karakter kaydedildi (ki, düşünün, normal bir değişken kullansam bile önceki sürümden daha kısa olurdu) .

Edit 2: Çıktı dizelerine gerçek yeni satırları katıştırmak, bir karakterle uğraşmaktan kurtarır $,.


5

Yakut (188)

argüman olarak kelimeleri okumak için dosya adını alır.

q=*$<
s=0
4.upto(12){|n|o=''+w=q.grep(/^#{?.*n}$/).sample
[*0..n-1].sample(c=n/3).map{|i|o[i]=?*}
puts"Level #{n-3}",?=*7,o
puts STDIN.gets==w ?(s+=c;"correct"):"wrong","score: #{s}0",""}

Nice one (Ruby Perl'i yeniyor, bu Code Golf ;-) 'de tanıdık bir olay değil
ChristopheD

Savunmamda bunu çok denemedim. Memnun Ilmari Karonen arkamdaydı.
Joel Berger

3

Bash, 350 karakter

S=0
for L in {4..12}
do
echo -e Level $(($L-3))\\n=======
W=$(grep -E ^.{$L}$ /usr/share/dict/words|shuf|tail -1)
G=$W
while [ `sed 's/[^*]//g'<<<$G|wc -c` -le $(($L/3)) ]
do
P=$(bc<<<$RANDOM*$L/32767)
G=$(sed "s/\(.\{$P\}\)./\1*/"<<<$G)
done
echo $G
read U
if [ x$U == x$W ]
then
echo correct
S=$(($S+$L/3*10))
else
echo wrong
fi
echo score: $S
done

Hile yok! Notepad ++ 'a göre 371 karakterdir.
nyuszika7h

6
@ Nyuszika7H: 21 karakter dahil, değil mi? Bu, yeni satırın tek satırlık bir karakter olduğu Unix içindir.
ninjalj

@ninjalj: Evet, ancak herkesin Unix satır sonu biçimini kullanmadığını aklınızda bulundurun. Adil olmalıyız. meta.codegolf.stackexchange.com/questions/167/…
nyuszika7h

10
@ Nyuszika7H: Eğer kullanabilirsiniz, elbette bir kod golf gerekir. Dilinizde bir şey yapmanın iki eşdeğer yolu varsa ve bir tanesi daha kısaysa, uzun olanı kullanırsınız, çünkü bazı insanlar daha kısa olanı bilmiyor olabilir mi? Satır sonlarına gelince , CRLF gerektiren bir diliniz varsa , şanssızsınız, ancak böyle bir dilin farkında değilim.
Joey

1
Hemen hemen her zaman noktalı virgül veya boşluk içeren satırları değiştiremez misiniz?
barrycarter

2

Perl: 266

@ARGV='/usr/share/dict/words';@w=<>;$"='';while($l<9){$o=1+int++$l/3;@s=grep{$l+4==length}@w;@g=split//,$t=$s[rand$#s+1];my%r;$r{rand$#g}++while keys%r<$o;$g[$_]='*'for keys%r;print"Level $l\n=======\n@g";print<>eq$t?do{$p+=$o*10;"Correct"}:"Wrong","\nScore: $p\n"}

ya da biraz daha fazla boşlukla

@ARGV='/usr/share/dict/words';
@w=<>;
$"='';
while($l<9){
  $o=1+int++$l/3;
  @s=grep{$l+4==length}@w;
  @g=split//,$t=$s[rand$#s+1];
  my%r;
  $r{rand$#g}++while keys%r<$o;
  $g[$_]='*'for keys%r;
  print"Level $l\n=======\n@g";
  print<>eq$t?do{$p+=$o*10;"Correct"}:"Wrong","\nScore: $p\n"
}

ve küçük bir çalışma ile daha da iyi olabileceğini düşünüyorum!


2

R, 363 karakter

w=tolower(scan("/usr/share/dict/words",what="c"));l=nchar(w);score=0;for(i in 1:9){mw=sample(w[l==i+3],1);cat("Level",i,"\n=======\n",replace(strsplit(mw,"")[[1]],sample(nchar(mw),floor(nchar(mw)/3)),"*"),"\n");v=scan(what="c",n=1,quiet=T);if(length(v)!=0&&v==mw){score=score+10*floor(nchar(mw)/3);cat("correct\n")} else cat("wrong\n");cat("score:",score,"\n\n")}

2

Python 335

Partiye biraz geç kaldığımı biliyorum, ama python temsil edilmedi, bu yüzden ne olduğunu anladım:

import sys
import random
D=open(sys.argv[1]).read().split()
random.shuffle(D)
z=0
for L in range(1,10):
 M=L+3;N=M/3;w=[c for c in D if len(c)==M][0];U=list(w)
 for i in[random.randint(0,M-1)for i in range(N)]:U[i]='*'
 print"\nLevel %d\n=======\n"%L+''.join(U);k=raw_input()==w;z+=[0,N*10][k];print["wrong","correct"][k]+"\nscore:",z

Ve yarı boyunsuz:

import sys
import random
words = open(sys.argv[1]).read().split()
random.shuffle(words)
score=0
for L in range(1,10):
   M=L+3
   N=M/3
   w=[c for c in words if len(c)==M][0]
   obfus=list(w)
   for i in [random.randint(0,M-1) for i in range(N)]: obfus[i]='*'
   obfus=''.join(obfus)
   print"\nLevel %d\n=======\n"%L+obfus
   correct=raw_input()==w
   score+=[0,N*10][correct]
   print["wrong","correct"][correct]+"\nscore:",score

2

K, 198

Geçerli çalışma dizinindeki sözlük d'yi varsayar.

{O:{@[x;(-_c%3)?c:#x;:;"*"]}',/W:{1?x@&y=#:'x}[_0:`d]'4+!9;i:1+S:0;while[#O;-1"Level ",$i;-1"=======";-1@*O;$[(**W)~0:0;[-1"correct";S+:10*+/"*"=*O];-1"wrong"];-1"score: ",$S;-1"";W:1_W;O:1_O;i+:1]}

Ungolfed:

{
        /W = wordlist; O = obfuscated
        O:{@[x;(-_c%3)?c:#x;:;"*"]}',/W:{1?x@&y=#:'x}[_0:`d]'4+!9;     
        i:1+S:0;                            
        while[#O;
                -1"Level ",$i;
                -1"=======";
                -1@*O;
                $[(**W)~0:0;              /Read user input and compare to the first word
                        [-1"correct";
                        S+:10*+/"*"=*O];  /if correct, increment score
                        -1"wrong"];
                -1"score: ",$S;
                -1"";
                W:1_W;                    /knock one off the top of both word lists
                O:1_O;
                i+:1]
}
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.