ASCII Hangman đang tiến hành


21

(lấy cảm hứng từ một câu hỏi trên Đánh giá mã)

Giả sử hai người đang chơi Hangman , nhưng bạn chỉ tình cờ nghe được trò chơi và muốn rút ra trạng thái hiện tại.

Đưa ra hai từ làm đầu vào, trong đó các từ mỗi trận đấu [A-Z]+hoặc [a-z]+(lựa chọn của bạn), xuất trạng thái hiện tại của trò chơi treo cổ dưới dạng nghệ thuật ASCII, theo các quy tắc dưới đây.

  • Từ đầu tiên là từ cần đoán và từ thứ hai là các chữ cái đã đoán. Đây có thể được thực hiện như là đầu vào theo thứ tự bất kỳ.
  • Từ được đoán được đảm bảo không trống, nhưng các chữ cái đã đoán có thể trống (nghĩa là như là bắt đầu của trò chơi).
  • Trò chơi sẽ luôn là một trò chơi treo cổ hợp lệ (nghĩa là các chữ cái được đoán sẽ không bị trùng lặp, các chữ cái sẽ không được đoán trước khi kết thúc trò chơi, bạn sẽ chỉ nhận được các chữ cái làm đầu vào, v.v.).
  • Bên dưới bản vẽ hangman phải là từ cần đoán, với _vị trí các chữ cái chưa được biết, cách nhau bởi khoảng trắng. Ví dụ, nếu từ cần đoán là BOAT, thì bên dưới bản vẽ hangman phải là _ _ _ _. Nếu từ được BOATvới Adự đoán, sau đó bên dưới bản vẽ phải _ _ A _.
  • Bên dưới từ cần đoán phải là các chữ cái đã được đoán là không có trong từ. Chúng có thể được sắp xếp theo thứ tự bất kỳ, và có thể được phân tách bằng bất kỳ dấu phân cách không theo thứ tự chữ cái nào, nếu muốn.

Dưới đây là các trạng thái của trò chơi hangman, từ lúc bắt đầu đến khi kết thúc trò chơi. Mỗi lá thư đoán sai tiến bộ nhà nước một. Vì vậy, chữ cái đầu tiên đoán sai làm cho cái đầu Oxuất hiện, cái tiếp theo làm cho cơ thể |xuất hiện, v.v.

  +---+
  |   |
      |
      |
      |
      |
=========

  +---+
  |   |
  O   |
      |
      |
      |
=========

  +---+
  |   |
  O   |
  |   |
      |
      |
=========

  +---+
  |   |
  O   |
 /|   |
      |
      |
=========

  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========

  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========

  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========

Đầu vào

  • Hai chuỗi trong bất kỳ định dạng thuận tiện , với đầu tiên được đảm bảo không trống.
  • Bạn có thể lấy đầu vào theo thứ tự (ví dụ: từ để đoán và sau đó đoán các chữ cái hoặc ngược lại). Vui lòng nêu trong trình của bạn thứ tự đầu vào.

Đầu ra

Đại diện nghệ thuật ASCII kết quả của trò chơi hangman đang diễn ra, như được mô tả ở trên, một lần nữa ở bất kỳ định dạng thuận tiện.

Quy tắc

  • Các dòng mới hoặc dấu cách hàng đầu hoặc dấu trắng đều là tùy chọn, miễn là bản thân các ký tự xếp hàng chính xác.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

# 1

BOATATG

  +---+
  |   |
  O   |
      |
      |
      |
=========
_ _ A T
G

# 2

ZEPPELIN

  +---+
  |   |
      |
      |
      |
      |
=========
_ _ _ _ _ _ _ _

# 3

ZEPPELINEATOLINSHR

  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========
_ E _ _ E L I N
A T O S H R

#4

RHYTHMABCDE

  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========
_ _ _ _ _ _
EDCBA

# 5

BOATATOB

  +---+
  |   |
      |
      |
      |
      |
=========
B O A T

# 6

AIRPLANEAJKEI

  +---+
  |   |
  O   |
  |   |
      |
      |
=========
A I _ _ _ A _ E
KJ

các chữ cái sai phải bảo toàn thứ tự đầu vào?
Rod

@Rod Không, không cần phải giữ trật tự của những lần đoán sai.
admBorkBork

