Construa um jogo de adivinhação de palavras de nove níveis


11

O básico:

Você precisará fornecer um jogo de adivinhação de palavras de nove níveis no menor número possível de caracteres (no seu idioma preferido).

As métricas:

  • Forneça uma lista de palavras (uma palavra por linha, separada por uma nova linha) (por exemplo, /usr/share/dict/wordsou similar poderia fazer). Não há problema em inserir um nome de arquivo ou a própria lista de palavras em sua solução.
  • Forneça 9 níveis com o aumento do tamanho das palavras (palavras com 4 caracteres e ->12 caracteres):
Nível 1: uma palavra aleatória da lista de palavras que contém 4 caracteres
Nível 2: uma palavra aleatória da lista de palavras que contém 5 caracteres
... ...
Nível 8: uma palavra aleatória da lista de palavras que contém 11 caracteres
Nível 9: uma palavra aleatória da lista de palavras que contém 12 caracteres
  • Em todos os níveis, ofusque uma palavra escolhida aleatoriamente da lista (com um comprimento de palavra específico, é claro) e substitua um certo número de caracteres pelo asterisco ( *). O número de caracteres a serem substituídos: current_word_length / 3(arredondar para baixo). Escolha aleatoriamente quais caracteres substituir.
  • Deixe o jogador "adivinhar" a palavra (apenas uma trypor nível), dê feedback ( correctou wrong) e dê pontos de acordo. Quando correto, o jogador ganha number_of_obfuscated_characters * 10 points.
  • Imprima a pontuação atual no final de cada nível.

O formato (e amostra de E / S):

Certifique-se de seguir o seguinte esquema de formatação:

Cabeçalho de nível 1 # nível
======= # 
g * ek # palavra ofuscada
nerd # entrada do usuário
validação correta de palpite
score: 10 # imprimir pontuação
            #  
Nível 2
=======
l * nux
linux
corrigir
pontuação: 20

Nível 3
=======
correu ** m
aleatória
corrigir
pontuação: 40

...

Nível 9
=======
sem *** ato * ve
semiinativo
errado
pontuação: 90

Vencedora:

Solução mais curta (por contagem de caracteres de código). Divirta-se jogando golfe!


Qual é a solução para sem ** act ve, BTW?
Joe Z.

@JoeZ. talvez sem***act*ve==>semelfactive
dev-masih

Respostas:


5

Perl, 180 caracteres

@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 derrotando Perl? Isso não serve! :-)

Como a solução Ruby do jsvnm, mas diferente do código Perl de Joel Berger, esse script usa o nome do arquivo de uma lista de palavras como um parâmetro de linha de comando. Ou seja, você deve executá-lo assim:

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

Aqui está uma versão de-golfed:

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

A declaração vec($_, rand $n, 8) = 42 while ($= = $n/3) > y/*//contém alguns truques interessantes. Primeiro, 42 é o código ASCII de um asterisco; verifica-se que o uso vecpara modificar caracteres únicos em uma string é mais curto do que com isso substr. Segundo, a variável $=usa apenas valores inteiros; portanto, usá-la para armazenar o número de letras ocultas me salva um int. Por fim, y/*//é uma maneira curta de contar o número de asteriscos em uma string usando o operador de transliteração.

Editar: salvou 7 caracteres usando $@para armazenar a pontuação dividida por 10 e acrescentando um zero a ela durante a saída (que, pensando bem, teria sido mais curta que a versão anterior, mesmo se eu tivesse usado uma variável normal) .

Editar 2: Acontece que a incorporação de novas linhas literais nas seqüências de saída economiza um caractere em excesso $,.


5

Rubi (188)

pega o nome do arquivo para ler as palavras como argumento.

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 (rubi batendo Perl, que é um não um evento familiar no Código Golf ;-)
ChristopheD

Em minha defesa, não tentei tanto. Ainda bem que Ilmari Karonen estava nas minhas costas.
Joel Berger

3

Bash, 350 caracteres

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

Sem trapaça! São 371 caracteres de acordo com o Notepad ++.
usar o seguinte código

6
@ Nyuszika7H: incluindo 21 caracteres, não é? Isto é para Unix, onde uma nova linha é um único caractere de avanço de linha.
Ninjalj

@ninjalj: Sim, mas lembre-se de que nem todos usam o formato de quebra de linha Unix. Temos que ser justos. meta.codegolf.stackexchange.com/questions/167/...
nyuszika7h

10
@ Nyuszika7H: Se você pode usá-lo, então, por todos os meios, você deve fazer um código de golfe. Se seu idioma tem duas maneiras equivalentes de fazer algo e uma é mais curta, você usa mais porque algumas pessoas podem não saber a mais curta? Quanto às quebras de linha, se você tiver um idioma que exija CRLF, ficará sem sorte, mas não conheço esse idioma.
JoeyFre5

1
Você quase sempre não pode substituir novas linhas com ponto e vírgula ou espaços?
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"}

ou com um pouco mais de espaço em branco

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

e acho que com um pouco de trabalho poderia ficar ainda melhor!


2

R, 363 caracteres

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

Eu sei que estou um pouco atrasado para a festa, mas o python não está representado, então imaginei o que diabos:

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

E semi-sem golfe:

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

Assume um dicionário d no diretório de trabalho atual.

{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]
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.