Parola dell'impiccato golf


14

Ispirato da reddit .

Scrivi un programma che riproduca Hangman .

  • Il programma sceglie una parola casuale da un elenco di N parole, dove N> 2.
  • L'elenco di parole può essere fornito al programma in qualsiasi modo tu scelga.
  • Ad ogni iterazione

    • Stampa lo stato del gioco usando i trattini bassi per le lettere non ancora scoperte:

    H _ N _ _ _ N

    • Stampa il numero di tentativi rimanenti

    10

    • Leggi una lettera di stdin e aggiorna lo stato del gioco, sottraendo un tentativo se indovinano una lettera errata.

    A (ingresso)

    H A N _ _ A N

    10

    • Ripeti finché tutte le lettere non vengono indovinate o i tentativi raggiungono 0
  • Usa qualsiasi lingua
  • Vince il minor numero di personaggi.
  • Disegnare la forca non è necessario, ma ti farà guadagnare voti positivi e complimenti.

Posso lasciare che ogni parola nell'elenco abbia lo stesso numero di caratteri?
Peter Olson,

Le lettere nell'output devono essere separate da spazi?
Lowjacker,

@Peter Of The Corn: dovresti presumere che l'elenco delle parole sia arbitrario
drspod

@Lowjacker: gli spazi migliorano la leggibilità dei caratteri di sottolineatura consecutivi, altrimenti è difficile contare quante lettere rappresentano.
drspod,

Risposte:


6

Rubino 1.9, 134 132 120 117 108 107

Elenco di parole fornito in ARGV. Le parole e le lettere inserite devono corrispondere nel caso.

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

Accidenti, ho pensato che dicesse "vince il minor numero di linee". Non ho intenzione di vincere nessun concorso di pochi personaggi qui, ma questo programma Common Lisp è solo una riga.

(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
Ti sto votando perché sono abbastanza sicuro che tu sia intenzionalmente umoristico :-)
Dr. Pain

8

Python 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

Preferisco questo però: più lungo ma più bello.

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

Se non dovessi stampare aanche io, potrei usare *due volte:print(*("_"if x in L else x for x in w))
badp,

4

c ++ (-headers)

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

cat / usr / dict / words | boia xargs


Il prompt ">" per l'input non è necessario per la soluzione, l'ho appena aggiunto nella domanda per indicare che è stato inserito, poiché molte lingue forniscono un prompt come questo.
drspod,

@drspod Dovresti modificare la domanda per riflettere quella, quindi.
Lowjacker,

modificato per chiarire
drspod,

2

Pitone

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

Non ho davvero provato per il minor numero di personaggi, volevo solo renderlo il più piccolo possibile senza sacrificare nulla.


@utente: Potresti essere interessato al meraviglioso script utente di George Edison per questo sito che mette il tuo codice (come copiato qui da badp) a 1225 caratteri.
dmckee --- ex gattino moderatore,

Penso che sia perché stavo usando le schede e sono state convertite in spazi qui. wc dice che è 1034 con le schede.
Sergey G,

@utente: Sì. Una difficoltà ben nota con gli invii di Python.
dmckee --- ex gattino moderatore,

2

Perl, 112 caratteri. Sento di poter fare di meglio, forse ci riproverò più tardi

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

Sulla riga di comando sono riportate le parole, le lettere sono scritte in maiuscolo


$_=$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
Potresti semplicemente modificare la risposta originale.
Lowjacker,

1
Questo non mostra il numero di tentativi rimanenti.
Lowjacker,

2

Clojure

Si tratta di 400 byte compressi con gzip, che è ancora abbastanza, probabilmente a causa di come Clojure gestisce lo stato mutabile.

(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--;}}}

elenco di parole come argomento


1

VB.NET


Non ho ancora provato a ridurlo, ma:
Primo restringimento:
Secondo restringimento (3759 caratteri):

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

Tutto il rientro è davvero richiesto?
Lowjacker

rende più facile la lettura, no?
Nate Koppenhaver,

Come in blocchi? No, non è richiesto, ma non lo conto come personaggi.
Ry,

0

Powershell, 125 byte

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

Script di test meno golfato:

$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

Esempio di output quando il giocatore indovinello ha perso :

_ _ _ _ _ _ _ _
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

Esempio di output quando il giocatore che indovina ha vinto :

_ _ _ _ _ _ _ _ _ _
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.