2
Vui lòng thêm một trường hợp thử nghiệm trong đó tất cả các chữ cái được đoán chính xác và một trong đó tất cả đã được đoán
Ông Xcoder

@ Mr.Xcoder Tôi đã thêm trường hợp thử nghiệm số 5 trong đó người đó đã đoán thành công "BOAT" ngay lập tức.
admBorkBork

Tôi đã thêm một trường hợp thử nghiệm chỉ có 2 chữ cái không chính xác để phân biệt giữa thứ tự xây dựng chính xác và xây dựng từ trên xuống dưới / từ trái sang phải.
Justin Mariner

Câu trả lời:


10

Python 2 , 215 192 184 183 byte

-8 byte nhờ Raphaël Côté
-1 byte nhờ Jonathan Frech

a,b=input()
j=' '.join
s=b-set(a)
print"""  +---+
  |   |
  %s   |
 %s%s%s  |
 %s %s  |
      |
=========
"""%tuple('O/|\/\\'[:len(s)].ljust(6)),j(['_',i][i in b]for i in a),'\n',j(s)

Hãy thử trực tuyến!


Bằng cách chuyển đổi tất cả \ n thành dòng mới và sử dụng chuỗi đa dòng với "" "và cũng bằng cách sử dụng" bất kỳ định dạng thuận tiện "nào của đầu vào và đặt lại các cuộc gọi đã đặt trở lại đầu vào, tôi có thể giảm xuống còn 172 byte.
Raphaël Côté

hmm, bạn có thể liên kết các thay đổi? Tôi chỉ đạt được 184 byte
Rod

184 là tốt: loại bỏ các bộ từ mã thực sự đã phá vỡ đầu ra, do đó không hoạt động. Thay đổi \ n để chúng trở thành dòng mới giúp ích nhưng tôi thực sự chỉ xóa 3 byte thành 189. tio.run/iêu
Raphaël Côté

1
Tôi tin rằng bạn nên hiển thị phần cơ thể ( |) thay vì cánh tay trái ( /) khi có 2 chữ cái sai: Hãy thử trực tuyến
Justin Mariner

"\\/"bằng "\/".
Jonathan Frech

8

Than , 83 69 68 byte

Fη¿№θι⁰«ι→⊞υι»←⸿Fθ«⎇№ηιι_→»←⸿×=⁸↖=←↑⁵←+←³↓+|FLυ≡ι⁰↓O¹←|²/|³\⁴⸿ /⁵ \«

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 14 byte bằng cách chuyển sang switch. Đã lưu 1 byte bằng cách in đơn |dưới dạng chữ. Lưu ý: Tại thời điểm câu hỏi được đặt, switchhoàn toàn không hoạt động ở chế độ Verbose và cần một dấu vết «ở chế độ Succinc (phiên bản hiện tại trên TIO không có lỗi, vì vậy nó hiển thị bản dịch Succinc là 67 byte), trong khi Mapđó lỗi ngăn tôi sử dụng Print(Join(Map(q, Ternary(Count(h, i), i, "_")), " "));. May mắn thay, tôi đã tìm được một loại bùn có cùng độ dài (và thực sự tôi cũng đã thử chuyển vòng lặp khác sang Bản đồ nhưng nó cũng xuất hiện ở cùng độ dài). Giải trình:

Fη              For each letter in the guess,
  ¿№θι⁰«        if the word to be guessed does not contain the letter,
        ι→      print the failed guess, leave a gap,
          ⊞υι»  and push the letter to the array.

←⸿              Move to the start of the previous line.

Fθ«             For each letter in the word to be guessed,
   ⎇№ηιι        if the letter has been guessed then print it
        _       otherwise print a _.
         →»     Either way, leave a gap.

←⸿              Move to the start of the previous line.

×=⁸             Print 8 =s
   ↖=←          Print a 9th =, moving into position to
      ↑⁵        print 5 |s upwards,
        ←+←³    a + and 3 -s left,
            ↓+| and a + and a | down.

FLυ             Loop once for each incorrect guess.
   ≡ι           Choose what to print based on the loop index.
     ⁰↓O        For the first incorrect guess, print an O.
     ¹←|        For the second incorrect guess, print a |.
     ²/         For the third incorrect guess, print a /.
     ³|\        For the fourth incorrect guess, print a \.
     ⁴⸿ /       For the fifth incorrect guess, print a / on the next line.
     ⁵ \        For the sixth incorrect guess, print another \.

