행맨 워드 게임 골프


14

레딧에서 영감을 얻었습니다 .

Hangman을 하는 프로그램을 작성하십시오 .

  • 프로그램은 N 단어 목록에서 임의의 단어를 선택합니다 (여기서 N> 2).
  • 단어 목록은 원하는 방식으로 프로그램에 제공 될 수 있습니다.
  • 각 반복에서

    • 아직 발견되지 않은 문자에 밑줄을 사용하여 게임 상태를 인쇄하십시오.

    H _ N _ _ _ N

    • 남은 시도 횟수 인쇄

    10

    • stdin에서 편지를 읽고 게임 상태를 업데이트하여 잘못된 편지를 추측하면 시도를 뺍니다.

    A (입력)

    H A N _ _ A N

    10

    • 모든 글자가 추측되거나 시도가 0에 도달 할 때까지 반복
  • 모든 언어를 사용하십시오
  • 가장 적은 수의 캐릭터가 승리합니다.
  • 교수대를 그리는 것은 필요하지 않지만 공감대와 명성을 얻습니다.

목록의 각 단어를 같은 수의 문자로 사용할 수 있습니까?
피터 올슨

출력의 문자를 공백으로 분리해야합니까?
Lowjacker

@Peter Of The Corn : 단어 목록이 임의적이라고 가정해야합니다.
drspod

@Lowjacker : 공백은 연속 밑줄의 가독성을 향상시킵니다. 그렇지 않으면 글자가 몇 글자인지 계산하기가 어렵습니다.
drspod

답변:


6

루비 1.9 134 132 120 117 108 107

ARGV에서 제공되는 단어 목록. 경우에 따라 단어와 입력 한 문자가 일치해야합니다.

r=w=$*.sample
t=10
loop{puts [*w.tr(r,?_).chars]*' ',t
t>0&&r>''?w[l=STDIN.gets[0]]?r=r.tr(l,''):t-=1:exit}

8

Darn, 나는 그것이 "가장 적은 수의 라인 승리"라고 생각했습니다. 나는 가장 적은 캐릭터 콘테스트에서 이기지 않을 것이지만,이 Common Lisp 프로그램은 한 줄에 불과합니다.

