Xây dựng một trò chơi đoán từ chín cấp


11

Những thứ cơ bản:

Bạn sẽ cần cung cấp một trò chơi đoán từ chín cấp trong ít nhân vật nhất có thể (theo ngôn ngữ bạn chọn).

Các số liệu:

  • Cung cấp một danh sách từ (một từ trên mỗi dòng, được phân tách bằng một dòng mới) (ví dụ /usr/share/dict/wordshoặc tương tự có thể làm). Sẽ tốt hơn nếu đặt tên tệp hoặc danh sách từ vào giải pháp của bạn.
  • Cung cấp 9 cấp độ với độ dài từ tăng dần (từ có 4 ký tự ->12 ký tự):
Cấp 1: một từ ngẫu nhiên từ danh sách từ có 4 ký tự
Cấp độ 2: một từ ngẫu nhiên từ danh sách từ có 5 ký tự
... ...
Cấp 8: một từ ngẫu nhiên từ danh sách từ có 11 ký tự
Cấp 9: một từ ngẫu nhiên từ danh sách từ có chứa 12 ký tự
  • Ở mọi cấp độ, hãy xáo trộn một từ được chọn ngẫu nhiên từ danh sách (với độ dài từ cụ thể của khóa học) và thay thế một số ký tự nhất định bằng dấu hoa thị ( *). Số lượng ký tự cần thay thế: current_word_length / 3(làm tròn xuống). Ngẫu nhiên nhân vật để thay thế.
  • Hãy để người chơi 'đoán' từ (chỉ một trycho mỗi cấp độ), đưa ra phản hồi ( correcthoặc wrong) và cho điểm tương ứng. Khi đúng, người chơi được lợi number_of_obfuscated_characters * 10 points.
  • In điểm hiện tại ở cuối mỗi cấp.

Định dạng (& I / O mẫu):

Hãy chắc chắn rằng bạn làm theo sơ đồ định dạng sau:

Tiêu đề cấp 1 # cấp
======= # 
g * ek # từ bị xáo trộn
đầu vào của người dùng
xác thực # đoán đúng
điểm: 10 # điểm in
            #  
Cấp độ 2
=======
l * nux
linux
chính xác
điểm: 20

Cấp 3
=======
chạy ** m
ngẫu nhiên
chính xác
điểm: 40

...

Cấp 9
=======
sem *** hành động * đã
bán hoạt động
Sai lầm
điểm: 90

Người chiến thắng:

Giải pháp ngắn nhất (theo số ký tự mã). Chúc bạn chơi golf vui vẻ!


Giải pháp cho sem ** act ve, BTW là gì?
Joe Z.

@JoeZ. có lẽ sem***act*ve==>semelfactive
dev-masih

Câu trả lời:


5

Perl, 180 ký tự

@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 đánh Perl? Điều đó sẽ không xảy ra! :-)

Giống như giải pháp Ruby của jsvnm, nhưng không giống như mã Perl của Joel Berger, tập lệnh này lấy tên tệp của danh sách từ làm tham số dòng lệnh. Đó là, bạn nên chạy nó như thế này:

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

Đây là phiên bản không chơi gôn:

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

Tuyên bố vec($_, rand $n, 8) = 42 while ($= = $n/3) > y/*//có một vài thủ thuật thú vị. Đầu tiên, 42 là mã ASCII của dấu hoa thị; nó chỉ ra rằng việc sử dụng vecđể sửa đổi các ký tự đơn trong một chuỗi ngắn hơn so với thực hiện với nó substr. Thứ hai, biến $=chỉ lấy các giá trị nguyên, vì vậy sử dụng nó để lưu trữ số lượng chữ cái ẩn giúp tôi tiết kiệm int. Cuối cùng, y/*//là một cách ngắn để đếm số dấu hoa thị trong một chuỗi bằng toán tử chuyển ngữ.

Chỉnh sửa: Đã lưu 7 ký tự bằng cách sử dụng $@để lưu trữ số điểm chia cho 10 và nối thêm 0 vào số đó trong đầu ra (điều này, khi nghĩ về nó, sẽ ngắn hơn phiên bản trước ngay cả khi tôi đã sử dụng biến thông thường) .

Chỉnh sửa 2: Hóa ra việc nhúng các dòng mới theo nghĩa đen trong chuỗi đầu ra giúp tiết kiệm char hơn $,.


5

Hồng ngọc (188)

lấy tên tệp để đọc các từ từ làm đối số.

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

Một điều tuyệt vời (Ruby đánh bại Perl, đó không phải là một sự kiện quen thuộc trong Code Golf ;-)
BarsheD

Để phòng thủ, tôi đã không cố gắng nhiều. Vui mừng Ilmari Karonen đã trở lại của tôi.
Joel Berger

3

Bash, 350 ký tự

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

Không gian lận! Đó là 371 ký tự theo Notepad ++.
nyuszika7h

6
@ Nyuszika7H: bao gồm 21 ký tự, phải không? Cái này dành cho Unix, trong đó một dòng mới là một char linefeed duy nhất.
ninjalj

@ninjalj: Vâng, nhưng hãy nhớ rằng không phải ai cũng sử dụng định dạng ngắt dòng Unix. Chúng ta phải công bằng. meta.codegolf.stackexchange.com/questions/167/...
nyuszika7h

10
@ Nyuszika7H: Nếu bạn có thể sử dụng nó, thì bằng mọi cách bạn nên chơi golf. Nếu ngôn ngữ của bạn có hai cách tương đương để làm một cái gì đó và một cách ngắn hơn, bạn có sử dụng lâu hơn bởi vì một số người có thể không biết cách ngắn hơn? Đối với ngắt dòng, nếu bạn có một ngôn ngữ yêu cầu CRLF, thì bạn đã hết may mắn, nhưng tôi không biết về bất kỳ ngôn ngữ nào như vậy.
Joey

1
Bạn hầu như không thể luôn luôn thay thế các dòng mới w / dấu chấm phẩy hoặc dấu cách?
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"}

hoặc với một chút khoảng trắng

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

và tôi nghĩ với một chút công việc có thể còn tốt hơn nữa!


2

R, 363 ký tự

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

Tôi biết tôi đến bữa tiệc muộn một chút, nhưng con trăn không được đại diện, vì vậy tôi đã hiểu được cái quái gì:

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

Và bán vô dụng:

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

Giả sử một từ điển d trong thư mục làm việc hiện tại.

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

Ung dung:

{
        /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]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.