Thực hiện một cỗ máy thật


148

Một cỗ máy thật (tín dụng dành cho anh chàng này để tìm ra nó) là một chương trình rất đơn giản được thiết kế để thể hiện luồng I / O và kiểm soát luồng ngôn ngữ. Đây là những gì một cỗ máy sự thật làm:

  • Nhận một số (0 hoặc 1) từ STDIN.

  • Nếu số đó là 0, in ra 0 và chấm dứt.

  • Nếu số đó là 1, in ra 1 mãi mãi.

Thử thách

Viết một cỗ máy sự thật như được mô tả ở trên bằng ngôn ngữ bạn chọn. Máy thật phải là một chương trình đầy đủ tuân theo các quy tắc sau:

  • lấy đầu vào từ STDIN hoặc một sự thay thế chấp nhận được
    • Nếu ngôn ngữ của bạn không thể lấy đầu vào từ STDIN, nó có thể lấy đầu vào từ biến được mã hóa cứng hoặc tương đương phù hợp trong chương trình
  • phải xuất ra STDOUT hoặc một sự thay thế chấp nhận được
    • Nếu ngôn ngữ của bạn không có khả năng xuất ra các ký tự 0hoặc 1, I / O byte hoặc unary được chấp nhận.
  • khi đầu vào là 1, nó phải liên tục in 1s và chỉ dừng lại nếu chương trình bị tắt hoặc hết bộ nhớ
  • đầu ra chỉ phải là một 0theo sau bởi một hoặc không có dòng mới hoặc dấu cách, hoặc vô hạn 1với mỗi dòng được 1theo sau bởi một hoặc không có dòng mới hoặc dấu cách. Không thể tạo đầu ra nào khác, ngoại trừ đầu ra không đổi của trình thông dịch ngôn ngữ của bạn không thể bị chặn (chẳng hạn như lời chào, mã màu ANSI hoặc thụt lề). Việc sử dụng dòng mới hoặc dấu cách của bạn phải nhất quán: ví dụ: nếu bạn chọn xuất ra 1dòng mới sau tất cả thì 1phải có dòng mới sau chúng.

  • nếu và chỉ khi ngôn ngữ của bạn không thể kết thúc bằng đầu vào của mã 0thì có thể chấp nhận mã để vào một vòng lặp vô hạn trong đó không có gì được xuất ra.

Vì đây là một danh mục, các ngôn ngữ được tạo sau thử thách này được phép cạnh tranh. Lưu ý rằng phải có một thông dịch viên để trình có thể được kiểm tra. Được phép (và thậm chí được khuyến khích) tự viết trình thông dịch này cho một ngôn ngữ chưa được thực hiện trước đó. Ngoài ra, tất cả các quy tắc tiêu chuẩn của phải được tuân theo. Đệ trình trong hầu hết các ngôn ngữ sẽ được ghi bằng byte trong một mã hóa có sẵn từ trước (thường là UTF-8).

Mục lục

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

## Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Chúng ta có thể giả sử rằng chương trình tạm dừng khi bộ xử lý kết thúc việc thực thi mã bằng văn bản, cho một mục nhập mã máy?
lirtosiast

3
Giả sử bất kỳ hành vi là tốt cho tất cả các đầu vào không hợp lệ?
Cruncher

3
@Cruncher Có, đầu vào duy nhất bạn mong đợi nhận được là 0 và 1.
một spaghetto

4
Danh mục được borked.
Addison Crump

2
Danh mục xuất hiện để xem xét Bfbflà ngôn ngữ khác nhau.
Vịt Mooing

Câu trả lời:


189

Lục giác , 6 byte

Điều này thật khó khăn và tôi không tin nó là tối ưu ...

<.@!$?

Sau khi đệm và mở mã, điều này thể hiện lưới hex sau:

nhập mô tả hình ảnh ở đây

Điều này sử dụng một luồng điều khiển tương tự như chương trình mèo không có lỗi gần đây của tôi , di chuyển dọc theo các đường chéo. Để đạt được điều đó, chúng ta bắt đầu bằng cách làm chệch hướng con trỏ lệnh (IP) sang bên trái, nơi đường dẫn màu tím bao quanh góc dưới bên trái.

?đọc đầu vào dưới dạng một số nguyên. !in lại. .chỉ là không-op. Bây giờ góc của lưới đóng vai trò là một nhánh:

Nếu đầu vào là 0, IP sẽ tiếp tục dọc theo đường dẫn màu đỏ, đơn giản là kết thúc chương trình với @.

Nếu đầu vào là 1, IP sẽ tiếp tục trên đường dẫn màu xanh lá cây. Một lần nữa, .chỉ là không hoạt động, nhưng $tương đương với tấm bạt lò xo của Befunge: nó bỏ qua hướng dẫn tiếp theo. Sau khi gói, hướng dẫn tiếp theo sẽ là ?, nhưng do $thực thi thực sự tiếp tục trên đường dẫn màu xanh, bắt đầu bằng !việc in một bản sao khác của 1. Vòng lặp này chỉ chứa !..$bây giờ được lặp lại vô thời hạn.

Một nghiên cứu về dòng điều khiển trong Hexagony ...

Tôi tin rằng giải pháp trên là tối ưu. Tôi đã viết một forcer brute, kiểm tra tất cả các chương trình Hexagony 6 byte, trong đó có ít nhất một chương trình ?!@(cần thiết; tôi cũng đã kiểm tra :%thay thế @để chấm dứt với lỗi chia 0, nhưng điều đó cũng không giúp được gì). Kiểm tra in tất cả các chương trình mà a) tạo ra 0đầu vào 0và kết thúc và b) tạo ra ít nhất hai 1giây (và không có gì khác) và không chấm dứt trong 60 tick đầu tiên của chương trình (200 tick cho các giải pháp 5 byte) . Tôi nghi ngờ rằng bất kỳ giải pháp hợp lệ nào cũng sẽ mất hơn 200 tick để in chính xác lần đầu tiên 0hoặc lần thứ hai 1trên một lưới nhỏ như vậy, vì vậy tôi không nghĩ rằng mình đã bỏ lỡ bất kỳ giải pháp tiềm năng nào.

Tìm kiếm không mang lại bất kỳ kết quả nào cho 5 byte, nhưng 57 kết quả cho 6 byte (sử dụng @; không cần phải chấm dứt lỗi nếu chúng ta có thể giải quyết vấn đề này một cách sạch sẽ trong cùng một lượng byte). Trong số 57 chỉ có 6 là dương tính giả, thực tế chỉ in hai 1s và sau đó đi vào một vòng lặp vô hạn mà không in thêm nữa. Một giải pháp được liệt kê hai lần vì nó chứa hai !lệnh. Điều đó để lại chính xác 50 giải pháp hợp lệ.

Có một số lượng thoái hóa nhất định giữa các giải pháp trong đó một hoặc hai ký tự không đáng kể, ví dụ vì dù sao chúng thực sự không có tác dụng. Các giải pháp có thể được nhóm thành 23 bộ chương trình thực sự khác biệt (trong một số trường hợp, chỉ có một sự khác biệt về ký tự giữa hai bộ, nhưng nó thay đổi đáng kể luồng điều khiển, vì vậy tôi đã đếm riêng chúng). Hai trong số các nhóm thậm chí sử dụng nhiều con trỏ chỉ dẫn theo một cách rất bất ngờ. Vì tôi sẽ không bao giờ nghĩ ra hầu hết các cách này để sử dụng cành cây và gương, họ thực hiện một nghiên cứu rất thú vị về loại luồng điều khiển nào có thể có trong Hexagony, và tôi chắc chắn đã học được một số thủ thuật mới cho các sân golf trong tương lai.

