Adam asmaca kelime oyunu golf


14

Esinlenerek reddit .

Adam Asmaca oynayan bir program yazın .

  • Program N kelimesi listesinden rastgele bir kelime seçer, burada N> 2.
  • Kelime listesi, programa istediğiniz şekilde verilebilir.
  • Her yinelemede

    • Henüz keşfedilmemiş harfler için alt çizgi kullanarak oyunun durumunu yazdırın:

    H _ N _ _ _ N

    • Kalan deneme sayısını yazdırın

    10

    • Stdin'den bir mektup okuyun ve oyunun durumunu güncelleyin, yanlış bir harf tahmin ederse bir girişim çıkartın.

    A (giriş)

    H A N _ _ A N

    10

    • Tüm harfler tahmin edilinceye veya denemeler 0'a ulaşıncaya kadar tekrarlayın
  • Herhangi bir dil kullanın
  • En az sayıda karakter kazanır.
  • Darağacı çizmek gerekli değildir, ancak size oy ve kudos kazanacaktır.

Listedeki her kelimenin aynı sayıda karakter olmasına izin verebilir miyim?
Peter Olson

Çıktıdaki harflerin boşluklarla ayrılması gerekiyor mu?
Lowjacker

@Peter Of The Corn: kelime listesinin keyfi olduğunu varsaymalısınız
drspod

@Lowjacker: boşluklar ardışık alt çizgilerin okunabilirliğini artırır, aksi takdirde kaç harfi temsil ettiklerini saymak zordur.
drspod

Yanıtlar:


6

Yakut 1.9, 134 132 , 120 117 108 107

ARGV'de sağlanan kelime listesi. Kelimeler ve girilen harfler büyük olasılıkla eşleşmelidir.

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

Lanet olsun, "en az sayıda hat kazanıyor" dediğini sanıyordum. Burada en az karakter yarışması kazanmayacağım, ama bu Common Lisp programı sadece bir satır.

(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
Seni yükseltiyorum çünkü kasıtlı olarak esprili olduğunuzdan eminim :-)
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

Bunu tercih ederim: daha uzun ama daha güzel.

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

Ben de yazdırmak zorunda değildi a, ben *iki kez kullanabilirsiniz :print(*("_"if x in L else x for x in w))
badp

4

c ++ (başlıklar)

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

kedi / usr / dict / words | xargs cellat


">" Giriş istemi çözüm için gerekli değildir, ben sadece girdi olduğunu belirtmek için soruya ekledim, çünkü birçok dil böyle bir istem sağlar.
drspod

@drspod Soruyu, bunu yansıtacak şekilde düzenlemelisiniz.
Lowjacker

açıklığa kavuşturmak için düzenlendi
drspod

2

piton

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

En az sayıda karakteri gerçekten denemedim, sadece hiçbir şeyden ödün vermeden mümkün olduğunca küçük yapmak istedim.


@user: George Edison'un 1225 karaktere kodunuzu (burada badp tarafından kopyalandığı gibi) koyan bu site için harika kullanıcı komut dosyasıyla ilgilenebilirsiniz.
dmckee --- eski moderatör yavru kedi

Sanırım bu sekmeleri kullanıyordum ve buradaki boşluklara dönüştürüldüler. wc sekmeli 1034 olduğunu söylüyor.
Sergey G

@ kullanıcı: Evet. Bir iyi bilinen zorluk piton gönderimleri ile.
dmckee --- eski moderatör yavru kedi

2

Perl, 112 karakter. Daha iyisini yapabileceğimi hissediyorum - belki daha sonra tekrar deneyeceğim

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

Komut satırında sözcükler, büyük harfli harfler


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
Sadece orijinal cevabınızı düzenleyebilirsiniz.
Lowjacker

1
Bu, kalan deneme sayısını göstermez.
Lowjacker

2

Clojure

Bu 400 bayt gziptir, bu da hala oldukça fazla, muhtemelen Clojure'un değişebilir durumu nasıl ele aldığı.

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

argüman olarak wordlist


1

VB.NET


Henüz küçülmeyi denemedim, ama:
İlk küçülme:
İkinci küçülme (3759 karakter):

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

Tüm girinti gerçekten gerekli mi?
Lowjacker

okumayı kolaylaştırır, değil mi?
Nate Koppenhaver

Bloklar gibi mi? Hayır, gerekli değil, ama karakter olarak saymıyorum.
Ry-

0

Powershell, 125 bayt

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

Daha az golf test senaryosu:

$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

Tahmin eden oyuncu kaybedildiğinde çıktı örneği :

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

Tahmin eden oyuncu kazandığında çıktı örneği :

_ _ _ _ _ _ _ _ _ _
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.