Y2K …ในปี 2019?


18

วันที่ 10 สิงหาคม 2019 แต่งานของคุณยังเกี่ยวข้องกับ Y2K แปลกใช่มั้ย

สร้างโปรแกรมที่พิมพ์ตัวเองโดยมีหมายเลขสองหลักต่อท้าย ในครั้งแรกที่คุณเรียกใช้มันควรผนวก 00 เข้ากับเอาต์พุตของมัน (ซอร์สโค้ดของมันเพราะนี่คือตัวแปร quine) เมื่อคุณรันเอาต์พุตนั้นโปรแกรมต้นฉบับที่ไม่มีตัวเลขสองหลักควรส่งเอาต์พุตโปรแกรมต้นฉบับ แต่ด้วย 01 ผนวกเข้ากับมัน เรียกว่าการส่งออกจะได้รับโปรแกรม OG 02 ท้ายแล้วว่าจะได้รับโปรแกรมที่มี 03 ... ห่วงโซ่นี้ควรจะดำเนินต่อไปจนถึง 99 BREAKING NEWS: WORLD ENDSโปรแกรมที่ควรเอาท์พุท

หากโปรแกรมของคุณคือY2Kparanoia: yes:

  1. มันควรจะออก Y2Kparanoia: yes00
  2. ผลลัพธ์นั้นควรพิมพ์ออกมา Y2Kparanoia: yes01
  3. ผลลัพธ์นั้นควรพิมพ์ออกมา Y2K paranoia: yes02
  4. ทำซ้ำจนถึงขั้นตอนที่ 100: โปรแกรมนี้แสดงผลข่าววันโลกาวินาศที่ระบุ

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดที่สามารถพิมพ์ได้เองในขณะที่ทำตามขั้นตอนเหล่านี้ชนะ


7
ตามคำอธิบายเวลาที่ 99 ที่เราเรียกใช้เราจะทำงาน2Kparanoia: yes97และผลิต2Kparanoia: yes98ดังนั้นไม่ควร (4) อ่านRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"หรือไม่ (เช่น2Kparanoia: yes99สร้างข่าว)
Jonathan Allan

คำตอบ:


7

Perl 6 , 122 114 106 106 ไบต์

-8 ไบต์ขอบคุณ Shelvacu

END {<print $!-199??"END \{<$_>~~.EVAL};\$!="~($!-1&&$!-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};$!=1

ลองออนไลน์!

ใช้รูปแบบควินมาตรฐานและเพิ่มสตริงข่าวด่วนรวมถึงการเรียกใช้ฟังก์ชันใหม่พร้อมหมายเลขต่อท้าย ใช้ENDเพื่อเรียกใช้ฟังก์ชันเมื่อโปรแกรมสิ้นสุด


คุณสามารถบันทึกได้อีก 3 ไบต์โดยใช้ENDและourตัวแปร:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Shelvacu

สำหรับตอนนี้เป็นผู้ชนะในปัจจุบัน
แอนดรู

7

Ruby, 158 154 146 128 122 100 ไบต์

แรงบันดาลใจจากคำตอบนี้

eval s=%{$><<(D>198?'BREAKING NEWS: WORLD ENDS':'eval s=%%{%s}<<D=%d'%[s[0..-2],D<2?100:D+1])#}<<D=1

แก้ไข: ฉันสามารถลบ(s.split(35.chr)[0]+35.chr).inspectและแทนที่ด้วยs[0..-2](ช่วงของทุกค่ายกเว้นที่ผ่านมา) และ%{ ... }ไวยากรณ์สตริงที่ฉันใช้มาก่อน บันทึก 22 ไบต์!

เวอร์ชั่นเก่า:

แก้ไข: บันทึกคู่ของ parens (และคู่ที่สอดคล้องกันในส่วนข้อมูล) โดยตระหนักว่า"BREAKING NEWS: WORLD ENDS"เป็นสตริงรูปแบบที่ถูกต้องสมบูรณ์และ ruby ​​ละเว้นพารามิเตอร์ extraneos ใด ๆ

END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%{END{$><<(q=S>198?"BREAKING NEWS: WORLD ENDS":%%{%s})%%[q,S<2?0:S-99]}
S=1%02d})%[q,S<2?0:S-99]}
S=1

