Quine-Bomb'u geçiyor!


9

Meydan okuma:

Aşağıda belirtildiği gibi yeni bir program / işlev çıkaran bir tamsayı girişi alan bir program veya işlev oluşturun.

Giriş:

Tamsayı n: Saatli Bomba patlamadan önceki saniye cinsinden süre.

Çıktı:

nGiriş olarak saniye cinsinden zamanı olan orijinal program , aşağıdakileri yapan yeni bir program / işlev çıkarır:

  • Has nönceki programı çalıştırıldı beri saniye geçti? YazdırBOOM!
  • Else: Kendi kendini çalıştırdığında zamanlayıcıyı nsaniyelere sıfırlayan (ve ilk çıkan program / fonksiyonla aynı şekilde çalışan) bir program / fonksiyon yazdırın .

NOT: İlk çıkış programı / işlevi ile tam olarak aynı değildir (en azından çoğu dilde), çünkü başlangıç ​​zamanı değişmiştir (aşağıdaki açıklama örneğine bakınız).

Sahte kod örneği:

Diyelim ki orijinal program ABCve giriş 60saniyeler:

ABC& 60çıktılar DEF(60).

  • Eğer DEF(60), 60 saniye içinde o olacak çıkışı çalıştırılır DEF_G(60)tam olarak aynı davranır, DEF(60)ancak yeni bir başlangıç zamanı ile.
  • Eğer DEF(60)60 saniye sonra çalıştırılır, yani çıkış olacak BOOM!.

'Başlangıç ​​zamanı' ile ne demek istediğimi açıklama örneği:

  1. Giriş 60saniyeli temel program şu konumda çalıştırılır 12:00:00. İlk çıkış programını başlangıç ​​zamanı ile verir 12:00:00.
  2. Başlangıç ​​zamanı olan bu ilk çıkış programı saatinde 12:00:00çalıştırılır 12:00:45. Başlangıç ​​zamanı olan ikinci bir çıktı programı çıkarır 12:00:45.
  3. Başlangıç ​​zamanı olan bu üçüncü çıkış programı saatinde 12:00:45çalıştırılır 12:01:25. Başlangıç ​​zamanı olan dördüncü bir çıktı programı çıkarır 12:01:25.
  4. Bu dördüncü çıkış programı başlangıç ​​saati 12:01:25ile çalıştırılır 12:05:00. Çıktı verecektir BOOM!.

İlk çıktının BOOM!ardından nasıl yazdırılacağına dikkat edin 12:01:00, ancak çıktı programı 12:01:253. adımda olmasına rağmen ilerlemiştir , bunun yerine bir sonraki programın çıktısını almaya devam edecektir BOOM!(çünkü çıktı çıktı programlarının ilk çıktı programının ötesinde başlama saatleri vardır) .

