Quat ควิน + แคท


22

Quat เป็นการผสมผสานระหว่างและโปรแกรมแมว esolang ยอดนิยม

ท้าทาย

ความท้าทายคือการเขียนโปรแกรม cat มาตรฐาน สิ่งที่ผู้ใช้ป้อนโปรแกรมจะสะท้อนอินพุตเป็น stdout
อย่างไรก็ตามเมื่อความยาวของอินพุตมากกว่า 0 และทวีคูณของ 4 โปรแกรมควรส่งออกซอร์สโค้ดของตัวเอง Quatมาจากโปรตุเกสquatroซึ่งแปลเป็น 'สี่'

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • คุณไม่สามารถอ่านซอร์สโค้ดจากไฟล์ได้
  • อินพุตว่างควรสร้างเอาต์พุตว่าง

โบนัส

หากความยาวอินพุตของคุณเป็นทวีคูณของ 4 คุณจะได้รับโบนัส 25% โดยการพิมพ์length/4เวลาควิน โบนัสอีก 5% ถ้าคุณแยกเอาท์พุทโดยช่องว่าง (ไม่อนุญาตพื้นที่ต่อท้าย)

กรณีทดสอบ

กรณีทดสอบต่อไปนี้ใช้กับโปรแกรมin%4=0?cat:self(ไม่ใช่ภาษาจริง)

<empty input> -> <empty output>
input -> input
1234 -> in%4=0?cat:self
12345678 -> in%4=0?cat:self 0%โบนัส
12345678 -> in%4=0?cat:selfin%4=0?cat:self 25%โบนัส
12345678 -> in%4=0?cat:self in%4=0?cat:self 30%โบนัส

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


อินพุตสามารถมีหลายบรรทัดได้หรือไม่?
LegionMammal978

@ LegionMammal978 Ofcourse ขอ\nเป็นตัวละครขึ้นบรรทัดใหม่สำหรับ 1 ไบต์ของอินพุต
Bassdrop Cumberwubwubwub

โอเคมันแค่ทำให้การป้อนข้อมูลในภาษาของฉันยุ่งยากซึ่งต้องอ่านทีละบรรทัด
LegionMammal978

มีการสร้าง -ins สำหรับ quines อนุญาตหรือไม่ (ดู: จริงจัง )
Addison Crump

@FlagAsSpam ฉันไม่สนใจ แต่ฉันคิดว่าเมตาโพสต์มีความเหมาะสมมากกว่าที่นี่
Bassdrop Cumberwubwubwub

คำตอบ:


8

CJam, 23 * 0.75 = 17.25 ไบต์

มาตรฐานทั่วไปควิน ...

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

หรือ

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

ทดสอบที่นี่

คำอธิบาย

{`"_~"+  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.
}_~

รุ่นอื่นหลีกเลี่ยงการใช้ตัวแปรโดยใช้เคล็ดลับการหมุนสแต็]:\


4

อย่างจริงจัง8 9 ไบต์

Q,ó;l4@%I

ลองออนไลน์

(กด Enter หนึ่งครั้งในกล่องอินพุตเพื่อทดสอบอินพุตว่าง)

โบนัสแรกสามารถทำได้ใน 12 ไบต์ (16 * .75):

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

คำอธิบาย:

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)

เนื่องจากบางคนไม่ชอบการใช้ quining ในตัวของ Seriously ฉันจึงให้รุ่น 22 ไบต์นี้ที่ไม่ได้ใช้Qสำหรับการอ้างอิง:

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

หากคุณเป็นหนึ่งในคนเหล่านี้ให้พิจารณารุ่นที่ชัดเจน (ตอนนี้) แล้วเริ่มเมตาดาต้าเกี่ยวกับการใช้บิวด์อินใน quines


6
ในควินท้าทายผมเชื่อว่าคุณไม่สามารถอ่านโปรแกรมต้นฉบับ
Conor O'Brien

3
คำแนะนำบอกว่าคุณไม่สามารถอ่านได้จากไฟล์ Q เป็นคำสั่งในตัวที่ผลักแหล่งที่มาไปยังสแต็กเมื่อมันว่างเปล่า ฉันคิดว่าสิ่งนี้ตกอยู่ภายใต้ "การเล่นเพื่อจุดแข็งของภาษา"
quintopia

4
ฉันคิดว่าฟังก์ชั่นควินนิ่งในตัวไม่อ่านซอร์สโค้ด มันเหมือนกับการใช้บิวด์อินสำหรับความท้าทายสัมประสิทธิ์ทวินามเมื่อความท้าทายบอกว่า "ไม่มีแฟคทอเรียลในตัว"
Martin Ender

4
Q ไม่ได้อ่านซอร์สของโปรแกรมจากไฟล์โดยทางเทคนิค - อยู่ใน RAM ซึ่งจัดเก็บโดยล่าม เนื่องจากกฎระบุว่า "จากไฟล์" โดยเฉพาะจึงควรมีผลใช้บังคับ
Mego

3
ฉันไม่เข้าใจจริงๆว่าทำไมสิ่งนี้จึงเป็นที่นิยมมากกว่าภาษาใด ๆ ในอดีตที่มีผู้ให้บริการ quine ในตัวรวมถึง HQ9 + และ MarioGolf ของ Ismael แต่ในกรณีใด ๆ โปรแกรมของคุณอาจทำงานไม่ถูกต้องสำหรับอินพุตว่าง
Martin Ender

2

Pyth, 33 * .75 = 24.75

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

ชุดทดสอบ

Standard Pyth quine โดยใช้การเข้าร่วม นี่เป็นเพียงควินจริงของล่ามออนไลน์ซึ่งไม่ได้เพิ่มบรรทัดใหม่ต่อท้ายสุดท้าย

การได้รับโบนัสครั้งสุดท้ายได้คะแนน 39 * .7 = 27.3:

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

2

Vitsy , 18 17 ไบต์

ใกล้มาก Yus ตอนนี้ฉันชนะในกลุ่มที่ไม่ได้สร้างมาแล้ว! จ้องมองอย่างจริงจัง

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.

ไม่มีเหตุผลอะไรที่ฉันจะไปตามโบนัส - พวกเขาจะเชยต่อไบต์มากขึ้น

รุ่น quine โกง 12 ไบต์:

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` มันเย็น! ดูเหมือนว่าถูกต้องมากกว่าQคำสั่งง่ายๆ
Conor O'Brien

ดูเหมือนว่าฉันจะชอบน้อยกว่าเพราะเห็นว่ามันต้องใช้ไฟล์ I / O อย่างไร
quintopia

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia ถูกต้อง - เพียงเพราะฉันได้รับการอ้างอิงไฟล์ไม่ได้หมายความว่ามันจะดีกว่า : 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)))))))))