Các tổng thể kiểm soát dòng chảy gần như luôn luôn giống nhau: đọc một số, in nó. Nếu nó 0tìm được đường đến @, nếu không cứ lặp đi lặp lại !trong khi vẫn duy trì giá trị cạnh 1. Có bốn trường hợp ngoại lệ đáng chú ý:

  • Một giải pháp (một với hai !) in hai 1s mỗi lần lặp qua lưới, do đó in nhanh gấp khoảng hai lần so với phần lớn các chương trình. Tôi đã đánh dấu một này với x2bên dưới.
  • Một vài giải pháp (những giải pháp có chứa o) thay thế 1bằng 111(mã ký tự của o), do đó chúng in ba 1 s mỗi lần lặp, khiến chúng in nhanh gấp khoảng ba lần so với phần lớn các chương trình. Tôi đã đánh dấu những điều này với x3bên dưới.
  • Hai giải pháp nối thêm một 1giá trị cạnh trong mỗi lần lặp (vì vậy 1-> 11-> 111-> ...). Những bản in rất nhanh, nhưng cuối cùng chúng sẽ hết bộ nhớ. Tôi đã đánh dấu những điều này với OoMbên dưới.
  • Hai giải pháp đi vào một vòng lặp rất chặt chẽ, chỉ đơn giản là nảy qua lại !, in trên mỗi dấu kiểm khác (thay vì cứ sau 5 giây hoặc lâu hơn), khiến chúng nhanh hơn một chút (và gọn gàng hơn). Tôi đã đánh dấu những điều này với ><bên dưới.

Đây là toàn bộ sở thú:

#1                #5                #12                #19
?!/$.@            ?$!>$@            .?!/$@             |!|?$@  # ><
?!/$1@  # OoM     ?$!|$@            =?!/$@
?!/$=@                                                 #20
?!/$\@            #6                #13                $@.?<!
?!/$o@  # x3      ?/!<|@            .?/!$@             $@1?<!  # OoM
?!/$!@  # x2                        =?/!$@             $@=?<!
                  #7                                   $@o?<!  # x3
#2                ?\!<|@            #14
?!>$)@                              \!?__@             #21
?!>$1@            #8                                   _>_!?@
?!>$o@  # x3      ?<!>$@  # ><      #15
?!|$)@                              \_?!$@             #22
?!|$1@            #9                                   <!@.$?
?!|$o@  # x3      ?\$!@$            #16                <!@/$?
                                    \_?!_@             <!@=$?
#3                #10                                  <$@!$?
?!|)$@            ?~#!@)            #17                <.@!$?
?!|1$@            ?~#!@1            $$?\@!             </@!$?
?!|o$@  # x3                                           <=@!$?
                  #11               #18
#4                ?$)\@!            \$?\@!             #23
?_!<@>            ?$1\@!                               <<@]!?
                  ?$o\@!  # x3

Sau đây là một hướng dẫn ngắn cho một số ít các nhóm đại diện. Đặc biệt là nhóm 10 và 23 rất đáng để kiểm tra. Có nhiều con đường thú vị và đôi khi phức tạp khác trong các nhóm khác, nhưng tôi nghĩ rằng tôi đã chán bạn đủ vào cuối của điều này. Đối với bất kỳ ai thực sự muốn học Hexagony, đây chắc chắn là những điều đáng để nghiên cứu, vì chúng thể hiện những công dụng thậm chí có thể hơn của gương và $.

Nhóm 1

Điều này không phức tạp hơn nhiều so với giải pháp ban đầu của tôi, nhưng các con đường đi theo các hướng khác nhau. Nó cũng cho phép số lượng biến thể lớn nhất trong một ô, vì hầu hết không có quyền có thể được thay thế bằng 5 lệnh khác nhau mà vẫn làm cho điều này hợp lệ mà không thay đổi cấu trúc:

nhập mô tả hình ảnh ở đây

Nhóm 2

Cái này khá thú vị, vì nó chỉ di chuyển theo chiều ngang. Sau khi gói đến >, IP đảo ngược ngay lập tức, lấy nhánh ở góc. Nó không hoàn toàn rõ ràng không có sơ đồ, nhưng trong trường hợp 1chúng ta đi qua hàng đầu tiên một lần nữa, nhưng ngược lại lần này. Điều này cũng có nghĩa là chúng tôi gặp ?lại, hiện trả về 0(EOF). Điều này được cố định với )(tăng) để tiếp tục in 1s. Điều này cũng có 5 biến thể, )cũng có thể 1hoặc o, và >cũng có thể là |:

nhập mô tả hình ảnh ở đây

Nhóm 3

Cái này trông gần giống với cái trước nhưng nó lộn xộn như địa ngục. Lên đến đánh |và sau đó đi qua hàng dưới cùng hoặc trên cùng là như nhau. Nhưng trong trường hợp của một vòng lặp, $nay bỏ qua so với ) vào gương. Vì vậy, chúng tôi đi theo con đường màu ngọc lam ở bên phải, bây giờ nhấn vào gia số, bỏ qua @trước khi chúng tôi đi vòng quanh | một lần nữasau đó quay trở lại con đường màu xanh lá cây ở trên cùng.

nhập mô tả hình ảnh ở đây

Nhóm 4

Tôi nghĩ rằng điều này là đặc biệt tiện lợi:

nhập mô tả hình ảnh ở đây

Chiếc _gương ở góc trên cùng bên phải ban đầu là không có, vì vậy chúng tôi in !và nhấn <. Con 0đường bây giờ chạm vào gương ngang và chấm dứt. Đường 1dẫn có một quỹ đạo thực sự thú vị: mặc dù nó đi xuống, quấn vào !, được chuyển hướng về phía ngang và sau đó lại quay trở ! lại . Sau đó, nó tiếp tục di chuyển trong hình dạng hình thoi này, in hai lần mỗi lần lặp (mỗi lần đánh dấu thứ ba).

Nhóm 8

Đây là một trong hai giải pháp với vòng lặp in thực sự chặt chẽ:

nhập mô tả hình ảnh ở đây

Các <hoạt động như chi nhánh. Sau khi gói hai lần, 0đánh @. 1mặt khác, đầu tiên bỏ qua ?, sau đó >gửi nó lên $một lần nữa, vì vậy đó là bỏ qua @. Sau đó, IP kết thúc vào con đường màu ngọc lam, nơi nó nảy qua lại giữa ><(bao quanh các cạnh ở giữa).

Nhóm 10

Một trong hai nhóm sử dụng các con trỏ chỉ dẫn khác, và nó rất đẹp. Hexagony có 6 - mỗi cái bắt đầu từ một góc khác dọc theo cạnh kim đồng hồ, nhưng chỉ một trong số chúng hoạt động tại một thời điểm.

nhập mô tả hình ảnh ở đây

Như thường lệ, chúng tôi đọc với ?. Bây giờ ~là phủ định đơn phương: nó biến 1thành a -1. Tiếp theo, chúng tôi nhấn #. Đây là một cách để chuyển đổi giữa các IP: nó lấy giá trị cạnh hiện tại là modulo 6 và chuyển sang IP tương ứng (IP được đánh số 0theo chiều kim đồng hồ). Vì vậy, nếu đầu vào là 0, thì IP chỉ đơn giản là giữ nguyên và đi thẳng vào !@. Nhưng nếu đầu vào là 1, thì giá trị hiện tại -15 (mod 6). Vì vậy, chúng tôi chuyển sang IP bắt đầu trên cùng một ô (đường dẫn màu xanh lá cây). Bây giờ #là một no-op và ?đặt cạnh bộ nhớ thành 0. )gia số để !in a 1. Bây giờ chúng tôi nhấn ~một lần nữa để đảm bảo rằng#vẫn là một no-op (trái ngược với việc chuyển chúng tôi sang IP 1 sẽ chấm dứt chương trình). Thật đáng ngạc nhiên khi mọi thứ khớp với nhau trong chương trình nhỏ này.

