Quất. Quine + mèo


22

Quat là sự kết hợp giữa và chương trình mèo esolang nổi tiếng .

Thử thách

Thách thức là viết một chương trình mèo tiêu chuẩn. Dù người dùng nhập gì, chương trình sẽ lặp lại đầu vào thành thiết bị xuất chuẩn.
Tuy nhiên, khi độ dài của đầu vào lớn hơn 0 bội số của 4, chương trình sẽ xuất mã nguồn riêng của nó. Quat xuất phát từ quatro Bồ Đào Nha , dịch ra 'bốn'.

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Bạn không thể đọc mã nguồn từ một tập tin
  • Một đầu vào trống sẽ tạo ra một đầu ra trống

Tiền thưởng

Nếu độ dài đầu vào của bạn là bội số của 4, bạn có thể kiếm được 25% tiền thưởng bằng cách in số length/4lần kiểm tra. Phần thưởng 5% khác nếu bạn tách riêng đầu ra theo khoảng trắng (không cho phép dấu cách).

Các trường hợp thử nghiệm

Các trường hợp kiểm tra sau đây áp dụng cho chương trình in%4=0?cat:self(không phải là ngôn ngữ thực).

<empty input> -> <empty output>
input -> input
1234 -> in%4=0?cat:self
12345678 -> in%4=0?cat:self 0% tiền thưởng
12345678 -> in%4=0?cat:selfin%4=0?cat:self 25% tiền thưởng
12345678 -> in%4=0?cat:self in%4=0?cat:self 30% tiền thưởng

Chấm điểm

Đây là . Mã ngắn nhất trong byte thắng.


Đầu vào có thể có nhiều dòng?
LegionMammal978

@ LegionMammal978 Tất nhiên, hãy \nlà ký tự dòng mới, cho 1 byte đầu vào
Bassdrop Cumberwubwubwub

Được rồi, nó chỉ làm phức tạp đầu vào trong ngôn ngữ của tôi, mà phải được đọc từng dòng một.
LegionMammal978

Được xây dựng cho quines cho phép? (xem: Nghiêm túc )
Addison Crump

@FlagAsSpam Tôi không phiền, nhưng tôi nghĩ một bài đăng meta phù hợp hơn ở đây.
Bassdrop Cumberwubwubwub

Câu trả lời:


8

CJam, 23 * 0,75 = 17,25 byte

Tiêu chuẩn tổng quát ...

{`"_~"+q:Q,4md@@*Q\?}_~

hoặc là

{`"_~"+q_,4md@@]:\*?}_~

Kiểm tra nó ở đây.

Giải trình

