9 단계 단어 추측 게임 구축


11

기본 사항 :

가능한 가장 적은 문자 (선택한 언어로)로 9 단계 단어 추측 게임을 제공해야합니다.

측정 항목 :

  • 단어 목록 (줄당 한 단어, 줄 바꿈으로 구분)을 제공하십시오 (예 : /usr/share/dict/words또는 이와 유사한 작업). 파일 이름이나 단어 목록 자체를 솔루션에 파이프하는 것이 좋습니다.
  • 증분 단어 길이로 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 # 난독 화 된 단어
괴짜 # 사용자 입력
올바른 # 추측 유효성 검사
점수 : 10 # 인쇄 점수
            #  
레벨 2
=======
l * nux
리눅스
옳은
점수 : 20

레벨 3
=======
달렸다 **
무작위
옳은
점수 : 40

...

레벨 9
=======
sem *** act * ve
반 비활성
잘못된
점수 : 90

우승자:

가장 짧은 솔루션 (코드 문자 수 기준). 즐거운 골프 되세요!


BTW를 실행 하는 솔루션은 무엇입니까 ?
Joe Z.

@JoeZ. 아마 sem***act*ve==>semelfactive
dev-masih 08:07에

답변:


5

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

루비가 펄을 때리는? 그러면 안돼! :-)

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으로 나눈 값을 저장하고 출력하는 동안 0을 추가 하여 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를 치는 펄, 그것은 코드 골프에서 친숙한 이벤트가 아닙니다 ;-)
ChristopheD

내 방어에서 나는 그것을 열심히 시도하지 않았다. 다행이 Ilmari Karonen은 나의 뒤를 가졌다.
Joel Berger

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

컨닝 하지마! 메모장 ++에 따르면 371 자입니다.
nyuszika7 시간

6
@ Nyuszika7H : 21 \ r 문자 포함, 그렇지 않습니까? 이것은 개행이 단일 줄 바꿈 문자 인 Unix 용입니다.
ninjalj

@ninjalj : 예. 그러나 모든 사람들이 유닉스 줄 바꿈 형식을 사용하는 것은 아닙니다. 우리는 공정해야합니다. meta.codegolf.stackexchange.com/questions/167/…
nyuszika7h

10
@ Nyuszika7H : 당신이 그것을 사용할 수 있다면, 반드시 당신은 코드 골프에 있어야합니다. 당신의 언어가 어떤 일을하는 두 가지 동등한 방법을 가지고 있고 하나는 더 짧은 경우, 어떤 사람들은 더 짧은 것을 알지 못하기 때문에 더 오래 사용합니까? 줄 바꿈과 관련하여 CRLF 가 필요한 언어가 있다면 운이 좋지 않지만 그러한 언어를 알지 못합니다.
Joey

1
세미콜론이나 공백이있는 개행을 거의 항상 대체 할 수는 없습니까?
barrycarter

2

펄 : 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

파이썬 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

그리고 반 ungolfed :

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

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.