สิ่งนี้ใช้กลไกการพูดของ Lisp เพื่อให้ซอร์สโค้ดเป็นอินพุตให้กับตัวเอง

รุ่นโกงเก่า

:; 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)))

Ungolfed:

:; 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
สิ่งนี้ไม่ได้ละเมิดกฎที่ว่า "คุณอาจไม่อ่านซอร์สโค้ดจากไฟล์" หรือไม่?
ThisSuitIsBlackNot ไม่ได้

@ ThisSuitIsBlack ไม่ถูกต้อง ... เดาว่าฉันจะต้องมองหา Quine ที่ไม่ใช่คนโกงใน Elisp
Lord Yuuma

1

JavaScript, 57 56 72 ไบต์ * 0.75 = 54

ขอบคุณ @Neil สำหรับการประหยัดหนึ่งไบต์!

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

ทางออกที่สั้นที่สุดที่ฉันสามารถหาได้ก็คือตรงไปตรงมา

ดังนั้นนี่คือโบนัสสองสามข้อ (น่าสนใจยิ่งขึ้น):

JavaScript, 82 81 ไบต์ * 0.75 = 60.75

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

นี้เป็นหนึ่งในการละเมิดrepeatของการทำงานของการขว้างปายกเว้นถ้าผ่านที่ไม่ใช่จำนวนเต็ม

JavaScript, 83 ไบต์ * 0.70 = 58.1

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

สุดท้ายนี้แน่นอนที่ชื่นชอบของฉันแยกการป้อนข้อมูลในทุกสี่ตัวอักษรโดยใช้ /.{4}/regex หากมีอักขระใด ๆ อยู่ที่ท้ายของสตริงเมื่อเราpopจะไม่สามารถหารด้วย 4 ดังนั้นแจ้งเตือนการป้อนข้อมูล มิเช่นนั้นpopความยาวของอาเรย์จะลดลงทีละหนึ่งดังนั้น ณ จุดนี้ความยาวของอาเรย์จะเท่ากับความยาวของอินพุต / 4 ในกรณีนี้fillมันจะมีควินและjoinช่องว่าง


ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยการย้อนกลับเงื่อนไข เปลี่ยน&&ไป||ใส่!ก่อนที่จะ(p=prompt())ลบ<1และย้ายที่จะอยู่ในภายในของp ?:
Neil

1

Perl, 68 65 * 0.75 = 48.75 ไบต์

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

ดูชุดทดสอบออนไลน์ได้ที่นี่

พังทลาย

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

Mathematica, 229 ไบต์

($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]]]]) & []

ช่องว่างทั้งหมดมีไว้สำหรับInputFormให้โปรแกรมจับคู่โค้ดจริง


0

Javascript ES6, 45 ไบต์

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

ส่วนขยายของ Bling Quine 21 ไบต์ของฉัน หวังว่าการผสมpromptและฟังก์ชั่นการส่งออกจะได้รับอนุญาต


0

JavaScript ขนาด 33 ไบต์

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(l/4)
  • +44ไบต์
  • โบนัส-25%

โซลูชั่นอื่น ๆ :

44 36 ไบต์

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 ไบต์

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55ไบต์
  • โบนัส-25%
  • โบนัส-5%
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.