建立一个九级猜词游戏


11

基础:

您需要提供尽可能少的字符(以您选择的语言显示)的九级猜词游戏。

指标:

  • 提供单词列表(每行一个单词,用换行符分隔)(例如 /usr/share/dict/words,可以这样做)。可以将文件名或单词列表本身通过管道传递到您的解决方案中。
  • 提供9个级别,这些级别的单词长度递增(带有4个字符和->12个字符的单词):
级别1:来自单词表的随机单词,包含4个字符
级别2:来自单词表的随机单词,包含5个字符
……
级别8:来自单词表的随机单词,包含11个字符
9级:来自单词表的随机单词,包含12个字符
  • 在每个级别中,混淆从列表中随机选择的单词(当然具有特定的单词长度),并用星号(*)替换一定数量的字符。该数字的字符来代替:current_word_length / 3(向下取整)。随机替换哪些字符。
  • 让玩家“猜”这个单词(try每个级别仅一个),给出反馈(correctwrong)并相应地给出分数。正确时,玩家获得number_of_obfuscated_characters * 10 points
  • 在每个级别的末尾打印当前分数。

格式(&示例I / O):

确保遵循以下格式设置方案:

级别1#级别标头
=======# 
g * ek#混淆词
极客#用户输入
正确的#猜测验证
得分:10#打印得分
            #  
2级
=======
l *核
linux
正确
得分:20

3级
=======
跑了** m
随机
正确
得分:40

...

9级
=======
sem *** act * ve
半不活跃
错误
得分:90

优胜者:

最短的解决方案(按代码字符计数)。打高尔夫球吧!


STW ** act ve,BTW 的解决方案是什么?
Joe Z.

@JoeZ。也许sem***act*ve==>semelfactive
dev-masih 2015年

Answers:


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,这在Code Golf中并不常见;-)
ChristopheD

在我的辩护中,我没有那么努力。Glad Ilmari Karonen很高兴。
乔尔·伯杰

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 2011年

6
@ Nyuszika7H:包括21个\ r字符,不是吗?这适用于Unix,其中换行符是单个换行符。
ninjalj 2011年

@ninjalj:是的,但是请记住,并非每个人都使用Unix换行符格式。我们必须公平。meta.codegolf.stackexchange.com/questions/167/...
nyuszika7h

10
@ Nyuszika7H:如果可以使用它,那么您绝对应该参加高尔夫运动。如果您的语言有两种等效的做事方式,一种较短,那么您是否使用较长的语言,因为有些人可能不知道较短的一种?至于换行符,如果您有要求使用 CRLF 的语言,那么您就不走运了,但是我不知道任何这种语言。
乔伊,

1
您几乎不能总是用分号或空格替换换行符吗?
barrycarter 2011年

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]
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.