2
ngôn ngữ này ... nó làm tôi sợ
Serge Grinev

@SergeyGrinev D: tại sao nó lại đáng sợ đến thế
ASCII chỉ có

Chỉ có ASCII Tôi nhận thấy bạn đã sửa lỗi Map (chuỗi, biểu thức) nhưng Map (mảng, biểu thức) vẫn có lỗi - nó thay đổi mảng ban đầu khi được sử dụng như một biểu thức chứ không phải là một lệnh. Hãy thử trực tuyến!
Neil

Hehe chỉ có ASCII, đó là một ý tưởng tuyệt vời cho một ngôn ngữ, nhưng các kịch bản trông giống như một cái gì đó Lovecraft sẽ sử dụng để triệu tập chính tả Cthulhu.
Serge Grinev

@Neil Đó là hành vi dự định, chủ yếu là để sửa đổi khung vẽ khi ánh xạ kiểu dữ liệu của các ô, nhưng tôi đoán vâng, bạn thường cần sử dụng dữ liệu gốc sau bản đồ, nó sẽ được sửa vào ngày mai
ASCII

7

Python 2 , 220 byte

x,y=input()
x=[['_',k][k in y]for k in x]
y-=set(x)
s='''  +---+
  |   |
  0   |
 213  |
 4 5  |
      |
'''
for i in range(6):s=s.replace(`i`,[' ','O|/\\/\\'[i]][len(y)>i])
print s+'='*9+'\n'+' '.join(x)+'\n'+''.join(y)

Hãy thử trực tuyến!

-35 byte nhờ Raphaël Côté
-20 byte sử dụng bộ
-1 byte nhờ micsthepick


3
ý tưởng hay cho việc "thay thế" bằng những con số :)
V. Courtois

@ V.Courtois Cảm ơn :) Tôi sẽ sử dụng translatenhưng hóa ra là lâu hơn lol.
HyperNeutrino

Xin chào @HyperNeutrino, công việc tốt với trình! Tôi nghĩ rằng 2 vòng lặp ở cuối có thể được đặt thành một, sử dụng cái này for i in range(7):s=s.replace(`i`,'O|/\\/\\'[i] if i<c else ' '). Nó cung cấp cho bạn một vòng lặp duy nhất và bạn chỉ cần thay thế nếu bạn kết thúc c. Bạn có thể hạ xuống còn 251 byte theo cách này :)
Raphaël Côté

@ RaphaëlCôté Sân golf đẹp. Cảm ơn!
HyperNeutrino

c chỉ trở nên vô dụng. Chỉ cần sử dụng len (y) và tiết kiệm 4 byte! Chúng ta quẩy lên!
Raphaël Côté

5

Thạch ,  72  73 byte

+1 sửa lỗi trò chơi ace cho thấy người bị treo cổ hoàn toàn (đã thay đổi LN thành Lạ6gần cuối)