(let ((words (list "that" "help" "rent" "chair" "octopus" "monitor" "manual" "speakers" "onomatopoeia" "regardless" "irresponsible" "cornerstone"))) (let ((word (nth (random (length words)) words))) (format t "~a~%" (funcall (defun play (word current remaining-attempts) (progn (if (not (find #\_ current)) (return-from play "You win!")) (if (equalp remaining-attempts 0) (return-from play "You lose!")) (format t "~a~%~d~%" current remaining-attempts) (let ((guess (char (read-line) 0)) (index 0) (found nil)) (loop for letter across word do (if (equalp guess letter) (progn (setf (char current index) letter) (setf found t))) (setf   index (+ index 1))) (if found (play word current remaining-attempts) (play word current (- remaining-attempts 1)))))) word (map 'string #'(lambda (c) #\_) word) 10))))

1
나는 당신이 의도적으로 유머러스하다고 확신하기 때문에 당신을 찬성합니다 :-)
Dr. Pain

8

파이썬 3.

from random,sys import *
w=choice(*argv)
L=set(w)
a=10
while L and a:
 print(" ".join("_"if x in L else x for x in w),a)
 try:L-=set(input()[0])
 except:a-=1

나는 이것을 선호하지만 길지만 더 좋다.

import random
w=random.choice(list(open("/usr/dict/words")))[:-1]
L=set(w)
a=10
while L and a:
 print(" ".join("_"if x in L else x for x in w),a)
 try:L.remove(input()[0])
 except:a-=1
print w

인쇄 a할 필요가 없다면 *두 번 사용할 수 있습니다 .print(*("_"if x in L else x for x in w))
badp

4

C ++ (헤더)

struct h{h(char a):b(a){}char operator()(char c,char d){return d!='_'?d:c==b?c:'_';}char b;};

int main(int a,char**b){
srand(time(0));string c=*(b+rand()%(a-1)+1),d(c.size(),'_'),e;
char f=10,g;
while(f){
cout<<"> ";cin>>g;e=d;
transform(c.begin(),c.end(),d.begin(),d.begin(),h(g));if(e==d)--f;
cout<<d<<endl<<(int)f<<endl;if(d==c)break;
}return 0;}

고양이 / usr / dict / words | xargs 행맨


">"입력 프롬프트는 솔루션에 필요하지 않습니다. 많은 언어가 이와 같은 프롬프트를 제공하므로 입력에 있음을 표시하기 위해 질문에 추가했습니다.
drspod

@drspod 그런 다음 질문을 수정하여 반영해야합니다.
Lowjacker

명확하게 편집
drspod

2

파이썬

import random

DEFAULT_ATTEMPTS = 10

def print_word(word, uncovered):
    for c in word:
        if c not in uncovered:
            c = '_'
        print c,
    print ''

def get_letter():
    letter = None
    while letter is None:
        letter = raw_input('> ')
        if len(letter) != 1:
            print 'Letters must be 1 character.  Try again.'
            letter = None
    return letter

if __name__ == '__main__':
    import sys

    if len(sys.argv) != 2: sys.exit(1)
    with open(sys.argv[1], 'r') as f:
        words = [word.strip() for word in f.readlines() if word.strip()]

    word = random.choice(words)
    uncovered = set([' '])
    attempts = DEFAULT_ATTEMPTS

    while attempts > 0 and any(letter not in uncovered for letter in word):
        print_word(word, uncovered)
        print attempts

        letter = get_letter()
        if letter in uncovered:
            print 'You have already tried that letter.'
        elif letter in word:
            print 'You got it!'
        else:
            print 'Wrong!'
            attempts -= 1

        uncovered.add(letter)

    if attempts == 0:
        print 'You lose!',
    else:
        print 'You win!'
    print 'The phrase was "%s".' % word

나는 실제로 가장 적은 문자를 시도하지 않았으며 아무것도 희생하지 않고 가능한 한 작게 만들고 싶었습니다.


@user : 이 사이트에 대한 George Edison의 훌륭한 사용자 스크립트에 관심이있을 수 있습니다. 이 스크립트 는 1225 자 (여기서 badp에 의해 복사 된)로 코드를 넣습니다.
dmckee --- 전 운영자 고양이

그게 내가 탭을 사용했기 때문에 여기에서 공백으로 변환되었다고 생각합니다. 화장실은 탭이있는 1034라고 말합니다.
Sergey G

@user : 예. 잘 알려진 어려움 파이썬 제출과 함께.
dmckee --- 전 운영자 고양이

2

펄, 112 자 더 잘할 수 있다고 생각합니다. 나중에 다시 시도하겠습니다.

$_=$ARGV[rand@ARGV];$a=10;while($a&&/[a-z]/){print map/[A-Z]/?$_:'_',split'';$x=<STDIN>;chop$x;s/$x/$x/ig||$a--}

단어는 명령 행에 표시되며 문자는 대문자로 입력됩니다


107까지 $_=$ARGV[rand@ARGV];$a=10;while($a&&/[a-z]/){$y=$_;$y=~y/a-z/_/;print$y;$x=<STDIN>;chop$x;s/$x/$x/ig||$a--}

3
원래 답변 만 편집 할 수 있습니다.
Lowjacker

1
나머지 시도 횟수는 표시되지 않습니다.
Lowjacker

2

클로저

이것은 400 바이트로 압축되어 있으며 아마도 Clojure가 변경 가능한 상태를 처리하는 방식으로 인해 여전히 많이 있습니다.

(def m ["will" "work" "for" "food"])
(def w (nth m (rand-int (count m))))
(def *s* (atom (replicate (count w) "_")))
(def *a* (atom 10))

(defn g [s a]
  (str (apply str (interpose " " s)) "\n" a))

(loop [n (read-line)]
  (if (some (set n) w)
    (swap! *s* (fn [s]
                 (map 
                   (fn [i]
                     (if (= n (str (nth w i)))
                       n
                       (nth s i)))
                   (range 0 (count s)))))
    (swap! *a* dec))

  (println (g (deref *s*) (deref *a*))) 

  (if (and (< 0 (deref *a*)) (some #{"_"} (deref *s*)))
    (recur (read-line))))

2

C # 370

using System;namespace h{class P{static void Main(string[]a){int c=10,d,l;char y=' ';string w=a[new Random().Next(a.Length)];l=w.Length;char[]x=new char[l];for(d=-1;++d<l;x[d]='-');while(c>0){for(d=-1;++d<l;x[d]=(y==w[d]||x[d]!='-')?w[d]:x[d]);Console.WriteLine(new string(x)+" "+c);if(w==new string(x))return;y=Console.ReadKey(true).KeyChar;if(!w.Contains(y+""))c--;}}}

논쟁으로서의 단어 목록


1

VB.NET


아직 축소를 시도하지는 않았지만
첫 번째 축소 :
두 번째 축소 (3759 자) :

Module Hangman
    Sub Main()
        Dim m As Int32, w = "banana|apple|pear|dog|cat|orange|monkey|programming|hangman".Split("|")(New Random().Next(9)), g = "", e = "", x, c As Char, f As Boolean, r = Sub(z) Console.Write(z), p = Sub(y, h) Console.SetCursorPosition(y, h), a = Sub() Console.Clear(), q = Function() Console.ReadKey(1), d = Sub()
                                                                                                                                                                                                                                                                                                                          r("       +--------+S       |        |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S   ---------------------".Replace("S", vbCrLf))
                                                                                                                                                                                                                                                                                                                          p(0, 2)
                                                                                                                                                                                                                                                                                                                          r(String.Join(vbCrLf, "    /------\S    | O   O|S    \  ... /S     ------ S        |   S        |   S        |   S        |   S -------+-------S        |   S        |   S        |   S       / \  S      /   \  S     /     \  S    /       \  ".Split("S").Take(m * 4)))
                                                                                                                                                                                                                                                                                                                      End Sub
        Console.CursorVisible = 0
        Do
            a()
            d()
            p(30, 10)
            f = 0
            For Each x In w
                If g.Contains(x) Then
                    r(x)
                Else
                    r(" ")
                    f = 1
                End If
                Console.CursorTop += 1
                Console.CursorLeft -= 1
                r("_")
                Console.CursorTop -= 1
                r(" ")
            Next
            If Not f Then
                a()
                d()
                p(30, 10)
                r("You win! Press any key to close.")
                q()
                End
            End If
            p(30, 13)
            r(e)
            Do
                c = q().KeyChar
            Loop Until Char.IsLetter(c)
            If g.Contains(c) Then
                e = "You have already guessed that letter."
            Else
                g &= c
                If w.Contains(c) Then
                    e = "There is a" & If("aehilmnorsx".Contains(c), "n", "") & " """ & c & """ in the word."
                Else
                    e = "There is no """ & c & """ in the word. Try again."
                    m += 1
                End If
            End If
        Loop Until m = 4
        a()
        d()
        p(30, 10)
        r("You lose! Press any key to close.")
        q()
    End Sub
End Module

모든 들여 쓰기가 실제로 필요합니까?
Lowjacker

읽기 쉬워 지나요?
Nate Koppenhaver

블록처럼? 아니요, 필수는 아니지만 문자로 계산하지 않습니다.
Ry-

0

파워 쉘, 125 바이트

$w=$h=$args|random|% t*y
for($n=10){$w-replace"[ $h]",'_'-join' ';$n
if(!$h+!$n){break}$n-=($c=Read-Host)-notin$h
$h=$h-ne$c}

덜 골프 테스트 스크립트 :

$f = {

$word=$hidden=$args|random|% toCharArray    # let $word and $hidden are a random word chars
#$word                                      # uncomment this to cheating
for($n=10){                                 # forever for with init section
    $word-replace"[ $hidden]",'_'-join' '   # display the word with hidden letters
    $n                                      # display $n
    if(!$hidden+!$n){break}                 # break loop if hidden array is empty or n equal to 0
    $n-=($c=Read-Host)-notin$hidden         # input $c from user, decrease $n if $c does not in $hidden array
    $hidden=$hidden-ne$c                    # recreate $hidden array with removed $c
}

}

$words = gc .\wordlist.txt
&$f $words

추측 플레이어가 한 출력 예를 분실 :

_ _ _ _ _ _ _ _
10
i
_ _ _ _ _ _ _ _
9
e
_ _ e _ _ _ _ e
9
o
o _ e _ _ o _ e
9
a
o _ e _ _ o _ e
8
q
o _ e _ _ o _ e
7
q
o _ e _ _ o _ e
6
q
o _ e _ _ o _ e
5
q
o _ e _ _ o _ e
4
q
o _ e _ _ o _ e
3
q
o _ e _ _ o _ e
2
q
o _ e _ _ o _ e
1
q
o _ e _ _ o _ e
0

추측 플레이어가 승리 했을 때의 출력 예 :

_ _ _ _ _ _ _ _ _ _
10
e
_ _ _ _ e _ _ _ _ _
10
o
_ o _ _ e _ _ _ _ _
10
i
_ o _ _ e _ _ i _ _
10
a
_ o _ _ e _ _ i a _
10
l
_ o _ _ e _ _ i a l
10
c
c o _ _ e _ c i a l
10
m
c o m m e _ c i a l
10
t
c o m m e _ c i a l
9
r
c o m m e r c i a l
9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.