Создайте игру с угадайкой в ​​девять уровней


11

Основы:

Вам нужно будет создать игру с угадайкой слов из девяти уровней, используя как можно меньше символов (на выбранном вами языке).

Метрики:

  • Предоставьте список слов (одно слово в строке, разделенных новой строкой) (например, /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.
  • Напечатайте текущий счет в конце каждого уровня.

Формат (и пример ввода / вывода):

Убедитесь, что вы придерживаетесь следующей схемы форматирования:

Уровень 1 # заголовок уровня
======= # 
g * ek # запутанное слово
geek # пользовательский ввод
правильная проверка # угадывания
оценка: 10 # печать баллов
            #  
Уровень 2
=======
л * Nux
линукс
верный
оценка: 20

Уровень 3
=======
RAN ** м
случайный
верный
оценка: 40

...

Уровень 9
=======
семафор *** акт * ве
semiinactive
неправильно
оценка: 90

Победитель:

Кратчайшее решение (по количеству символов кода). Удачи в гольф!


Каково решение sem ** act ve, кстати?
Джо З.

@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-кода Джоэля Бергера, этот скрипт принимает имя файла списка слов в качестве параметра командной строки. То есть вы должны запустить его так:

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

Хороший (Руби обыгрывает Perl, это не знакомое событие в Code Golf ;-)
ChristopheD

В свою защиту я не старался изо всех сил. Рад, что Ильмари Каронен получил мою спину.
Джоэл Бергер

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 символ в соответствии с Notepad ++.
nyuszika7h

6
@ Nyuszika7H: в том числе 21 символов, не так ли? Это для Unix, где символ новой строки - это символ перевода строки.
ниндзя

@ninjalj: Да, но имейте в виду, что не все используют формат перевода строки Unix. Мы должны быть честными. meta.codegolf.stackexchange.com/questions/167/…
nyuszika7h

10
@ Nyuszika7H: Если вы можете использовать его, то во что бы то ни стало вы должны в коде гольф. Если у вашего языка есть два эквивалентных способа сделать что-то и один короче, вы используете более длинный, потому что некоторые люди могут не знать более короткий? Что касается разрывов строк, если у вас есть языки, требующие CRLF, вам не повезло, но я не знаю ни одного такого языка.
Джои

1
Разве вы не можете почти всегда заменить символы новой строки на точки с запятой или пробелы?
Баррикартер

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

К, 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]
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.