{`"_~"+  e# Generalised quine framework. Leaves the source code on the stack.
  q:Q    e# Read input and store it in Q.
  ,      e# Get its length.
  4md    e# Divmod 4.
  @      e# Pull up the source code.
  @      e# Pull up the div.
  *      e# Repeat the source code that many times.
  Q\     e# Push the input and swap it below the repeated source.
  ?      e# Pick the right output based on the modulo.
}_~

Phiên bản khác tránh sử dụng biến bằng cách sử dụng thủ thuật xoay vòng ngăn xếp ]:\.


4

Nghiêm túc, 8 9 byte

Q,ó;l4@%I

Dùng thử trực tuyến

(Nhấn enter một lần trong hộp đầu vào để kiểm tra đầu vào trống.)

Phần thưởng đầu tiên có thể được thực hiện trong 12 byte (16 * .75):

Q,ó;l;4@\(*)4@%I

Giải trình:

Q                   Push program source to stack
 ,ó                 Push input string, and terminate if it's empty
   ;l               Push length of input
     4@%            Take the length mod 4.
        I           Pick the next stack element (input) if nonzero,
                    else the next next (program source)

Vì một số người không thích sử dụng tính năng tích hợp sẵn của Seriously, tôi cung cấp phiên bản 22 byte này không sử dụng Qđể tham khảo:

`è";ƒ"(+,ó;l4@%I`;ƒ

Nếu bạn là một trong những người đó, hãy xem đây là phiên bản dứt khoát (bây giờ) và sau đó bắt đầu một chủ đề meta về việc sử dụng tích hợp trong các quines.


6
Trong một thử thách quine , tôi tin rằng bạn không thể đọc được nguồn chương trình.
Conor O'Brien

3
Các hướng dẫn nói rằng bạn không thể đọc nó từ một tập tin. Q là một lệnh tích hợp giúp đẩy nguồn tới ngăn xếp khi nó trống. Tôi nghĩ điều này rơi vào "chơi theo thế mạnh của ngôn ngữ"
quintopia

4
Tôi nghĩ rằng một hàm quining tích hợp sẽ đọc mã nguồn. Điều đó giống như sử dụng tích hợp cho một thách thức hệ số nhị thức, khi thử thách nói "không có yếu tố tích hợp".
Martin Ender

4
Q không đọc nguồn của chương trình từ một tệp, về mặt kỹ thuật - nó nằm trong RAM, được lưu trữ bởi trình thông dịch. Vì quy tắc quy định cụ thể "từ một tệp", nên điều này sẽ hợp lệ.
Mego

3
Tôi thực sự không hiểu tại sao ngôn ngữ này phổ biến hơn bất kỳ ngôn ngữ nào trước đây với các toán tử khai thác tích hợp, bao gồm cả HQ9 + và MarioGolf của Ismael. Nhưng trong mọi trường hợp, chương trình của bạn dường như không hoạt động chính xác cho đầu vào trống.
Martin Ender

2

Bình, 33 * .75 = 24,75

?%lz4z*/lz4jN*2]"?%lz4z*/lz4jN*2]

Phòng thử nghiệm

Tiêu chuẩn Pyth quine sử dụng tham gia. Đây chỉ là một câu hỏi thực sự về trình thông dịch trực tuyến, không thêm một dòng mới cuối cùng.

Nhận phần thưởng cuối cùng được tính lại với số điểm 39 * .7 = 27.3:

?%lz4zjd*/lz4]jN*2]"?%lz4zjd*/lz4]jN*2]

2

Vitsy , 18 17 byte

Thật gần gũi . Yus. Bây giờ tôi đang chiến thắng trong số các quiners không được xây dựng! trừng mắt nhìn nghiêm túc

zl4M([&'rd3*8\}]Z
z                 Grab ALL THE INPUT! :D
 l4M([         ]  If the input is a multiple of four, do the stuff in brackets.
      &           Generate a new stack and move to it.
       'rd3*      Standard quine.
            8\}   Push the bottom 8 items of the stack to the top.
                Z Output the current stack.

Không có lý do gì để tôi theo đuổi các phần thưởng - họ sẽ tặc lưỡi nhiều byte hơn.

Phiên bản quine gian lận, 12 byte:

zl4M([&iG`]Z
zl4M([&   ]Z  Same as above.
       i      Push -1.
        G     Get the name of the file with this index of use (-1 is self)
         `    Read the file with the given name and push its contents to the stack.

G` mát mẻ! Nó có vẻ hợp pháp hơn là đơn giảnQ lệnh .
Conor O'Brien

Có vẻ ít hợp pháp với tôi, xem như nó yêu cầu I / O tập tin.
quintopia

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia là đúng - chỉ vì tôi nhận được tài liệu tham khảo tệp không có nghĩa là nó tốt hơn. : P
Addison Crump

2

Emacs Lisp (323 * 0,75 = 242,25)

((lambda (s) (let* ((a (read-string "")) (l (string-bytes a))) (if (> (% l 4) 0) (message a) (dotimes (v (/ l 4)) (prin1 (list s (list (quote quote) s))))))) (quote (lambda (s) (let* ((a (read-string "")) (l (string-bytes a))) (if (> (% l 4) 0) (message a) (dotimes (v (/ l 4)) (prin1 (list s (list (quote quote) s)))))))))

Điều này sử dụng cơ chế trích dẫn của Lisp để cung cấp mã nguồn làm đầu vào cho chính nó.

Phiên bản gian lận cũ

:; exec emacs -Q -script $0
(find-file(nth 2 command-line-args))(set'b(buffer-string))(set's(read-string""))(set'l(string-bytes s))(if(>(% l 4)0)(message s)(dotimes(v(/ l 4))(message"%s"b)))

Ung dung:

:; exec emacs -Q -script $0
(find-file(nth 2 command-line-args)) ; open self
(set'b(buffer-string))               ; read own code to string
(set's(read-string""))               ; read input
(set'l(string-bytes s))              ; length of input
(if(>(% l 4)0)                       ; l % 4 > 0 ?
    (message s)                      ; output input
  (dotimes(v(/ l 4))                 ; (implicit else) repeat l/4 times
    (message"%s"b)))                 ; output own code

2
Điều này có vi phạm quy tắc rằng "Bạn không thể đọc mã nguồn từ một tệp"?
ThisSuitIsBlackNot

@ ThisSuitIsBlackBạn không đúng ... đoán tôi sẽ phải tìm một Quine không gian lận trong Elisp
Lord Yuuma

1

JavaScript, 57 56 72 byte * 0,75 = 54

Cảm ơn @Neil vì đã tiết kiệm một byte!

(f=_=>alert(!(p=prompt())||(l=p.length)%4?p:`(f=${f})()`.repeat(l/4)))()

Giải pháp ngắn nhất tôi có thể tìm thấy là khá đơn giản.

Vì vậy, đây là một vài giải pháp (thú vị hơn):

JavaScript, 82 81 byte * 0,75 = 60,75

f=_=>{try{p=prompt();a=`f=${f};f()`.repeat(p.length/4)}catch(e){a=p}alert(a)};f()

Điều này lạm dụng repeatchức năng của việc ném một ngoại lệ nếu thông qua một số nguyên.

JavaScript, 83 byte * 0,70 = 58,1

(f=_=>alert((a=(p=prompt()).split(/.{4}/)).pop()?p:a.fill(`(f=${f})()`).join` `))()

Điều cuối cùng này chắc chắn là yêu thích của tôi, chia đầu vào cho mỗi bốn ký tự bằng cách sử dụng biểu thức chính quy /.{4}/. Nếu có bất kỳ ký tự nào còn lại ở cuối chuỗi khi chúng ta pop, nó không chia hết cho 4, vì vậy hãy cảnh báo đầu vào. Mặt khác, popđộ dài của mảng giảm đi một, vì vậy tại thời điểm này, độ dài của mảng bằng với độ dài đầu vào / 4. Trong trường hợp này, chỉ cần fillnó với quine và joinvới khoảng trắng.


Tôi nghĩ bạn có thể tiết kiệm một byte bằng cách đảo ngược điều kiện; thay đổi &&thành ||, đặt một !trước (p=prompt()), loại bỏ <1và di chuyển pđến bên trong của ?:.
Neil

1

Perl, 68 65 * 0,75 = 48,75 byte

perl -e'$_=q{print+($l=($~=<>)=~y///c)%4?$~:"\$_=q{$_};eval"x($l/4)};eval'

Xem bộ kiểm tra trực tuyến tại đây.

Hỏng

perl -e'
    $_=q{                      # store source code in $_
        print+(
            $l=($~=<>)=~ y///c # read STDIN into $~, assign length to $l
        )%4 ?                  # if length is a multiple of 4
             $~ :              # print $~
             "\$_=q{$_};eval"  # otherwise, print source code
             x($l/4)           # length/4 times
    };
    eval'                      # eval $_ to execute its contents

0

Toán học, 229 byte

($RecursionLimit = Infinity; WriteString[$Output, If[Mod[StringLength[a = (If[(a = InputString[]) === EndOfFile, "", StringJoin["\n", a, #0[]]] & )[]], 4] == 1, ToString[#0, InputForm][], If[a == "", "", StringDrop[a, 1]]]]) & []

Tất cả các khoảng trắng là dành cho InputFormchương trình khớp với mã thực tế của nó.


0

Javascript ES6, 45 byte

$=(_=prompt())=>_.length%4?_:`$=${$};$()`;$()

Gia hạn Bling Quine 21 byte của tôi. Hy vọng rằng trộn promptvà chức năng đầu ra được cho phép.


0

JavaScript, 33 byte

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(l/4)
  • +44 byte
  • -25% tiền thưởng

Các giải pháp khác:

44 36 byte

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(!!l)

f=(i,l=i.length)=>l%4?i:l?("f="+f):i

38,5 byte

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 byte
  • -25% tiền thưởng
  • -5% tiền thưởng
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.