e€a⁸o”_$,ḟ@©K€Y,@“¥[$⁼Ż⁸½c¤ṫȷṃl®ḌvNṂeL©?Ḥ’ṃ“ -¶|O/\=+”¤Y⁶“$"÷ȷñŒ‘ḣ®Lạ6¤¤¦

Một liên kết dyadic lấy từ bên trái và các chữ cái (duy nhất và trong trò chơi) ở bên phải và trả về một danh sách các ký tự hoặc một chương trình đầy đủ lấy đầu vào làm đối số dòng lệnh và in kết quả.

Hãy thử trực tuyến!

Làm sao?

Thứ nhất:

“¥[$⁼Ż⁸½c¤ṫȷṃl®ḌvNṂeL©?Ḥ’ - base 250 number
                            = 305169639782226039115281574830092231403740634016078676

Là giá trị số của người treo cổ đầy đủ trong cơ sở 9, trong đó mỗi của 9 chữ số đại diện cho một trong những nhân vật: <space>, <newline>, -, |, O, /, \, =, hoặc +.

phần còn lại của chương trình:

e€a⁸o”_$,ḟ@©K€Y,@“...’ṃ“...”¤Y⁶“...‘ḣ®Lạ6¤¤¦ - Main link word, letters
e€                                           - exists in letters for €ach char in word
  a⁸                                         - and with word (word with 0 at un-guessed)
    o”_$                                     - or with '_' (word with _ at un-guessed)
         ḟ@                                  - filter remove (incorrect guesses)
           ©                                 - copy the result to the register and yield
        ,                                    - pair
            K€                               - join €ach with spaces
              Y                              - join with (a) newlines
                            ¤                - nilad followed by link(s) as a nilad:
                 “...’                       - the number described above
                       “...”                 - list of chars " -¶|O/\=+" (¶ = a newline)
                      ṃ                      - base decompress using the chars as digits
               ,@                            - pair (using swapped @rguments)
                             Y               - join with (a) newlines
                                           ¦ - sparse application:
                              ⁶              -   of: a space character
                                             -   to indexes:
                                          ¤  -     nilad followed by links as a nilad:
                               “...‘         -       literal [36,34,28,26,27,19]
                                         ¤   -       another nilad chain:
                                     ®       -         recall from register
                                      L      -         length (# of bad guesses)
                                       ạ6    -         absolute difference with 6
                                    ḣ        -       head (get the indexes to "erase"
                                             -             by applying the space char)
                                             - as a full program: implicit print

Điều này thất bại trên BOATATOBtrường hợp thử nghiệm. Hãy thử trực tuyến!
fireflame241

À cảm ơn vì đã chỉ ra điều đó, tôi sẽ sửa nó trong 2 byte ... chỉ cần viết một lời giải thích.
Jonathan Allan

thực hiện và tạo 1 byte đó.
Jonathan Allan

Lưu ý: Thì quá khứ của "hang" khi nói đến mọi người là "treo", không phải "treo". Chỉ cần một nitlog để có +1 để được bồi thường :)
HyperNeutrino

@ N̛ευτŗιͷo Heh, tôi đã treo ở một nơi và treo ở một nơi khác và thay đổi cái sau. (Tôi cũng đã nói "đầy đủ", như thể người chưa hoàn thành cũng không bị treo cổ hoàn toàn).
Jonathan Allan

3

Japt v2 , 94 91 83 81 byte

-3 byte từ một số ý tưởng từ cách tiếp cận của @ETHproductions cho điều này .
-8 byte bằng cách sử dụng xoay chuỗi đa dòng.
-2 byte bằng cách sử dụng v2.

["+|||||
-
-
-  35
+|01
   24
"r\d_¨VkU l ?S:"O|/\\/\\"gZÃz '=³³¡VøX ?X:'_øVkU]·

Lấy cả hai từ đầu vào dưới dạng mảng các ký tự, với từ đoán trước và chữ thứ hai đoán. Các chữ cái không chính xác được hiển thị cách nhau bởi, s. Khi không có chữ cái không chính xác, dòng cuối cùng trống (có nghĩa là đầu ra chứa một dòng mới bổ sung).

Hãy thử trực tuyến!

Giải trình

Tiềm ẩn: UVlà mảng char đầu vào.

["..."

Bắt đầu một mảng và đẩy chuỗi định dạng người treo, xoay trái 90 °.

r\d_

Thay thế ( r) mỗi chữ số ( \d) bằng hàm sau:

¨VkU l ?S:"O|/\\/\\"gZÃ

Nếu chữ số là >=( ¨) số lượng đoán sai ( VkU l), khoảng trắng ( S), nếu không, hãy lấy phần thân phù hợp cho chữ số đó ( "..."gZ).

z '=³³

Xoay người treo đúng 90 ° và đẩy =lặp lại 3 * 3 ( ³³) lần vào mảng.

¡VøX ?X:'_Ã

Nhấn từ để đoán, với các chữ cái được ánh xạ ( ¡) sang chính chúng ( X) nếu được chứa trong V( VøX) hoặc _nếu không và được nối với khoảng trắng ( ¸), vào mảng.

VkU]·

Đẩy các chữ cái đã đoán, với các chữ cái trong từ để đoán được loại bỏ ( k), sang mảng đầu ra. Đóng mảng và tham gia với dòng mới ( ·).

Xoay vòng trực quan:

+|||||      +---+
-           |   |
-      ->   0   |
-  35      213  |
+|01       4 5  |
   24             

Tôi đã có một cái gì đó tương tự: ethproductions.github.io/japt/ mài (mặc dù bây giờ tôi nhận thấy tôi có ba phân đoạn giữa được đặt theo thứ tự sai). Tôi thấy một số phần trong bạn ngắn hơn cách tôi đã làm, có thể câu trả lời của chúng tôi có thể kết hợp với một cái gì đó thậm chí còn ngắn hơn.
Sản phẩm ETH

@ETHproductions Tôi không nghĩ rằng ý tưởng tăng dần của bạn Wcó thể hoạt động vì các bộ phận cơ thể không xuất hiện từ trái sang phải / từ trên xuống dưới. Tôi đã có thể lưu một vài byte từ phiên bản của bạn, mặc dù.
Justin Mariner

2

05AB1E , 83 byte

•LO„Ÿ¼Ì‘Šη…ÔÆ#δʒΣ•6B4ÝJ"+ -|="‡²¹SK©Ùg"O/|\/\"s£v5y.;}7ô»„==«5ð:¹D²SKDg'_ׇSðý®Sðý»

Hãy thử trực tuyến!


Bitmap:

05AB1E , 18 byte

•LO„Ÿ¼Ì‘Šη…ÔÆ#δʒΣ• # Push number described below in base-10.

Hãy thử trực tuyến!

Điều này đẩy kế hoạch bitmap sau:

1102220
1131113
1151113
1555113
1515113
1111113
4444444

Trường hợp các byte bổ sung sau:

05AB1E , 13 byte

6B            # Convert to base-6.
  4ÝJ         # Push 01234.
     "+ -|="  # Push that string.
            ‡ # Replace numbers with those letters.

Hãy thử trực tuyến!

Thay thế các mảnh của bitmap bằng các ký tự thích hợp, để lại 5 giây để thay thế các mảnh của hangman sau:

  +---+
  |   |
  5   |
 555  |
 5 5  |
      |
=======

Người đàn ông bị treo cổ:

Tiếp theo, chúng tôi tính toán số lần người dùng đoán sai bằng cách lấy các chữ cái ở đầu vào thứ hai, nhưng không phải trong đầu vào đầu tiên:

05AB1E , 6 byte

²¹SK   # Get wrong guesses.
    ©Ù # Store them, and get unique wrong letters.

Hãy thử trực tuyến!


Cuối cùng, chúng tôi sử dụng một bitmap thứ cấp để thay thế trong người bị treo cổ, phân tách bằng các dòng mới và chuẩn bị cho bản in cuối cùng:

05AB1E , 26 byte

g                           # Get the number of "messups".                       
 "O/|\/\"s£                 # Only that many chars of the hanged "bitmap".
           v5y.;}           # Replace 5's with "bitmap".
                 7ô»        # Split into rows.
                    „==«5ð: # Remove additional 5's.

Hãy thử trực tuyến!

Điều này dẫn đến các mảnh đầu tiên, các mảnh duy nhất còn lại được xuất ra hai từ ở phía dưới ở định dạng khác ...


Những từ dưới đây:

In từ đầu tiên mà không cần đoán thiếu:

05AB1E , 15 byte

¹D²SK          # Word without the missing guesses.
     Dg'_ׇ    # Replace missing guesses with "_".
           Sðý # Join by spaces.

Hãy thử trực tuyến!


05AB1E , 5 byte

®     # Print stored missing guesses.
 Sðý  # Separated by spaces.
    » # Print everything in stack with newlines.

Hãy thử trực tuyến!

In các dự đoán bị bỏ lỡ tính toán từ trước đó chúng tôi lưu trữ trong một đăng ký.


1
Tôi thực sự thích ý tưởng bitmap (cố gắng thực hiện nó trong câu trả lời của riêng tôi, thậm chí), nhưng câu trả lời của bạn đặt cánh tay trái ( /) trước cơ thể ( |). Hai chữ cái sai sẽ dẫn đến phần đầu và phần cơ thể hiển thị. Dùng thử trực tuyến
Justin Mariner

1

Thạch , 86 byte

3ȷ6Dẋ6Ḍ+“Ȧṇ⁹c’
œ-Lḣ@“Ñæçðøþ‘⁵*$€×“µI,’D¤¤S+¢Dị“+-|/\O ”Us7Y,”=x9¤Y;⁷,œ-ðjɓi@€ị³;”_¤K;⁷

Hãy thử trực tuyến!

Whew ... điều này thật thú vị. Tôi chưa bao giờ sử dụng nhiều¤ nhân vật.

Làm thế nào nó hoạt động

3ȷ6Dẋ6Ḍ+“Ȧṇ⁹c’ (1) the literal 300000030000003000000300000030003001222100
3ȷ6              - literal 3*10^6 = 3000000
   D             - digits
    ẋ6           - repeat six times
      Ḍ          - return to integer: 300000030000003000000300000030000003000000
       +         - add
        “Ȧṇ⁹c’   - literal 2998222100

œ-Lḣ@“Ñæçðøþ‘⁵*$€×“µI,’D¤¤S+¢Dị“+-|/\O ”Us7Y,”=x9¤Y,œ-;⁷ð,ɓi@€ị³;”_¤K;⁷
œ-Lḣ@“Ñæçðøþ‘⁵*$€×“µI,’D¤¤S - representation of the body parts
œ-L                           - wrong letters length
   ḣ@                         - get that many elements from the start of
                        ¤¤    - the literal:
     “Ñæçðøþ‘                   - [16, 22, 23, 24, 29, 31]
             ⁵*$€               - 10 to the power of each of them
                 ×              - multiplies by
                  “µI,’D        - the list [6, 4, 3, 5, 4, 5]
                          S   - sum
+¢Dị“+-|/\O ”Us7Y,”=x9¤;⁷  - complete the man
+                           - add
 ¢                          - the literal 3000000...1222100 calculated by link 1
  D                         - digits
   ị“+-|/\O ”               - index into the string “+-|/\O ”
             Us7Y           - reverse, split into lines of 7, join by linefeeds
                 ,          - append
                  ”=x9¤;⁷     - the string “=========”
                       ;⁷    - add a newline
,œ-                 - append missed letters:
,                      - append
 œ-                    - set difference
ð,ɓi@€ị³;”_¤K;⁷     - append the blanks        
ð,ɓ                   - append
   i@€ị³;”_¤            - each letter if it is included in guesses, _ otherwise
            K         - join by spaces  
             ;⁷       - add a newline

Điều này vẽ người đàn ông theo thứ tự sai; thân phải đến sau đầu, trước cánh tay trái.
Xù xì

1

C #, 305 296 byte

using System.Linq;w=>g=>{var r=string.Concat(g.Where(c=>!w.Contains(c)));var n=r.Length;return$@"  +---+
  |   |
  {(n>0?"O":" ")}   |
 {(n>2?"/":" ")+(n>1?"|":" ")+(n>3?"\\":" ")}  |
 {(n>4?"/":" ")} {(n>5?"\\":" ")}  |
      |
=========
{string.Join(" ",w.Select(c=>g.Contains(c)?c:'_'))}
"+r;}

Đã đạt được 9 byte nhờ @raznagul.

Hãy thử trực tuyến!

Phiên bản đầy đủ / định dạng:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<string, Func<string, string>> f = w=>g=>
        {
            var r = string.Concat(g.Select(c => !w.Contains(c) ? c + "" : ""));
            var n = r.Length;

            return $@"  +---+
  |   |
  {(n > 0 ? "O" : " ")}   |
 {(n > 2 ? "/" : " ") + (n > 1 ? "|" : " ") + (n > 3 ? "\\" : " ")}  |
 {(n > 4 ? "/" : " ")} {(n > 5 ? "\\" : " ")}  |
      |
=========
{string.Join(" ", w.Select(c => g.Contains(c) ? c : '_'))}
" + r;
        };

        Console.WriteLine(f("BOAT")("ATG") + "\n");
        Console.WriteLine(f("ZEPPELIN")("") + "\n");
        Console.WriteLine(f("ZEPPELIN")("EATOLINSHR") + "\n");
        Console.WriteLine(f("RHYTHM")("ABCDE") + "\n");
        Console.WriteLine(f("BOAT")("ATOB") + "\n");

        Console.ReadLine();
    }
}

Điều này cũng hoạt động với 314 byte (có thể vẫn còn ngắn hơn):

using System.Linq;w=>g=>{var r=string.Concat(g.Select(c=>!w.Contains(c)?c+"":""));var s=$@"  +---+
  |   |
  0   |
 213  |
 4 5  |
      |
=========
{string.Join(" ",w.Select(c=>g.Contains(c)?c:'_'))}
"+r;for(int i=0;i<6;++i)s=s.Replace(i+"",i<r.Length?i<1?"O":i<2?"|":i<3?"/":i<4?"\\":i<5?"/":"\\":" ");return s;}

Bạn có thể thay thế g.Select(c=>!w.Contains(c)?c+"":"")bằng g.Where(c=>!w.Contains(c)).
raznagul

@raznagul Cảm ơn!
TheLethalCoder

1

JavaScript (ES6), 203 196 187 186 185 184 180 177 176 byte

Lấy đầu vào là 2 mảng các ký tự riêng lẻ theo cú pháp currying.

a=>g=>`  +---+
  |   |
  1   |
 324  |
 5 6  |
      |
=========
${a.map(x=>g[s="includes"](x)?x:"_")}
`.replace(/\d|,/g,m=>" O|/\\/\\"[!!w[~-m]*~~m],w=g.filter(x=>!a[s](x)))+w

Hãy thử chơi nó

o.innerText=(f=
a=>g=>`  +---+
  |   |
  1   |
 324  |
 5 6  |
      |
=========
${a.map(x=>g[s="includes"](x)?x:"_")}
`.replace(/\d|,/g,m=>" O|/\\/\\"[!!w[~-m]*~~m],w=g.filter(x=>!a[s](x)))+w)([...i.value="ZEPPELIN"])([...j.value=""])
oninput=_=>o.innerText=f([...i.value.toUpperCase()])([...j.value.toUpperCase()])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Word: </label><input id=i type=password><label for=j>Guesses: </label><input id=j><pre id=o>


Giữa "cơ thể" mảnh nên đến thứ hai và thứ ba cánh tay trái, vì vậy những con số một phần của chuỗi của bạn nên được 1, 324, 5 6(xem trường hợp thử nghiệm cuối cùng).
Justin Mariner

Rất tiếc, làm thế nào tôi làm điều đó. Cảm ơn bạn đã chỉ ra, @JustinMariner
Shaggy

0

Scala , 392 389 byte

Điều này có thể vẫn còn rất nhiều golf.

Đây là bên trong một hàm lấy stlàm tham số, với stừ để đoán và tchuỗi chứa các chữ cái đã thử.

var f=s.map(x=>if(t contains x)x else"_") mkString " "
var o="""  +---+
  |   |
  0   |
 213  |
 4 5  |
      |
=========
"""
var c=0
var g=t.filter(x=>if(s contains x){false}else{c match{case 0=>o=o.replace("0","o")
case 1=>o=o.replace("1","|")
case y if y==2|y==5=>o=o.replace(y+"","\\")
case y if y==3|y==4=>o=o.replace(y+"","/")
case _=>()}
c+=1
true})
o.replaceAll("\\d"," ")+f+"\n"+g

EDIT:
-1 byte: t.contains(x) -> t contains x
-1 byte: s.contains(x) -> s contains x
-1 byte:.mkString(" ") -> mkString " "

Hãy thử trực tuyến!


0

PHP 7, 246 byte

for($t="  +---+
  |   |
  1   |
 324  |
 5 6  |
      |
=========
";$c=($w=$argv[1])[$i++];)$t.=strstr($g=$argv[2],$c)?"$c ":"_ ";for($t.="
";$c=$g[$k++];)strstr($w,$c)?:$t.=$c.!++$n." ";for(;$p++<6;)$t=strtr($t,$p," O|/\/\\"[$p>$n?0:$p]);echo$t;

lấy đầu vào từ các đối số dòng lệnh. Chạy với -nrhoặc thử trực tuyến .

for($t="  +---+\n  |   |\n  1   |\n 324  |\n 5 6  |\n      |\n=========\n";
    $c=($w=$argv[1])[$i++]; # 1. loop $c through word
)
    $t.=strstr($g=$argv[2],$c)  # if guessed,
        ?"$c ":"_ ";                # then append letter, else append underscore
for($t.="\n";$c=$g[$k++];)  # 2. loop through guesses
    strstr($w,$c)?:             # if not in word
        $t.=$c.!++$n." ";           # add to output, increment $n
for(;$p++<6;)               # 3. loop through possible false guesses
    $t=strtr($t,$p," O|/\/\\"[  # replace digit:
        $p>$n                   # if above no. of wrong guesses
            ?0:$p                   # then with space, else with hangman character
    ]);
echo$t;                     # 4. print
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.