เมื่อเริ่มต้นนี้ผมตระหนักว่าตั้งแต่หมายเลขที่มีไปที่ส่วนท้ายสุดของโปรแกรมและทับทิมไม่อนุญาตให้ใช้ตัวแปรก่อนที่จะประกาศว่าฉันจะต้องทำให้การทำงานรหัสหลังจากตัวเลขอย่างใด ฉันสามารถทำสิ่งdef a(s) ... end;a 1ที่จะกลายเป็น...end;a 100แต่การใช้ENDไวยากรณ์ที่รู้จักกันน้อยทับทิมของใช้ไบต์น้อยลง อย่างไรก็ตามบล็อกด้านในENDอยู่ในขอบเขตที่แตกต่างกันดังนั้นSจะต้องเป็นตัวแปรส่วนกลางหรือค่าคงที่

คำอธิบาย:

  • END{ ... };S=1: เรียกใช้บล็อกโค้ดก่อนที่โปรแกรมจะหยุดทำงาน ตั้งค่าคงที่Sเป็น1(หรือ100- 199ในการทำซ้ำในอนาคต)
  • $><<( ... ): $>เป็นทางลัดในทับทิมสำหรับ stdout และ<<บน IO เขียนไปยัง IO จำเป็นต้องมีการ parens มิฉะนั้นจะกลายเป็น($><<S)>198...
  • S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]: ถ้าฉันจะแบ่งออกเป็นรหัสที่เหมาะสมกว่านี้เล็กน้อยมันจะเป็น:

    if S > 198
      "BREAKING NEWS: WORLD ENDS"
    else
      q = ...
      number_to_append = if S < 2
        0
      else
        S - 100 + 1
      end
      q % [q, number_to_append]
    end
    

    ตัว%ดำเนินการที่ใช้กับสตริงนั้นมีประสิทธิภาพprintfโดยที่ LHS เป็นสตริงรูปแบบและ RHS เป็นอาร์กิวเมนต์

  • %{ ... (q=%%{%s}) ... S=1%02d}: ruby ​​มีรูปแบบที่น่าสนใจสำหรับสตริงที่ยังอนุญาตให้คู่ของวงเล็บปีกกาปรากฏในสตริงโดยไม่ต้องหลบหนีใด ๆ ตราบเท่าที่พวกเขามีความสมดุล สิ่งนี้มีประโยชน์มากมิเช่นนั้น quine ที่คล้ายกันจะต้องหลีกเลี่ยงสตริงเพื่อให้มันเป็นสตริงตามตัวอักษร ทั้งสองแทนในรูปแบบของสตริงที่มี%sสตริงปกติและ%02dหมายเลขขวาเบาะขนาดของ 2 0กับตัวละคร

ความคิดของฉันเกี่ยวกับการตัดทอนเพิ่มเติม:

  • มันดีที่จะสามารถใช้sแทนได้$sแต่การกำหนด s s=$s;หรือการสร้างฟังก์ชั่นdef a(s) ...ทั้งสองนั้นใช้ไบต์มากกว่าที่พวกเขาบันทึกไว้และฉันไม่สามารถคิดวิธีอื่นที่จะทำได้ แก้ไข: ค่าคงที่เป็นสากลและสามารถเป็นหนึ่งในตัวละคร!
  • มันคงจะดีถ้าSน้อยกว่านี้เสมอ100เพื่อให้สามารถเปรียบเทียบโดยใช้ตัวเลข 2 หลักแทนตัวเลข 3 หลัก อย่างไรก็ตามถ้าฉันใช้S=0ตอนท้ายเลขสองหลักถัดไปจะตีความว่าเป็นเลขฐานแปดและ8และ9ไม่ถูกต้องและทั้งหมดเป็นสองชั้น S=ไม่ถูกต้องและฉันไม่รู้วิธีอื่นใดในการทำให้ค่าใช้ได้ทั้งก่อนและหลังต่อท้ายตัวเลขสองหลัก จากการสังเกต0(และจำนวนเต็มอื่น ๆ ) เป็นความจริงในทับทิม