Nhóm 22

Chỉ cần lưu ý, đây là nhóm giải pháp ban đầu của tôi. Đây cũng là nhóm lớn nhất, bởi vì no-op có thể ở hai nơi khác nhau và có một số lựa chọn cho lệnh thực tế (không hiệu quả).

Nhóm 23

Đây là nhóm khác sử dụng nhiều IP. Trong thực tế, cái này sử dụng 3 IP khác nhau. Góc trên bên phải là một mớ hỗn độn, nhưng tôi sẽ cố gắng đưa bạn qua đây:

nhập mô tả hình ảnh ở đây

Vì vậy, sự khởi đầu bạn đã thấy trước đây: <làm chệch hướng Đông Bắc, ?đọc đầu vào. Bây giờ ]là một cách khác để thay đổi giữa các IP: nó trao quyền điều khiển cho IP tiếp theo theo thứ tự theo chiều kim đồng hồ. Vì vậy, chúng tôi chuyển điều khiển sang con đường màu ngọc lam (mà tôi biết là khó nhìn thấy) bắt đầu ở góc Đông Bắc đi về hướng Đông Nam. Nó ngay lập tức được phản ánh bởi <vì vậy nó kết thúc ở góc Đông Nam, đi theo hướng Tây Bắc. Nó cũng đạt được ]vì vậy chúng tôi chuyển sang IP tiếp theo . Đây là con đường màu xám bắt đầu ở góc Đông, đi về hướng Tây Nam. Nó in đầu vào, sau đó kết thúc ở góc Đông Bắc. <làm chệch đường đi vào chiều ngang, nơi nó được phản ánh bởi người khác < . Bây giờ là cánh tay phải<hoạt động như một nhánh: nếu đầu vào là 0, IP di chuyển theo hướng Đông Bắc và kết thúc thành @. Nếu đầu vào là 1, IP di chuyển đến !, kết thúc ở phía bên trái <, nơi nó được phản chiếu ... bây giờ ở góc, nó quay trở lại !, bị lệch về bên phải <, bị phản xạ bởi bên trái <và các đường dẫn bắt đầu kết thúc...

Khá lộn xộn, nhưng một mớ hỗn độn đẹp. :)


Các sơ đồ được tạo bằng HexagonyColorer tuyệt vời của Timwi .


55
whoa chỉ là whoa
Conor O'Brien

6
^ đồng ý. Thật tuyệt ...
El'endia Starman 4/11/2015

28
Im đi và lấy upvote của tôi!
Mego

7
@ThomasOltmann Tôi thừa nhận câu trả lời này giả định một số kiến ​​thức cơ bản về ngôn ngữ. Nếu bạn thực sự quan tâm đến việc tìm hiểu thêm về nó, tôi đã trải qua những điều cơ bản trong câu trả lời nàytrong câu trả lời này , nhưng tôi sẽ không trách bạn nếu bạn không. ;)
Martin Ender

5
Vâng ... mô hình bộ nhớ có vẻ hơi đau (nhưng vẫn tốt hơn băng 1D, tôi đoán vậy)
John Dvorak

144

Mã máy Motorola MC14500B , 2 byte

Trong hex:

58EC

Giải trình:

5  OR the register with input from the data bus
8  Write the register to the data bus
E  Skip next instruction if register is zero
C  Jump

Motorola MC14500B là một vi điều khiển 1 bit; nó có một thanh ghi 1 bit và bus dữ liệu 1 bit. Vì các opcodes có 4 bit mỗi bit, chỉ có mười sáu; một nửa trong số họ thực hiện một hoạt động hợp lý giữa thanh ghi và bit trên bus dữ liệu.

Lệnh nhảy đặt cờ nhảy; khi không có địa chỉ nào được cung cấp, thông thường đặt bộ đếm chương trình thành 0. Nếu bit đầu vào bằng 0, bộ xử lý sẽ không nhảy. Nếu bit đầu vào là 1, bộ xử lý sẽ quay trở lại bắt đầu; vì chúng ta đang ORsử dụng đầu vào, nên sau đó, tín hiệu đầu vào là gì, thì thanh ghi sẽ là 1 mãi mãi.

Như thường lệ, thanh ghi được khởi tạo thành 0.

Một danh sách các opcodes có thể được tìm thấy trên bảng dữ liệu, hoặc ở đây .


7
2 byte chắc chắn là mức tối thiểu cho thử thách này.
Conor O'Brien

23
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi đã tìm kiếm vài giờ qua esolang và danh sách các bộ xử lý 4 bit để xem liệu có 1 hay 1,5 và không tìm thấy cái nào.
lirtosiast

Chắc chắn là công cụ phù hợp cho công việc.
Hugo Zink

Liên kết bị bẻ cong atm ...
TheDoctor

@TheDoctor Cả hai liên kết hoạt động tốt với tôi
Mego

85

Arnold C, 296 byte

IT'S SHOWTIME
    HEY CHRISTMAS TREE i    
    YOU SET US UP @NO PROBLEMO
    BECAUSE I'M GOING TO SAY PLEASE i
        STICK AROUND i
            TALK TO THE HAND i
        CHILL
    BULLSHIT
        TALK TO THE HAND i
    YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Không thực sự cạnh tranh, nhưng cho niềm vui của nó. Không hỗ trợ stdin, thay thế @NO PROBLEMOvới @I LIEDmột giá trị bằng không. @No Problemolà 1.

Chạy với (giả sử tập tin là Truthmachine.arnoldc):

wget http://lhartikk.github.io/ArnoldC.jar
java -jar ArnoldC.jar truthmachine.arnoldc
java truthmachine

46
Đẹp. Tôi đã khóc 10/10
một spaghetto

10
BECAUSE I'M GOING TO SAY PLEASELOL
Eric Martinez

8
Có vẻ như điều này if(i){while(i) print(i);} else {print(i);}Chắc chắn nó sẽ ngắn hơn để làm gì print(i);while(i) print(i);?
lirtosiast 04/11/2015

16
Mặc dù BULLSHITcó đóng góp lớn cho giá trị giải trí của chương trình, nhưng về mặt kỹ thuật thì không cần thiết. Bạn có thể yếu tố toàn bộ BULLSHITchi nhánh ra bằng cách di chuyển TALK TO THE HAND isau YOU HAVE NO RESPECT FOR LOGIC.
gaborsch

4
@GaborSch Chỉ có một câu trả lời thích hợp cho điều đó : BULLSHIT;)
caird coinheringaahing

65

Minecraft, 18 byte (Phiên bản MC 15w45a)

phác họa minecraft

Như bạn có thể thấy, có một đòn bẩy hướng vào khối lệnh lặp lại, có lệnh say 1trong đó. Có một đèn pin đảo ngược tín hiệu trên đó, điều khiển năng lượng vào khối lệnh chạy đơn với lệnh say 0trong đó.

Bất cứ khi nào công tắc được hướng tới sự thật, khối lặp lại sử dụng mã say 1để xuất 1s vô hạn . Khi đòn bẩy được chuyển hướng thành false, nó sẽ xuất một đơn 0.

Lưu ý rằng điều này xuất ra một [@]mặc định. Nếu bạn thực sự muốn chỉ cần tăng 1 và 0, thì điều này trở thành 34 byte, trong đó mã trong các khối lệnh là tellraw @a [1]tellraw @a [0]. Điều này đang sử dụng số byte được đề xuất của @ Cᴏɴᴏʀ O'Bʀɪᴇɴ cho MC như có thể tìm thấy trong Meta .


