เกมคำศัพท์ Hangman กอล์ฟ


14

แรงบันดาลใจจากReddit

เขียนโปรแกรมที่เล่นเป็นเพชฌฆาต

  • โปรแกรมเลือกคำที่สุ่มจากรายการคำ N โดยที่ N> 2
  • รายการคำสามารถให้กับโปรแกรมในวิธีที่คุณเลือก
  • ในแต่ละรอบซ้ำ

    • พิมพ์สถานะของเกมโดยใช้เครื่องหมายขีดล่างสำหรับตัวอักษรที่ยังไม่ได้ค้นพบ:

    H _ N _ _ _ N

    • พิมพ์จำนวนครั้งที่เหลือ

    10

    • อ่านจดหมายจาก stdin และอัพเดตสถานะของเกมลบความพยายามหากพวกเขาเดาตัวอักษรที่ไม่ถูกต้อง

    A (input)

    H A N _ _ A N

    10

    • ทำซ้ำจนกว่าจะเดาตัวอักษรทั้งหมดหรือพยายามถึง 0
  • ใช้ภาษาใดก็ได้
  • จำนวนอักขระน้อยที่สุดชนะ
  • การวาดตะแลงแกงนั้นไม่จำเป็น แต่จะทำให้คุณได้รับ upvotes และรุ่งโรจน์

ฉันสามารถให้แต่ละคำในรายการเป็นจำนวนอักขระได้หรือไม่
Peter Olson

ตัวอักษรในเอาต์พุตต้องถูกคั่นด้วยช่องว่างหรือไม่?
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

ฉันคิดว่ามันพูดว่า "ชนะน้อยที่สุด" ฉันจะไม่ชนะการแข่งขันที่มีตัวละครน้อยที่สุด แต่โปรแกรม 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
ฉันกำลังถอนรากถอนโคนคุณเพราะฉันค่อนข้างแน่ใจว่าคุณกำลังมีอารมณ์ขัน :-) โดยเจตนา
ดร. ปวด

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

ฉันชอบอันนี้มากกว่า: นานกว่า แต่ดีกว่า

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

cat / usr / dict / words | xargs hangman


พรอมต์ ">" สำหรับการป้อนข้อมูลไม่จำเป็นสำหรับการแก้ปัญหาฉันเพิ่งเพิ่มเข้าไปในคำถามเพื่อระบุว่าเป็นอินพุตเนื่องจากภาษาหลายภาษาให้พรอมต์เช่นนี้
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 สำหรับเว็บไซต์นี้ซึ่งทำให้โค้ดของคุณ (คัดลอกโดย badp) ที่ความยาว 1225 ตัวอักษร
dmckee --- ผู้ดูแลอดีตลูกแมว

ฉันคิดว่านั่นเป็นสาเหตุที่ฉันใช้แท็บและถูกแปลงเป็นช่องว่างที่นี่ ห้องสุขาบอกว่ามันคือ 1034 ที่มีแท็บ
Sergey G


2

Perl, 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

Clojure

นี่คือ 400 ไบต์ gzipped ซึ่งยังค่อนข้างมากอาจเป็นเพราะวิธี 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

Powershell ขนาด 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.