ความคิดใดเกี่ยวกับวิธีทำให้สั้นลงโปรดแจ้งให้เราทราบ

ลองออนไลน์!


บางทีถ้าคุณใช้s=100-1? จากนั้นsจะเป็น 99, 0, -1 ...- 99 และ-sจะเป็น -99, 0 ... 99
สีม่วง P

@PurpleP ไม่ว่าฉันจะพยายามอย่างไรฉันก็ไม่สามารถคิดวิธีที่จะทำและบันทึกอักขระได้
Shelvacu

5

ไป, 382 366 354 340 305 298 272 ไบต์

จะไม่ชนะ แต่ฉันก็สนุกกับการท้าทาย

package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`package main
func main(){if n<199{s+="\x60,"
print(s[:135],s,100+(n/100)*(n%100+1))}else{print("BREAKING NEWS: WORLD ENDS")}}
var s,n=`,1

ลองใช้ในสนามไป!

ขึ้นอยู่กับควิน หากตัวแปรnน้อยกว่า 199 แล้วจะเพิ่มตัวแปรสตริงnสำเนียงหลุมฝังศพ ( \x60) ,ไปของตัวละครหลายสายตามด้วยเครื่องหมายจุลภาค มันดำเนินการต่อโดยการพิมพ์ตัวอักษร 147 ตัวแรกของs(เพื่อป้องกันการพิมพ์,เพราะจะเกิดขึ้นในตอนท้ายเท่านั้น) จากนั้นพิมพ์sโดยรวมและในที่สุดก็พิมพ์100ถ้าn == 1และn+1อย่างอื่น ผลที่ได้คือการรันต่อเนื่องเปลี่ยนตัวแปรnที่ส่วนท้ายของโปรแกรมเป็น 100, 101, ฯลฯ หากตัวแปรnเป็น 199 หรือมากกว่านั้นจะพิมพ์ข่าวด่วน



2

JavaScript (ES6), 116 ไบต์

setTimeout(s="alert((n-1?++n:n=100)-200?`setTimeout(s=${JSON.stringify(s)}),n=`+n:'BREAKING NEWS: WORLD ENDS')"),n=1

94 ไบต์หากอนุญาตให้ใช้ฟังก์ชันการกำหนดสตริง

f=_=>((p=`f=${f}`.split`|`)[4]=p[4]-1?-~p[4]:100)-200?p.join`|`:'BREAKING NEWS: WORLD ENDS'||1

2
คุณไม่สามารถอ่านซอร์สโค้ดของคุณเอง ( f=${f}) นั่นไม่ใช่quine
Shelvacu


1

Pyth , 81 80 ไบต์

.vh,K"?>J198\"BREAKING NEWS: WORLD ENDS\"s[\".vh,K\"N:KN+C92NN\"J\"?<J2*TT+J1"J1

ลองออนไลน์!

คำอธิบาย:

.vh,K" ... "J1
.v               Eval pyth code
  h              Get the first item in list
   ,             Make a list of the next two items
            J1   Set J = 1 (J = 100 to 199 in future iterations)
    K" ... "     Set K to the given string

และรหัสในสตริงคือ (ข่าวสั้นลง):

?>J198"BNWE"s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1
?                                              Ternary: If A then B else C
 >J198                                         Test if J > 198
      "BNWE"                                   String literal; If ternary was true, return this (which is then implicitly printed)
            s[".vh,K"N:KN+C92NN"J"?<J2*TT+J1   ternary else
            s                                  concatenate list of strings
             [                                 create list
              ".vh,K"                          string literal, list[0]
                     N                         N is set to the double-quote character, list[1]
                      :KN+C92N                 list[2]
                      :                        Regex substitution. In A, replace B with C
                       K                       Variable K (set to the string being eval'd)
                        N                      N is double-quote
                         +C92N                 A backslash followed by a double-quote
                         +                     concat two strings
                          C92                  character with code point 92 (backslash)
                             N                 N is double-quote
                              N                N is double-quote, list[3]
                               "J"             String literal, list[4]
                                  ?<J2*TT+J1   Inner ternary, list[5]
                                   <J2         If J < 2 ..
                                      *TT      return T * T (10 * 10), else
                                          +J1  return J+1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.