9レベルの単語推測ゲームを作成する


11

基礎:

可能な限り少ない文字数で(選択した言語で)9レベルの単語推測ゲームを提供する必要があります。

指標:

  • 単語リスト(1行に1単語、改行で区切られている)を提供します(例、 /usr/share/dict/wordsまたは同様のことが可能です)。ファイル名またはワードリスト自体をソリューションにパイプしても構いません。
  • 単語の長さが増加する9つのレベルを提供します(4文字->12文字の単語)
レベル1:4文字を含む単語リストからのランダムな単語
レベル2:5文字を含む単語リストからのランダムな単語
... ...
レベル8:11文字を含む単語リストからのランダムな単語
レベル9:12文字を含む単語リストからのランダムな単語
  • すべてのレベルで、リストからランダムに選択された単語(もちろん特定の単語の長さ)を難読化し、特定の文字数をアスタリスク(*)で置き換えます。置き換えるための文字:current_word_length / 3(ラウンドダウン)。置換する文字をランダム化ます。
  • プレーヤーに単語を「推測」させ(tryレベルごとに1 つだけ)、フィードバック(correctまたはwrong)を与え、それに応じてポイントを与えます。正しい場合、プレイヤーはを獲得しnumber_of_obfuscated_characters * 10 pointsます。
  • 各レベルの最後に現在のスコアを印刷します。

フォーマット(&サンプルI / O):

次のフォーマットスキームに従っていることを確認してください。

レベル1#レベルヘッダー
=======# 
g * ek#難読化された単語
オタク#ユーザー入力
正しい#推測検証
スコア:10#印刷スコア
            #  
レベル2
=======
l * nux
Linux
正しい
スコア:20

レベル3
=======
ラン** m
ランダム
正しい
スコア:40

...

レベル9
=======
sem *** act * ve
半不活性
違う
スコア:90

勝者:

最短の解決策(コード文字数による)。ゴルフをお楽しみください!


sem ** act ve、BTW の解決策は何ですか?
ジョーZ.

@JoeZ。多分sem***act*ve==>semelfactive
dev-masih

回答:


5

Perl、180文字

@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を破った?それはしません!:-)

jsvnmのRubyソリューションと似ていますが、Joel BergerのPerlコードとは異なり、このスクリプトは単語リストのファイル名をコマンドラインパラメーターとして使用します。つまり、次のように実行する必要があります。

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

これはゴルフを解かれたバージョンです。

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

ステートメントにvec($_, rand $n, 8) = 42 while ($= = $n/3) > y/*//は、いくつかの興味深いトリックが含まれています。最初に、42はアスタリスクのASCIIコードです。vec文字列内の単一の文字を変更するために使用する方が、それを使用するよりも短いことがわかりsubstrます。第二には、変数は$=隠された文字の数を格納するためにそれを使用して、私を保存しますので、値のみ整数とりますint。最後に、y/*//音訳演算子を使用して文字列内のアスタリスクの数を数える簡単な方法です。

編集:$@10で割ったスコアを保存するために使用して7文字を保存し、出力中にゼロを追加します(考えてみると、通常の変数を使用しても以前のバージョンよりも短くなりました) 。

編集2:出力文字列にリテラルの改行を埋め込むことが判明し、文字をめちゃくちゃにして保存し$,ます。


5

ルビー(188)

引数として単語を読み込むファイル名を取ります。

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",""}

ナイスなもの(RubyはPerlを破り、それはコードゴルフでは馴染みのないイベントです;
クリストフ

私の防衛では、私はそんなに努力しませんでした。喜んでイルマリー・カロネンは私の背中を持っていました。
ジョエルバーガー

3

バッシュ、350文字

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

不正行為はありません!Notepad ++によると371文字です。
nyuszika7h

6
@ Nyuszika7H:21個の\ r文字を含みますよね?これは、改行が単一の改行文字であるUnix用です。
-ninjalj

@ninjalj:ええ、ただし、誰もがUnixの改行形式を使用しているわけではないことに注意してください。公正でなければなりません。meta.codegolf.stackexchange.com/questions/167/...
nyuszika7h

10
@ Nyuszika7H:使用できるのであれば、ぜひコードゴルフをお勧めします。あなたの言語が何かをする2つの同等の方法があり、1つが短い場合、一部の人々は短いものを知らないかもしれないので、長い方を使用しますか?改行については、CRLF を必要とする言語がある場合は運が悪いのですが、私はそのような言語を知りません。
ジョーイ

1
ほとんどの場合、セミコロンまたはスペースで改行を置き換えることはできませんか?
バリーカーター

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

またはもう少しスペースがある

@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"
}

ちょっとした作業でさらに良くなると思います!


2

R、363文字

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

私はパーティーに少し遅れていることを知っていますが、pythonは表されていませんので、私は一体何を考えました:

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

そして、セミ未ゴルフ:

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

現在の作業ディレクトリにある辞書dを想定しています。

{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]}

ゴルフをしていない:

{
        /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]
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.