28
Bạn đã sử dụng một trò chơi video cho mã golf. +1
RK.

11
@RK. Đây thực sự là thực hành khá chuẩn cho những thách thức đơn giản. Có ít nhất hai người dùng khác sử dụng MC làm ngôn ngữ chơi gôn mã - hãy thử thanh tìm kiếm is:answer Minecraft. c:
Addison Crump

1
@FlagAsSpam lol được thực hiện độc đáo. Ngoài ra, cảm ơn vì lời khuyên đó để tìm kiếm câu trả lời MC.
Ashwin Gupta


38

Hồng ngọc, 20

print while/1/||gets

Chạy từ dòng lệnh để tránh cảnh báo, như

ruby -e "print while/1/||gets" <<< 0
ruby -e "print while/1/||gets" <<< 1

Giải trình:

Ít chơi gôn hơn, đây là

while /1/ || gets
  print
end

Khi một Regapi được sử dụng trong một điều kiện, nó sẽ đánh giá là falsey trừ khi biến $_được điền và khớp với mẫu. Lần đầu tiên qua vòng lặp, $_trống nên chúng ta rơi vào gets, nó đặt giá trị của $_một dòng được đọc từ STDIN. printkhông có đối số in $_. Bây giờ chúng tôi đánh giá điều kiện một lần nữa. Nếu chúng ta đọc trong 1, chúng ta sẽ đoản mạch và chỉ in 1 lần nữa, và cứ thế mãi. Mặt khác, chúng ta rơi vào gets, nhưng vì không có dòng đầu vào thứ hai, getstrả về con số không, nên vòng lặp kết thúc.


18
Thật tuyệt khi các tác vụ tầm thường vẫn cho phép các giải pháp thông minh ngay cả trong các ngôn ngữ "bình thường". :)
Martin Ender

Phần ||getsnày là tuyệt vời và tất cả, nhưng bạn không thể làm gets;print while/1/và lưu một byte?
daniero

Không, sau đó nó không in 0.
lịch sử

37

Kính hiển vi, 3 byte

i{p

Cái ngắn nhất mà tôi biết.

Giải trình:

i  Takes numeric input and puts it in register 1
{  while register 1 is truthy
  p  Print the contents of register 1

Microscript đã in ngầm định đăng ký 1 khi chấm dứt, đó là lý do tại sao đầu vào của 0được in một lần.


@quartata Tôi phù hợp với bạn: D
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: O
một spaghetto

2
Tôi thực sự tự hỏi liệu bạn đã viết câu hỏi trước hay câu trả lời ...
John Dvorak

1
Câu hỏi. Tôi chỉ muốn đăng bài này vì nó là bài ngắn nhất tôi nghĩ ra khi viết câu hỏi. Đây là một danh mục để không có bất kỳ người chiến thắng thực sự.
một spaghetto


25

JavaScript, 28 byte

Đối với các vòng lặp thường ngắn hơn vòng lặp trong khi.

alert(x)trả về undefined, đó là giả, do đó, bitwise hoặc toán tử |, đưa nó vào 0. Vì vậy, nếu x"0", cảnh báo một lần, nếu không tiếp tục lặp. Sử dụng alertcho STDOUT như câu trả lời này .

for(x=prompt();alert(x)|x;);

Bắn, bạn đánh tôi với nó. Tôi đã định đăng chính xác điều này! :) GG
Domino

Wow, đó là một chút thông minh tốt hơn của tôi :) Có +1!
Sản xuất ETH

Bạn không cần dấu chấm phẩy.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Bạn đã sử dụng trình duyệt nào? Tôi đã thử nghiệm nó trên Firefox và Chrome và tôi nhận được SyntaxErrormà không có nó.
intrepidcoder

@intrepidcoder ơi, xin lỗi, xấu quá. Tâm trí của tôi đã ở chế độ "dấu chấm phẩy là vô dụng". ^^ "
Conor O'Brien

24

Python 2, 29 byte

a=input()
while 1:print a;1/a

Điều này chấm dứt với một lỗi phân chia trên 0, được cho phép theo mặc định .


Đầu ra STDERR là tốt. Câu trả lời> <> cũng sử dụng nó.
một spaghetto

Điều này thật tuyệt vời ^ _ ^
ABcDexter

Trong khi một tác phẩm in? Xin lỗi, tôi không biết trăn.
Rohan Jhunjhunwala

1
@RohanJhunjhunwala Trong 0, nó sẽ không in bất cứ thứ gì, nhưng nó nên in một lần.
xnor

1
@xnor ôi, xấu quá.
Rohan Jhunjhunwala

20

Brainfuck, 41 36 31 30 byte

Rút ngắn bằng cách in một lần ngay sau khi nhập và với sự giúp đỡ từ Ethan và người dùng46915.

,.+++[->>+<-----<]>>---<-[>.<]

Phiên bản trước: Trừ 48 từ đầu vào và nếu không bằng 0, hãy thêm 1 vào 48 để in ASCII 1mãi mãi, nếu không thì in 0.

-[>+<-----]>--->,<[->->+<<]>[>+<]>.<[>.<]

Tôi đã chạy nó ở đây , nhưng do đầu ra được đệm, bạn không thể thấy bất kỳ đầu ra nào vì chương trình không bao giờ kết thúc 1.

Chỉnh sửa: Tôi đã quên in 0trên đầu vào 0. Đã sửa bây giờ. Tôi thích những >.<khuôn mặt ở cuối.


1
@ThomasKwa Tôi đoán là không, nhưng tôi không chắc vì tôi không thấy thuật toán dành riêng cho modulo 2. Thuật toán divmod hơi dài.
mbomb007

2
Bạn có thể rút ngắn nó thêm một chút bằng cách hợp nhất các đoạn mã với nhau tốt hơn một chút và trực tiếp sử dụng thanh ghi đầu vào của bạn thay vì có một thanh ghi "48" riêng biệt:,.[>+>+<<-]-[>-<-----]>+++[>.<]
Ethan

Đã thử một giải pháp với mod 2. Chắc chắn có vẻ như trừ 48 là cách đúng đắn. ,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
tông_box

1
@Ray Đó là mặc định và thường được giả định. Nếu tôi đã sử dụng một triển khai khác, tôi sẽ nói như vậy.
mbomb007

1
Bạn có thể nhận thêm một byte bằng cách kết hợp phép trừ và sao chép lại với nhau:,.+++[->>+<-----<]>>---<-[>.<]
user46915

19

Piet, 27 18 16 codel

(Codel là một tên ưa thích cho pixel được sử dụng để tránh nhầm lẫn khi hình ảnh bị kéo dài để xem. Tôi đã đếm mã thay vì byte vì tập lệnh piet được lưu dưới dạng hình ảnh, vì vậy kích thước vật lý có thể thay đổi. Tôi nghĩ rằng định dạng tệp lý tưởng sẽ lưu piet này hiệu quả nhất có thể sẽ mất 11 byte. Trong thực tế, tệp gif nhỏ của tôi là 62 byte, với dữ liệu bảng màu tối ưu. Hãy cho tôi biết nếu tôi nên sử dụng số này làm kích thước mục nhập của mình thay vì số lượng codel.)

Ảnh gốc: phiên bản nhỏ

Phóng to: phiên bản mở rộng