Zorluk Kuralları:

  • Varsayılan quine kuralları geçerlidir.
  • En azından nsaniyeler geçmiş olmalı. Yani eğer giriş 60ve başlangıç ​​zamanı ise 12:00:00, 12:01:00v2 programının çıktısını almaya devam eder, fakat 12:01:01çıktı verir BOOM!.
  • Çıktı programları herhangi bir girdi almaz ( daha kısa ise kullanılmayan boş bir parametre hariç ). Başlangıç ​​zamanı, sonraki programlara 'sabit kodlanmış' değer olarak verilmelidir (bu nedenle bir çıktı programının çıktısı bir öncekiyle tam olarak aynı değildir (çoğu dilde).
  • Sadece ana programınızın / fonksiyonunuzun boyutu bayt cinsinden sayılır.
  • Programı / işlevi dize (ya da bayt / karakter dizisi / liste gibi karşılaştırılabilir makul biçim), diliniz destekliyorsa işlev olarak ya da diğer makul biçimler olarak çıktı alabilirsiniz (lütfen emin değilseniz sorun).

Genel kurallar:

  • Bu , bayt cinsinden çok kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyon / yöntemi uygun parametreler ve dönüş tipi, tam programlar ile kullanmanıza izin verilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

"Program çıktısı" ne demektir? kaynak kodu dize olarak çıktı? veya bir işlev döndürme?
tsh

@tsh Hem dizeye hem de işleve izin vermek için bir kural eklendi.
Kevin Cruijssen

Yanıtlar:


2

JavaScript, 51 bayt

f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'

Tarayıcıda test et

eski versiyon

f=(t,o=0)=>{setTimeout(()=>o=1,t*1000);return ()=>o?'BOOM!':f(t)}

Tarayıcıda test et


Beklendiği gibi çalışmıyor gibi görünüyor.
Maarten Bicknese

Sen olabilir silmek yazı ve silme işlemini geri herhangi aşağı oy önlemek için, bir kez sabit onu.
tsh

Sahada golf oynayabilirsiniz return()=>. Ve neredeyse hiçbir zaman JavaScript'te programlamama rağmen, test komut dosyanızı kontrol ettim ve hatta işlev çıkışı işlevi için bir test ekleyerek değiştirdim: Burada dördüncü işlev testi ile test edin. Her şey işe yarıyor gibi görünüyor ve şaşırtıcı derecede kısa ekleyebilirim, bu yüzden benden +1. PS: Belirttiği kurallarda, bir işlev yerine bir dize çıktısı vermelidir. Ama her ikisine de izin vermek için kuralları biraz değiştireceğim. Betiği, test sırasında günlüğe kaydedilecek işlevlerin çıktısını verecek şekilde değiştirebilir misiniz?
Kevin Cruijssen

1
f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'çalışmalı
tsh

Sihirbaz mısın ?! Mantık değerini varsayılan parametre değeri olarak kullanmayı düşünmedim 🤩
Maarten Bicknese 30:18

4

JavaScript, 53 bayt

f=(d,t=1/0,n=Date.now()/1e3)=>n>t?'BOOM!':_=>f(d,d+n)


Eski yanıt (döndürme bir dize olmalıdır)

JavaScript, 78 bayt

(f=(o,t,d)=>(x=d,n=Date.now()/1e3)=>o&&n>t?'BOOM!':`(f=${f})(${[1,n+x,x]})`)()


Güzel cevap ve şaşırtıcı derecede okunabilir. Bazı testler yaptım ve her şey yolunda görünüyor. Benden +1.
Kevin Cruijssen

1

Java 8, 234 bayt

n->"v->{long t=System.nanoTime();t/=1e9;String s=\"v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>"+n+"?%1$cBOOM!%1$c:s.format(s,34,s,t);}\";return t-"+(System.nanoTime()/1e9)+">"+n+"?\"BOOM!\":s.format(s,34,s,t);}"

Kendi görevimi hemen gönderdiğim için üzgünüm. Esas olarak, zorluğun daha fazla açıklanması anlamına geliyordu ve soruyu kendisine mi ekleyeceğimize mi yoksa bir cevap olarak mı göndereceğime şüphe ediyordum (ve meydan okuma postasını karıştırmamak için bir cevap olarak göndermeye karar verdim).
Ve yine de (denemek ve) yenmek için bir şey olduğunu söylemek istesem de, bu bile bahsetmeye değmez çünkü, iyi .. Java (neredeyse) her zaman dövülür. s

Çevrimiçi deneyin.

Örnek çıktı:

v->{long t=System.nanoTime();t/=1e9;String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";return t-70492.687613232>60?"BOOM!":s.format(s,34,s,t);}

Çıkarılan lambda işlevini burada deneyin.

Örnek çıktı:

v->{long t=System.nanoTime();t/=1e9;String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";return t-70548>60?"BOOM!":s.format(s,34,s,t);}

Açıklama:

Ana işlev bir tamsayı girişi alır ve bir String döndürür. Temelde, tamsayı girişi ve başlangıç ​​zamanı (zaman damgası olarak saniye cinsinden) sabit kodlanmış değerler olarak bir kine olan bir işlevi döndürür.

Ana işlev:

n->        // Method with integer parameter and String return-type
  "v->{long t=System.nanoTime();t/=1e9;String s=\"v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>"
          //  First part of the output-function
  +n      //  With the integer input placed as hard-coded value
  +"?%1$cBOOM!%1$c:s.format(s,34,s,t);}\";return t-"
          //  The second part of the output-function
  +(System.nanoTime()/1e9)
          //  With the current time in seconds as hard-coded starting time
  +">"+n  //  And the integer input again (for the output of the output function)
  +"?\"BOOM!\":s.format(s,34,s,t);}"
          //  The final part of the output-function

n=60 aşağıdaki örneklerde kullanılmıştır:

İlk çıktı programı:

v->{                   // Method with empty unused parameter and String return-type
  long t=System.nanoTime();t/=1e9;
                       //  New starting time in seconds
  String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";
                       //  Unformatted (quine) result-function
  return t-            //  If the difference between the new starting time
    70492.687613232    //  and hard-coded starting time from the main function
    >60?               //  is larger than the hard-coded integer from the main function
     "BOOM!"           //   Return "BOOM!"
    :                  //  Else:
     s.format(s,34,s,  //   Return the formatted (quine) result-function,
              t);}     //   with this new starting time as new hardcoded value

İkinci çıktı programı:

İlk çıktı programıyla aynı, ancak bununla 70492.687613232değiştirilir 70548.


1

Perl 5 + -p, 88 bayt

$_="\$s=$_;\$t=$^T;".'$_=q{say$^T-$t<$s?qq{\$t=$^T;\$s=$s;\$_=q{$_};eval}:"BOOM!"};eval'

Çıktı programları ile çalıştırılmalıdır -M5.010için saydeğil -p.

Çevrimiçi deneyin!


0

05AB1E , 50 bayt

"‘ÒÞ!""žažb‚žcª60β"D.VsI’"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ’D«

Kesinlikle biraz daha golf yapılabilir, ancak değiştirilmiş değerlere sahip bir quine programı çıkaran bir yarı-quine çıktı almak oldukça zordur.

Çevrimiçi deneyin veya 20 saniyelik bir örnek çalıştırmayı deneyin .

Açıklama:

"‘ÒÞ!"                     # Push the string "‘ÒÞ!"
"žažb‚žcª60β"              # Push the string "žažb‚žcª60β"
 D                         # Duplicate it
  .V                       # Execute it as 05AB1E code:
                           #  ža          : Push the current hours
                           #    žb        : Push the current minutes
                           #      ‚       : Pair them together
                           #       žcª    : Append the current seconds
                           #          60β : Convert from this integer list to base-60
s                          # Swap the seconds-integer and duplicated "žažb‚žcª60β"-string
I                          # Push the input
"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ’  "# Push the string '"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ',
                           # where the `ÿ` are automatically replaced with the stack-values
 D«                        # Duplicate it, and append them together
                           # (after which the string is output implicitly as result)

Ortaya çıkan program örneği:

"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!

Hangi varsayılan Quine'a dayalı geçerli: "34çìD«"34çìD«.

"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!"
                           # Push this string
 34ç                       # Push 34, converted to a character: '"'
    ì                      # Prepend it in front of the string
     D«                    # Duplicate this string, and append them together
                           # (we now have the quine-string at the top of the stack)
  žažb‚žcª60β              # Get the current time in seconds similar as above
             ©             # Store it in variable `®` (without popping)
              35555        # Push the time this program was generated
                   DU      # Store a copy in variable `X`
                     -     # Subtract the two times
30                    i   # If the original input-integer is larger than this:
  X®:                      #  Replace integer `X` with `®` in the generated quine-string
                       ë   # Else:
  ‘ÒÞ!                     #  Push dictionary string "BOOM!"
                           # (and output the top of the stack implicitly as result)

Neden ‘ÒÞ!olduğunu anlamak için bu 05AB1E bahşişime bakın ( sözlük nasıl kullanılır? )"BOOM!" .
Not: aradaki boşluğun nedeni, çìaksi takdirde nedeniyle bir sözlük-string ( triumph) olarak yorumlanmasıdır ’...’.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.