สร้างเกมทายคำศัพท์เก้าระดับ


11

พื้นฐาน:

คุณจะต้องจัดให้มีเกมเดาคำเก้าระดับในตัวละครที่น้อยที่สุดเท่าที่จะเป็นไปได้ (ในภาษาที่คุณเลือก)

ตัวชี้วัด:

  • จัดทำรายการคำ (หนึ่งคำต่อบรรทัดคั่นด้วยการขึ้นบรรทัดใหม่) (เช่น /usr/share/dict/wordsหรืออาจคล้ายกัน) มันเป็นการดีที่จะใส่ชื่อไฟล์หรือ wordlist ลงในโซลูชันของคุณ
  • ระบุ 9 ระดับด้วยความยาวคำที่เพิ่มขึ้น (คำที่มี 4 อักขระ->12 ตัวอักษร):
ระดับ 1: คำสุ่มจากรายการคำที่มี 4 ตัวอักษร
ระดับ 2: คำสุ่มจากรายการคำที่มี 5 ตัวอักษร
... ...
ระดับ 8: คำสุ่มจากรายการคำที่มีอักขระ 11 ตัว
ระดับ 9: คำสุ่มจากคำที่มี 12 ตัวอักษร
  • ในทุกระดับให้ใส่คำที่สุ่มเลือกจากรายการ (ด้วยความยาวของคำที่แน่นอน) และแทนที่อักขระจำนวนหนึ่งด้วยเครื่องหมายดอกจัน ( *) จำนวนของตัวละครที่จะมาแทนที่: current_word_length / 3(รอบลง) สุ่มซึ่งตัวละครที่จะมาแทนที่
  • ให้ผู้เล่นเดาคำ (หนึ่งคำtryต่อระดับ) ให้ข้อเสนอแนะ ( correctหรือwrong) และให้คะแนนตามนั้น number_of_obfuscated_characters * 10 pointsเมื่อถูกต้องกำไรผู้เล่น
  • พิมพ์คะแนนปัจจุบันที่ส่วนท้ายของแต่ละระดับ

รูปแบบ (& ตัวอย่าง I / O):

ตรวจสอบให้แน่ใจว่าคุณทำตามรูปแบบการจัดรูปแบบต่อไปนี้:

ส่วนหัวระดับ 1 # ระดับ
======= # 
g * ek # คำที่ทำให้งง
ผู้ใช้ geek #
# ตรวจสอบการเดาที่ถูกต้อง
คะแนน: 10 # คะแนนการพิมพ์
            #  
ระดับ 2
=======
L * Nux
ลินุกซ์
แก้ไข
คะแนน: 20

ระดับ 3
=======
วิ่งเมตร **
สุ่ม
แก้ไข
คะแนน: 40

...

ระดับ 9
=======
SEM *** กระทำ * ve
semiinactive
ไม่ถูกต้อง
คะแนน: 90

ผู้ชนะ:

วิธีแก้ปัญหาที่สั้นที่สุด (ตามจำนวนตัวอักษรรหัส) ขอให้สนุกกับการเล่นกอล์ฟ!


วิธีการแก้ปัญหา sem ** , BTW คืออะไร?
Joe 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
"}

ทับทิมเต้น Perl? นั่นจะไม่ทำ! :-)

เช่นเดียวกับโซลูชัน Ruby ของ jsvnm แต่ไม่เหมือนกับโค้ด Perl ของ Joel Berger สคริปต์นี้ใช้ชื่อไฟล์ของรายการคำเป็นพารามิเตอร์บรรทัดคำสั่ง นั่นคือคุณควรเรียกใช้ดังนี้:

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/*//คือวิธีสั้น ๆ ในการนับจำนวนเครื่องหมายดอกจันในสตริงโดยใช้ตัวดำเนินการถอดเสียง

แก้ไข: บันทึก 7 ตัวอักษรโดยใช้$@เพื่อเก็บคะแนนหารด้วย 10 และต่อท้ายศูนย์ระหว่างผลลัพธ์ (ซึ่งคิดว่ามันจะสั้นกว่ารุ่นก่อนหน้าแม้ว่าฉันจะใช้ตัวแปรปกติ) .

แก้ไข 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",""}

Nice one (Ruby ชน Perl นั่นไม่ใช่เหตุการณ์ที่คุ้นเคยใน Code Golf ;-)
ChristopheD

ในการป้องกันของฉันฉันไม่ได้ลองอย่างนั้น ดีใจ Ilmari Karonen มีหลังของฉัน
Joel Berger

3

Bash, 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

ไม่มีการโกง! มันคือ 371 chars ตาม Notepad ++
nyuszika7h

6
@ Nyuszika7H: รวมตัวอักษร 21 ตัวใช่มั้ย นี่สำหรับ Unix ที่บรรทัดใหม่เป็นอักขระป้อนบรรทัดเดียว
ninjalj

@ninjalj: ใช่ แต่โปรดจำไว้ว่าไม่ใช่ทุกคนที่ใช้รูปแบบตัวแบ่งบรรทัด Unix เราต้องยุติธรรม meta.codegolf.stackexchange.com/questions/167/…
nyuszika7h

10
@ Nyuszika7H: ถ้าคุณสามารถใช้มันได้หมายความว่าคุณควรจะเล่นกอล์ฟ หากภาษาของคุณมีสองวิธีที่เทียบเท่าในการทำบางสิ่งและอีกวิธีหนึ่งสั้นกว่าคุณใช้อีกต่อไปเพราะบางคนอาจไม่รู้จักวิธีที่สั้นกว่านี้หรือไม่ สำหรับการขึ้นบรรทัดใหม่หากคุณมีภาษาที่ต้องใช้ CRLF คุณก็โชคไม่ดี แต่ฉันไม่ได้ตระหนักถึงภาษาดังกล่าว
Joey

1
คุณไม่สามารถแทนที่บรรทัดใหม่ด้วยอัฒภาคหรือช่องว่างได้ตลอดเวลาหรือไม่
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"}

หรือพื้นที่สีขาวเพิ่มขึ้นอีกเล็กน้อย

@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

ฉันรู้ว่าฉันมาช้าไปงานปาร์ตี้ แต่ไม่ได้เป็นตัวแทนของงูใหญ่ดังนั้นฉันจึงคิดว่าห่า:

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

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]
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.