Trong piet, sự khác biệt giữa hai màu là yếu tố quyết định lệnh nào sẽ chạy, do đó, việc nhìn thấy cùng một màu hai lần không có nghĩa là nó thực hiện cùng một hành động. Việc thực hiện bắt đầu trong codel trên cùng bên trái. Sau đó, nó di chuyển theo chiều ngang, thực hiện như sau:

  1. Đọc một số và đặt nó trên ngăn xếp
  2. Nhân đôi đỉnh của ngăn xếp
  3. Pop và xuất đỉnh của ngăn xếp
  4. Bật đỉnh ngăn xếp và xoay theo chiều kim đồng hồ với số lần đó.

Nếu đầu vào là 1, thì con trỏ sẽ di chuyển xuống bảng mã vôi, đẩy 1 trên ngăn xếp. Sau đó, việc thực hiện tiếp tục đi bên trái. Khi con trỏ chuyển từ màu sang trắng và từ trắng sang màu, không có gì xảy ra. Vì màu đen cũng được coi là các bức tường, con trỏ cuối cùng sẽ quay trở lại bảng mã vôi trên dòng trên cùng và lặp lại toàn bộ từ bước 2.

Tuy nhiên, nếu đầu vào là 0, con trỏ sẽ không bao giờ đi xuống và sẽ kết thúc bằng chữ J màu xanh bên phải (ý định chơi chữ, nó đáng giá), nó sẽ bị giữ lại (vì trên cùng, bên phải, bên trái và bên trái các cạnh dưới cùng của khối hình chữ J này nằm cạnh các bảng mã màu đen hoặc cạnh của hình ảnh). Vì con trỏ bị kẹt, kết thúc thực hiện.

Giá trị không mong đợi:
Nếu người dùng viết một số khác, nó vẫn sẽ được in, thì con trỏ sẽ xoay nhiều lần hoặc ít hơn dựa trên giá trị.

  • Bội số của 4 hoặc 0: thực hiện tiếp tục theo chiều ngang và kết thúc.
  • Bội số của 3: Vì không thể đi lên, con trỏ ngay lập tức quay theo chiều kim đồng hồ và tiếp tục theo chiều ngang, sau đó kết thúc.
  • Bội số của 2 và không phải là bội số của 4: con trỏ quay và bắt đầu di chuyển sang trái. May mắn thay, tất cả những điều này là thực hiện một loạt các hoạt động không ảnh hưởng đến luồng chương trình và cuối cùng làm trống ngăn xếp. Khi một thao tác không thể được thực hiện vì ngăn xếp trống, nó chỉ đơn giản là bị bỏ qua. Khi nó chạm vào góc trên cùng bên trái, con trỏ không còn nơi nào để đi ngoài bên phải một lần nữa, khởi động lại chương trình một cách hiệu quả.
  • Các giá trị khác: Con trỏ đi xuống như thể với 1, làm cho nó in 1 mãi mãi. Nếu đầu vào là 5, đầu ra sẽ là5111111111111...

Bất kỳ giá trị không nguyên nào sẽ chấm dứt chương trình. Việc thực thi sẽ tiếp tục bình thường, nhưng tất cả các hoạt động sẽ bị bỏ qua vì không có gì trong ngăn xếp. Vì vậy, theo một cách nào đó, chương trình không bao giờ gặp sự cố - nó dừng bình thường hoặc lặp lại mãi mãi.


Phiên bản thân thiện của PietDev

PietDev (một IDE IDE trực tuyến rất cơ bản) dường như gặp rắc rối với codel trắng, vì vậy tôi đã tạo ra một phiên bản mới tự quay ngược lên thay vì dựa vào xoay tự động codel trắng thích hợp. Và tôi thậm chí không cần sử dụng màu mới! Nếu bạn muốn thử nghiệm với nó, hãy đảm bảo bạn vẽ một đường viền màu đen xung quanh mã bởi vì PietDev không hỗ trợ kích thước chương trình tùy chỉnh.

phiên bản nhỏ

phiên bản mở rộng


Các phiên bản cũ hơn

Phiên bản đầu tiên không đẩy 1 trở lại vào ngăn xếp và thay vào đó lặp lại theo hướng dẫn sao chép trước đó. Nó cũng có codel vô dụng trang trí.

Mô hình nhỏ mà thực sự là một mã piet

Phiên bản mở rộng

Sau đó, tôi đã có ý tưởng đẩy 1 trên ngăn xếp để xóa dòng trống. Thật buồn cười khi tôi nghĩ về nó nhờ vào bảng mã trang trí của tôi.

phiên bản nhỏ

phiên bản lớn

Sau đó, tôi nhận ra rằng tôi đã có một bản sao không cần thiết nữa và tôi đã giảm số lượng màu để tiết kiệm dữ liệu bảng màu trong ảnh. Tôi cũng đã thoát khỏi codel trang trí duy nhất bởi vì tôi không biết.


7
Tôi chưa từng thấy một câu trả lời Piet ghi được trong bất cứ điều gì khác hơn là codels, nhưng tôi nghĩ rằng số byte tối ưu cũng là thú vị bao gồm :)
undergroundmonorail

1
Có 20 giá trị codel khác nhau, có nghĩa là bạn sẽ có thể gói ba codel thành 13 bit, sau đó tám triplets thành 13 byte cho mật độ lưu trữ 2,6 codel mỗi byte. Nhưng ai đó phải xác định ngôn ngữ đó trước. Tôi đề nghị tên DPPi = piet dày đặc.
John Dvorak

1
@JanDvorak Tôi đã đếm 21 giá trị để thêm một giá trị đặc biệt cho ngắt dòng và khi bạn đã ngắt dòng đầu tiên, trình phân tích cú pháp có thể đoán vị trí của các giá trị khác. Nhưng tôi đã không đi xa đến mức kết hợp các codel thành các bộ ba, điều này có ý nghĩa hơn nhiều so với việc lãng phí 5 bit cho mỗi codel. Tài giỏi.
Domino

1
Chỉ cần thêm kích thước là vài byte đầu tiên. Bạn không cần thêm một biểu tượng.
John Dvorak

1
@everyone, người muốn dùng thử: Đừng thử giải pháp này với PietDev vì PietDev chỉ in một số duy nhất và chấm dứt. Nhưng giải pháp hoạt động đúng với npiet.
ML

19

Bình thường 4 3 2

Wp

một không! dấu cách (cảm ơn isaac :)). Không gian được sử dụng để yêu cầu biên dịch vòng lặp while, nhưng Pyth đã được cập nhật. Thông thường sẽ không đủ điều kiện sử dụng nó, nhưng vì đây là một danh mục nên nó hợp lệ.

Giải trình:

Wp        : implicit Q = eval(input)
W         : while
 p        : print and return the value of Q, to be evaluated as the while condition
          : Functions without enough arguments automatically use Q now
          : do nothing in the body of the while loop

5
Tôi đã được truyền cảm hứng bởi câu trả lời này để thêm ẩn passcho Pyth. Không gian bây giờ là không cần thiết. pyth.herokuapp.com/?code=WpQ&input=0&debug=0
isaacg

52
Vượt qua bốn vẫn trông giống như một bốn.
Conor O'Brien

1
Ơ, tôi đang trở nên chán nản với việc chiếm giữ mọi thứ mọi lúc mọi nơi :(. LOL.
Ashwin Gupta

1
@AshwinGupta ngôn ngữ của tôi về mặt kỹ thuật đánh bại nó, vì vậy nó không hoàn toàn thống trị :)
Cyoce

@Cyoce vâng! Làm tốt lắm! Tôi yên tâm rằng một cái gì đó có thể đánh bại lol.
Ashwin Gupta

16

Chip , 6 byte

e*faAs

Chip là ngôn ngữ 2D hoạt động hơi giống một mạch tích hợp. Nó nhận đầu vào, một byte mỗi lần và chia các bit thành các phần tử đầu vào riêng lẻ. Đầu ra khâu các giá trị của các phần tử đầu ra lại với nhau thành byte.

