爆弾をくすぐる!


9

チャレンジ:

整数入力を受け取るプログラムまたは関数を作成します。これは、以下に指定されているように新しいプログラム/関数を出力します。

入力:

整数n:時限爆弾が爆発するまでの秒数。

出力:

秒単位の時間nを入力として使用した元のプログラムは、次のことを行う新しいプログラム/関数を出力します。

  • しているn以前のプログラムが実行されてからの秒が経過しますか?印刷するBOOM!
  • それ以外の場合:プログラム/関数を出力します。それ自体を実行すると、タイマーがn秒にリセットされます(最初に出力されたプログラム/関数と同じように動作します)。

注:開始時刻が変更されているため(少なくともほとんどの言語では)、最初に出力されたプログラム/関数とまったく同じではありません(以下の説明の例を参照)。

疑似コードの例:

元のプログラムがABCあり、入力が60秒であるとしましょう:

ABC60出力DEF(60)

  • DEF(60)60秒以内に実行すると、が出力されますDEF_G(60)。これはとまったく同じようDEF(60)に機能しますが、新しい開始時刻が指定されます。
  • 場合はDEF(60)、60秒後に実行され、それの出力は以下となりますBOOM!

私が「開始時間」とはどういう意味かを明らかにする例:

  1. 入力60秒の基本プログラムはで実行され12:00:00ます。開始時刻がの最初の出力プログラムを出力します12:00:00
  2. の開始時間を含むこの最初の出力プログラム12:00:00は、で実行され12:00:45ます。開始時刻がの2番目の出力プログラムを出力します12:00:45
  3. 開始時刻がこの3番目の出力プログラムは、12:00:45で実行され12:01:25ます。開始時刻がの4番目の出力プログラムを出力します12:01:25
  4. 開始時刻がこの4番目の出力プログラムは、12:01:25で実行され12:05:00ます。出力しますBOOM!

最初の出力がのBOOM!12:01:00にどのように印刷されるかに注意してください。ただし、出力プログラムは12:01:25ステップ3であっても、次のプログラムをBOOM!出力します(出力プログラムはその最初の出力プログラムよりも開始時間が長いため)。 。

チャレンジルール:

  • デフォルトのクインルールが適用されます。
  • 少なくともn数秒は経過しているはずです。だから、入力された場合60、時間を開始した12:00:00時に、12:01:00それが出力v2のプログラムをまだしますが、で12:01:01、それが出力しますBOOM!
  • 出力プログラムは入力を受け取りません(短い場合は空の未使用パラメーターを除きます)。開始時間は、「ハードコードされた」値として次のプログラムに与える必要があります(そのため、出力プログラムの出力は、前のプログラムとほとんど同じではありません(ほとんどの言語)。
  • メインプログラム/関数のサイズのみがバイトでカウントされます。
  • プログラム/関数は、文字列(またはバイト/文字配列/リストなどの同等の適切な形式)、言語がこれをサポートしている場合は関数として、または他の適切な形式(不明な場合は問い合わせてください)として出力できます。

一般的なルール:

  • これはなので、バイト単位の最短の回答が優先されます。
    コードゴルフ言語では、コードゴルフ言語以外の言語で回答を投稿しないようにしないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。
  • 回答には標準規則が適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターと戻り値の型の完全なプログラムで使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストを含むリンクを追加してください。
  • また、必要に応じて説明を追加してください。

「プログラムを出力する」とはどういう意味ですか?ソースコードを文字列として出力しますか?または関数を返しますか?
tsh 2018年

@tsh文字列と関数の両方を許可するルールを追加しました。
Kevin Cruijssen

回答:


2

JavaScript、51バイト

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

ブラウザでテストする

古いバージョン

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

ブラウザでテストする


期待どおりに動作していないようです。
Maarten Bicknese

あなたは可能削除ポストを、そして復活任意のダウン票を避けるために、一度固定し、それを。
tsh 2018年

あなたはでスペースをゴルフすることができreturn()=>ます。また、JavaScriptでプログラミングすることはほとんどありませんが、テストスクリプトをチェックし、関数出力の関数のテストを追加して修正しました。4つ目の関数テストでテストします。すべてが機能しているようで、驚くほど短いので追加する可能性があるため、+ 1してください。PS:ルールでは、関数ではなく文字列を出力する必要があると述べています。ただし、両方を許可するようにルールを少し変更します。テスト中にログに記録する関数も出力するようにスクリプトを変更できますか?
Kevin Cruijssen、

1
f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'動作するはずです
tsh 2018年

魔法使いですか?!パラメータのデフォルト値🤩としてのロジックを使用するのではと思ったことはありません
マールテンBicknese

4

JavaScript、53バイト

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


古い答え(戻り値は文字列である必要があります)

JavaScript、78バイト

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


いい答えで、驚くほど読みやすいです。私はいくつかのテストを行いましたが、すべてうまくいきました。私からの+1。
Kevin Cruijssen

1

Java 8、234バイト

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);}"

私のチャレンジをすぐに投稿して申し訳ありません。これは主にチャレンジをさらに明確にすることを目的としており、質問自体に追加するのか、それとも回答として投稿するのかを疑問視していました(そして、チャレンジ投稿が乱雑にならないように回答として投稿することにしました)。
そして、それは(試して)打ち負かすことでもあると言いたいのですが、Javaは(ほとんど)常に打ちのめされているため、言及する価値はありません。; p

オンラインでお試しください。

出力例:

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

出力されたラムダ関数をここで試してください。

出力例:

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

説明:

メイン関数は整数入力を取り、文字列を返します。基本的には、整数入力と開始時刻(タイムスタンプとしての秒単位)がハードコードされた値として、クインである関数を返します。

主な機能:

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 以下の例で使用されました:

最初の出力プログラム:

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

2番目の出力プログラム:

70492.687613232置き換えられることを除いて、最初の出力プログラムと同じ70548です。



0

05AB1E、50 バイト

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

間違いなくもう少しゴルフをすることはできますが、変更された値でクインプログラムを出力するセミクインを出力するのはかなりトリッキーです。

オンラインで試す、20秒の実行例を試してください

説明:

"‘ÒÞ!"                     # 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)

結果のプログラムの例:

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

これは、デフォルトのクインに基づいています"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)

この05AB1Eのヒント(「辞書の使用方法」のセクション)を参照して、理由を理解し‘ÒÞ!てください"BOOM!"
注:間にスペースがある理由çìは、それ以外の場合はのために辞書文字列(triumph)として解釈されるため’...’です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.