Hãy phá vỡ điều này:

*là một tín hiệu nguồn, nó sẽ gửi một giá trị thực cho tất cả các phần tử lân cận. eftương ứng với bit thứ năm và thứ sáu của đầu ra. Vì vậy, e*ftạo ra nhị phân 00110000, đó là ASCII char "0".

Bây giờ, Alà bit đầu tiên đầu tiên và alà bit đầu ra đầu tiên, vì vậy aAsao chép bit đó từ đầu vào sang đầu ra. Vì vậy, khi kết hợp với e*f, đầu vào của ASCII "0" tạo ra "0" và "1" tạo ra "1". (Không có tương tác giữa fa, vì không tạo ra bất kỳ tín hiệu nào.)

Các sngày cuối cùng, khi được kích hoạt bởi một tín hiệu đúng, sẽ ngăn chặn đầu vào từ tiến tới byte tiếp theo, có nghĩa là toàn bộ điều sẽ chạy một lần nữa với các đầu vào tương tự.

Vì byte đầu tiên của "0" bằng 0, nên nó sẽ không kích hoạt phần tử này và chương trình sẽ in "0", và do đó làm cạn kiệt đầu vào của nó, cho phép nó kết thúc. "1", tuy nhiên, kích hoạt phần tử này, có nghĩa là "1" là đầu ra, nhưng không được tiêu thụ trên đầu vào, cho phép chu kỳ lặp lại vô thời hạn.

Nếu các giá trị 0x0 và 0x1 được sử dụng cho đầu ra, thay vì ASCII, chúng ta có thể loại bỏ e*fphần này, dẫn đến chỉ có 3 byte :

aAs

Nếu số 0 phải tự chấm dứt, thay vì mong đợi stdin đóng, chúng ta sẽ nhận được thông tin sau, đảo ngược byte đầu tiên ~và chuyển kết quả sang t, kết thúc chương trình ( 10 byte ):

aA~te*f
 s

( tcũng không tạo ra tín hiệu, do đó không có tương tác giữa te.)


2
Câu trả lời tốt đẹp! Vì đây là một thách thức danh mục, nên không cần phải đánh dấu đây là không cạnh tranh, vì vậy tôi đã xóa phần đó cho bạn. Chào mừng đến với PPCG!
Mego

4
Tôi đã tự do thêm Chip vào TIO. Hãy thử trực tuyến!
Dennis

@Dennis, câu hỏi cho bạn: làm cách nào để TIO cập nhật nguồn của nó? Tuần trước tôi đã sửa một lỗi trong trình thông dịch Chip, nhưng nó đã không truyền sự thay đổi vào TIO. Đây có phải là một cái gì đó tôi cần phải yêu cầu ai đó làm cho tôi?
Phlarx

Tôi đã kéo Chip. Nếu bạn cần một cái gì đó được cập nhật, chỉ cần để lại một tin nhắn trong talk.tryitonline.net .
Dennis

14

Brainbool , 5 byte

,.[.]

Brainbool là Brainfuck, nhưng nó chỉ hoạt động trên các bit, và I / O thông qua 0và các 1ký tự.


3
Tôi biết rằng phải có một dẫn xuất BF, nơi điều này có thể được thực hiện một cách khả thi.
một spaghetto

14
Tôi cảm thấy như "Boolfuck" có thể là một cái tên tốt hơn cho nó, nhưng được thực hiện tốt bất kể.
James Murphy

2
@JamesMurphy dường như đã tồn tại: esolangs.org/wiki/Boolfuck
DLeh

13

LOLCODE, 119 byte

GIMMEH n
n R SUM OF n AN 0
BOTH SAEM n AN 0, O RLY?
YA RLY
 VISIBLE 0
NO WAI
 IM IN UR l
  VISIBLE 1
 IM OUTTA UR l
OIC

Ung dung:

HAI

BTW, Read n as a string from STDIN and convert to an integer
GIMMEH n
n R SUM OF n AN 0

BTW, Test n for equality with 0
BOTH SAEM n AN 0, O RLY?
YA RLY
    BTW, Write 0 to STDOUT and exit
    VISIBLE 0
NO WAI
    BTW, Loop forever, printing 1
    IM IN YR l
        VISIBLE 1
    IM OUTTA YR l
OIC

KTHXBYE

1. Bạn đang sử dụng trình thông dịch nào? 2. Bạn có thể MAEK n A NUMBRđúc? 3. Bạn có thể sử dụng DIFFRINTthay vì BOTH SAEMvà chuyển đổi các điều kiện?
lirtosiast

@ThomasKwa Tôi đã sử dụng LOLCOFFEE, một ứng dụng trên repl.it. (Hiện tại có vẻ không hoạt động, vì vậy tôi sẽ kiểm tra các đề xuất của bạn sau khi nó được sao lưu.)
Alex A.

Không O RLY?đúc để boolean?
Rò rỉ Nun

@LeakyNun Không ...? O RLY?giống như một hậu tố if.
Alex A.

12

C, 37 byte

Một cách khác nhau về cách làm điều đó trong C.

main(c){for(gets(&c);putchar(c)&1;);}

cmặc định cho một intgiá trị 1. gets(&c)nhận được một chuỗi từ stdin, ở đây cghi đè giá trị của , một cách đột ngột vì ckhông phải là a char*. putchar(c)in giá trị của cđể stdout, và lợi nhuận c. Vì '0'là 48 và '1'là 49 trong ASCII, chúng ta có thể sử dụng bit cuối cùng ( &1) để xác định đó là bit nào. Nếu nó '0', vòng lặp phá vỡ. Nếu không, nó đi mãi mãi.

Biên dịch (với một cảnh báo về gets) và chạy gcc-4.8trên Linux.


2
Có lẽ điều này chỉ hoạt động trên các kiến ​​trúc endian nhỏ.
Neil

@Neil tôi sẽ giả sử như vậy.
cbojar

@Neil Endianness chỉ ảnh hưởng đến thứ tự byte trong các giá trị đa bào.
LegionMammal978 7/11/2015

1
@ LegionMammal978 cmặc định là một int, đó là một giá trị đa bào, và trên một kiến ​​trúc cuối lớn, getssẽ đặt sai byte.
Neil

11

Mê cung , 7 byte

 ?+
@!:

Labyrinth là ngôn ngữ dựa trên ngăn xếp 2D, trong đó luồng điều khiển phụ thuộc vào dấu hiệu của phần tử trên cùng của ngăn xếp, được kiểm tra sau mỗi lệnh. Thực thi bắt đầu di chuyển ngay từ hướng dẫn hợp lệ đầu tiên trên hàng trên cùng, ở đây là ?.

Các hướng dẫn liên quan là:

?      Input integer
+      Add top two elements (Labyrinth's stack has infinite 0s on the bottom)
:      Duplicate top element
!      Output as number
@      Terminate program

Nếu đầu vào là 0, IP sẽ đọc đầu vào ?, thêm hai đầu của ngăn xếp ( 0 + 0 = 0), sau đó sao chép :và xuất ra !0. Ở đây chúng ta bắt gặp đường nối duy nhất trong chương trình và phải kiểm tra đỉnh của ngăn xếp để xác định đi đâu Vì đỉnh là 0, chúng tôi di chuyển về phía trước và chấm dứt với @.

Mặt khác, nếu đầu vào là 1, chúng ta thực hiện cùng một hướng dẫn như trước (nhưng xuất ra 1) trước khi đến đường giao nhau tại !. Bây giờ đỉnh của ngăn xếp là dương, khiến chúng ta rẽ phải vào ?. Trên EOF Labyrinth đẩy 0, vì vậy chúng tôi thực hiện 0 + 1 = 1tại +, trùng lặp :và đầu ra !. Một lần nữa, chúng ta có 1 ở đầu ngăn xếp và vòng lặp tiếp tục.

Để nhận tiền thưởng, đây là giải pháp 7 byte của @ MartinBüttner, hoạt động tương tự:

?+!@
1!

Lưu ý rằng, không giống như hầu hết các ngôn ngữ, 1thực sự bật nra khỏi ngăn xếp và đẩy n*10 + 1, làm cho việc xây dựng số lượng lớn trở nên dễ dàng. Tuy nhiên, vì đỉnh của ngăn xếp trống ở điểm đó, nên không khác gì chỉ đẩy 1.


10

> <> , 7 byte

i2%:n:,

Điều này sử dụng thực tế là> <> đẩy -1 trên EOF, là 1 mod 2. Nó cũng sử dụng phép chia cho 0 để chấm dứt (điều này rõ ràng là ổn vì sự đồng thuận là đầu ra STDERR bị bỏ qua).

Chỉ để tham khảo, thoát sạch mà không có lỗi là một byte bổ sung:

i2%:n?!;

10

APL, 6 byte

→⎕←⍣⍲⎕

Giải trình:

     ⎕ Read the input, then
 ⎕←    write it out
   ⍣   repeatedly
    ⍲  until NAND of it with itself becomes true.
→      Branch to zero to avoid printing the result again.

1
Là nhân vật thứ hai và cuối cùng được cho là trông khác nhau? Bởi vì họ không dành cho tôi.
John Dvorak

@JanDvorak Không, họ giống nhau.
Alex A.

1
OK, bây giờ tôi đang xem nó trên thiết bị di động và mọi thứ trừ hai mũi tên giống nhau đối với tôi :-D
John Dvorak

10

Brian & Chuck , 21 byte

,}<-{-?<SOH>_{+?
_>+{?<.p

Ở đây, <SOH>nên được thay thế bằng ký tự điều khiển tương ứng (0x01).

Giải trình

Ý tưởng cơ bản là trừ mã ký tự của đầu vào (48 hoặc 49) từ pcuối Chuck, sẽ đưa ra một ?(đó là một lệnh hợp lệ) hoặc @là một lệnh không hoạt động.

,đọc ký tự đầu vào vào ô đầu tiên của Chuck (được đánh dấu _). Chúng tôi muốn giảm giá trị này xuống 0trong một vòng lặp, trong khi thực hiện một số thay đổi khác:

}<di chuyển đến p-giảm nó. Sau đó {di chuyển trở lại các phân -rã tế bào đầu vào là tốt. Miễn là điều này chưa bằng 0, hãy ?trao quyền kiểm soát cho Chuck. Bây giờ >di chuyển đầu băng của Brian một ô sang bên phải (được khởi tạo 1) và +tăng nó. Sau đó, chúng tôi thiết lập lại vòng lặp với {?.

Vào thời điểm ô đầu tiên trên Chuck xuất hiện 0, <SOH>ô sẽ được tăng lên thành ký tự mà chúng ta đã đọc từ STDIN và psẽ ?dành cho đầu vào 1hoặc @đầu vào 0.

Bây giờ ?không chuyển đổi điều khiển nữa. Các 0hoặc 1sau nó là một không-op, như là null-byte (đại diện bởi _). {di chuyển trở lại ô đầu tiên của Chuck và +gia tăng để đảm bảo rằng nó dương, sao cho ?tay điều khiển Chuck.

Lần này >+tăng tế bào sau khi kết thúc băng ban đầu của Brian. Ô đó là rác nhưng chúng tôi sẽ không bao giờ sử dụng nó. Bây giờ {không quét toàn bộ phía trước băng của Brian, mà chỉ quét tới _. Do đó ?là không có vì ô hiện tại bằng không. Sau đó <.di chuyển một bên trái (bản sao của ký tự đầu vào) và in nó.

Cuối cùng, chúng ta gặp phải ?hoặc @. Nếu đầu vào là 0và ô này @thì đó là no-op và chương trình kết thúc. Nhưng nếu đầu vào là 1và ô này là do ?chúng tôi bàn giao cho Brian, người {+?sẽ thiết lập lại vòng lặp trên Chuck và bây giờ chúng tôi sẽ in 1mãi mãi (cho đến khi số nguyên trong ô ở cuối băng của Brian không vừa với bộ nhớ hơn nữa, tôi cho rằng ...).

Thêm

Sp3000 và tôi đã chơi golf ở đây trong vài ngày. Chúng tôi đã bắt đầu khoảng 40 byte và đến hai giải pháp hoàn toàn khác nhau, nhưng gắn với 26 byte. Chỉ khi tôi bắt đầu viết lên lời giải thích cho tôi, thì giải pháp 21 byte ở trên mới xảy ra với tôi. Rất cám ơn Sp đã đưa ra những ý tưởng xung quanh và dạy cho nhau một số thủ thuật chơi gôn trong B & C. :)

Đây là giải pháp 26 byte của anh ấy:

>,----{?{>1?0
#I<?_}<.<<<?

Và đây là của tôi:

,{>-<-?_0+?_1{<?
_®{?_{>.?

Trường hợp ®một byte có giá trị 174 (ví dụ: chỉ lưu tệp dưới dạng ISO 8859-1).

Tại mỏ lõi hoạt động tương tự như giải pháp 21 byte, trong đó ®trở thành }đầu vào 1~(không có op) cho đầu vào 0, nhưng việc thực thi kém thanh lịch hơn nhiều.

Giải pháp của anh ta khá gọn gàng ở chỗ mã nguồn chỉ có ASCII và nó không yêu cầu một vòng lặp để xử lý đầu vào. Thay vào đó, ----biến 1thành -0vào ,(một no-op cho Chuck). Điều -đó sau đó sẽ thay đổi đầu tiên ?trên băng của Brian thành một >, do đó tạo ra luồng điều khiển khác nhau cho chiếc 1vali.


10

Thẻ tuần hoàn bitwise , 3 bit hoặc <1 byte

Thẻ Bitwise Cyclic là một trong những ngôn ngữ hoàn chỉnh đơn giản nhất hiện có. Nó hoạt động với hai bitstrings, chương trìnhdữ liệu . Các bit của chương trình được đọc theo chu kỳ và được giải thích như sau:

  • 0: Xóa bit dữ liệu đầu tiên (và xuất nó, trong các triển khai có đầu ra).
  • 1x: Nếu bit dữ liệu đầu tiên là 1, nối x(đại diện hoặc 0hoặc 1) vào cuối dữ liệu. (Nếu bit dữ liệu đầu tiên là 0, không làm gì cả.)

Chương trình chạy cho đến khi chuỗi dữ liệu trống.

Máy thật

110

Khi chuỗi dữ liệu được đặt thành 0:

  • 11không nối thêm bất cứ điều gì vì bit dữ liệu đầu tiên không có 1.
  • 0xóa / đầu ra 0.
  • Chuỗi dữ liệu hiện đang trống và chương trình tạm dừng.

Khi chuỗi dữ liệu được đặt thành 1:

  • 11nối thêm a 1.
  • 0xóa / đầu ra 1.
  • Chuỗi dữ liệu trở lại một lần duy nhất 1và chương trình trở lại nơi nó bắt đầu, vì vậy chúng tôi lặp lại mãi mãi.

9

GNU sed, 10

:;/1/{p;b}

Giải trình

  • : xác định một nhãn không tên
  • /1/Nếu đầu vào khớp với regex 1, thì
  • p in không gian mẫu (tức là 1)
  • b và nhảy trở lại nhãn không tên (mãi mãi)
  • Nếu đầu vào không phải là 1 (tức là 0), thì không gian mẫu được in không thay đổi và chương trình kết thúc.

Tắt 1 ký tự bằng cách sử dụng :;p;/1/bvà cờ n , tổng cộng 9 byte. Vì sed -fdù sao cũng được sử dụng để chạy tệp tập lệnh, nên việc thêm cờ đó không yêu cầu 2 byte.
seshoumara

9

Nghiêm túc , 4 3 byte

Crossed-out 4 vẫn là 4 :(

,W■

,đọc một giá trị từ STDIN. Wbắt đầu một vòng lặp chạy trong khi giá trị trên đỉnh của ngăn xếp là trung thực, với cơ thể . in phần tử ngăn xếp trên cùng mà không xuất hiện. Vòng lặp được đóng hoàn toàn tại EOF.

Khi nhập vào 0, vòng lặp không bao giờ thực thi (vì 0là falsey) và chương trình kết thúc tại EOF, tự động bật và in mọi giá trị trên ngăn xếp. Trên đầu vào của 1(hoặc bất kỳ giá trị mà không phải là 0, ""hoặc []), vòng lặp chạy vô.

Trong thực tế , việc dẫn đầu ,là không cần thiết (nhờ vào đầu vào ngầm), đưa điểm số xuống 2 byte.


8

Thứ ba, 34 byte

1::=12
2::=~1
0::=~0
@::=:::
::=
@

Giải trình:

1::=12 Thể hiện của chuỗi con "1" có thể trở thành "12"

2::=~1 Có thể xóa các trường hợp của chuỗi con "2", in "1"

0::=~0 Có thể xóa các trường hợp của chuỗi con "0", in "0"

@::=::: Có thể thay thế các trường hợp của chuỗi con "@" bằng các chuỗi từ đầu vào

::= Danh sách kết thúc các quy tắc thay thế

@ Chuỗi ban đầu là "@"


8

Arnold C, 134 byte

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0         //or 1
STICK AROUND i
TALK TO THE HAND 1
CHILL
TALK TO THE HAND 0
YOU HAVE BEEN TERMINATED

Trong khi điều này không thú vị như câu trả lời khác của ArnoldC , thì nó lại bị đánh gôn. Ví dụ, thụt lề là không cần thiết, và các macro @NO PROBLEMO@I LIED.

Đã thử nghiệm với phiên bản ngôn ngữ này , không thể lấy đầu vào.


8

Khối , 5 6 byte

Cubix là ngôn ngữ 2 chiều mới @ETHproductions trong đó các lệnh được quấn quanh các mặt của khối lập phương. Thông dịch viên trực tuyến Cảm ơn @ETHproductions để tiết kiệm.

!I\@O

Điều này kết thúc mở rộng ra khối

  !
I \ @ O
  .

Điều này bắt đầu với Ilệnh. Nhập một số nguyên vào ngăn xếp.
\, chuyển hướng con trỏ lệnh xuống trên không op.
O, xuất giá trị số của đỉnh ngăn xếp.
!, bỏ qua lệnh tiếp theo ( @) nếu đầu ngăn xếp đúng. Điều này sẽ nhảy \chuyển hướng nếu 1
\, chuyển hướng con trỏ lệnh đến @chương trình thoát.

Điều này lợi dụng thực tế là ngăn xếp không được bật bởi các O ? !lệnh.


Đẹp. Tôi thực sự rất vui khi thấy người khác sử dụng ngôn ngữ của mình :) Tôi có một giải pháp 6 byte khác chỉ sử dụng 5 hướng dẫn (cộng với không có op), vì vậy có lẽ tôi sẽ đăng nó.
Sản phẩm ETH

@ETHproductions gửi nó cho chắc chắn. Tôi nghĩ rằng bạn đã có một ngôn ngữ đầy hứa hẹn ở đây :)
MickyT 15/03/2016

Bạn có thể lưu một byte bằng cách xóa ?và chỉ bằng cách sử dụng !:!I\@O
ETHproductions 15/03/2016

@ETHproductions rất hay
MickyT 15/03/2016

1
Tôi đã viết một brute-quân lực cho việc này (cảnh báo: đóng băng trình duyệt của bạn cho một hoặc hai phút), mà đi kèm với chính xác năm giải pháp 5-byte: @IOw!, @I?Ov, @!IOw, !IOW@,!I\@O
ETHproductions

7

Foo , 6 byte

&1($i)

Đầu vào được mã hóa cứng như ký tự thứ hai, vì Foo không có đầu vào STDIN. Chúng tôi không đồng ý rằng Foo là tuyệt vời bây giờ? :)

Giải trình

&1          Set current cell to 1
  (  )      Do-while loop (or, at least according to the interpreter)
   $i       Print current cell as int

2
Tôi luôn thích Foo.
một spaghetto

7

Perl, 18 + 1 = 19 13 + 1 = 14 byte

print while$_

Chạy như thế này:

echo -n NUM | perl -p truth.pl

Cảm ơn ThisSuitIsBlackNot (người chơi golf Perl giỏi hơn tôi) vì đã chơi golf năm byte.


2
Công cụ sửa đổi tuyên bố là bạn của bạn! Ngoài ra, nếu bạn đảm bảo rằng đầu vào không có dòng mới, bạn có thể bỏ +0: echo -n 0 | perl -pe'print while$_'(13 byte + 1 cho -p). perl -M5.010 -pe'say while$_'thậm chí sẽ ngắn hơn, nhưng điều đó dẫn đến các dòng mới không nhất quán trong khoảng từ 0 đến 1.
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot Ah-ha! Tôi đã thử in trong khi $ _ nhưng tôi không thể hiểu tại sao nó không hoạt động. Tôi không nhận ra rằng bạn không thể có dòng mới trên đầu vào.
một spaghetto

Đúng, chuỗi 0là sai nhưng 0+ dòng mới là đúng. Xem perldoc perlsyn.
ThisSuitIsBlackNot

2
sayngắn hơn, ngay cả khi bạn tính -Elà một byte phụ.
Dennis

2
@Dennis ... mà tôi vừa nhận ra có thể được sửa bằng -l: perl -lpE 'say while$_'(11 byte + 2 cho -lp).
ThisSuitIsBlackNot 4/11/2015

7

> <> , 6 byte

::n?!;

Đẩy đầu vào trên ngăn xếp để bắt đầu

:        copy top element on stack
 :       copy top element on stack again
  n      pop and outputs top element
   ?     condition trampoline - pops top element, if it is zero skips next instruction
    !    trampoline skips next instruction
     ;   finish execution

1
Ở đây tại PPCG, chúng tôi thích những giải thích của chúng tôi. +1
một spaghetto

3
Tôi khá chắc chắn rằng điều này chỉ hoạt động với đầu vào bằng 0 và 1, khi nó được cho là hoạt động với 48 ( '0') và 49 ( '1'). Tôi có nhầm không?
ngầmmonailail

@quartata Nếu là tôi, tôi muốn nói rằng, để công bằng cho bất kỳ câu trả lời nào sử dụng từ các phương pháp nhận đầu vào truyền thống hơn, bạn nên đặt 48 hoặc 49 vào ngăn xếp. Mặc dù đó là thách thức của bạn và dù sao nó cũng không phải là vấn đề lớn, vì vậy \ _ (ツ) _ / ¯
ngầmmonorail

2
Có một vấn đề khác với điều này: nếu ngăn xếp được điền trước, thì bạn phải thêm 3 byte cho -vcờ.
El'endia Starman

1
@Aaron: Với giá trị của nó, tôi cũng nghĩ đó là 2 byte -v, sau đó tôi đã sửa. Vì vậy, bạn không phải là người duy nhất. :)
El'endia Starman
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.