ハイパープログラミング:N + N、N×N、N ^ Nをすべて1つに


151

1から9までの数Nを取り込むプログラムを作成します。そのネイティブで出力すべきN + NEG出力プログラムを形成する2Nであれば14Nの場合26Nであれば3、というように。

あなたのプログラム内のすべての文字が所定の位置に複製された場合、それは(1から9までまだ)Nを取り込みプログラムと出力N×NEG出力する必要があります1Nである場合は14Nである場合は29Nであれば3、というように。

あなたのプログラム内のすべての文字が所定の位置に三重されている場合、それは(まだ1から9まで)Nを取り込んでプログラムする必要がありますし、出力N ^ NEG出力1Nがある場合14Nである場合は227Nである場合は3387420489Nである場合は9、等

10 ^ 10は多くの言語の通常の整数範囲外であるため、9を超える数値は必要ありません。

初期プログラムが

My_Program!
Exit();

次に、Nを取り込み、N + Nを出力できる必要があります。

さらに、プログラム

MMyy__PPrrooggrraamm!!

EExxiitt(());;

Nを取り込み、N×Nを出力する必要があります。

最後に、プログラム

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

Nを取り込んでN ^ Nを出力します。

4倍文字以上のプログラムは必要ありません。

ルール

  • 入力および出力は、通常のフォーマットされた10進数である必要があります。コードを見せるために別のベースを使用して回答することもできますが、その場合、回答は非競争的です。

  • Windowsユーザーは\r\n1つの文字として扱う\r\r\n\nかもしれません。なぜなら、そのようなものは意味をなさないか、おそらくは機能しないからです。

  • 最短のネイティブプログラム(N + Nの1つ)がバイト単位で勝ちます。


11
それも可能ですか?
セージボルシュ

77
それが完了するまで、それは常に不可能に思えます -ネルソンマンデラ
アドナン

42
@SargeBorschはい。
デニス

8
残念ながら、限られた言語でのみ可能です。
マシューロック

2
@ R.Kapいいえ、わかりにくいです。
カルビンの趣味

回答:


203

ゼリー、12 バイト

N + N

“(ẹ+)‘FQṖṪỌv

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

N×N

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv

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

N ^ N

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv

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

使い方

Jellyには、いくつかの異なるタイプの文字列リテラルがあります。それらはすべてで始まります。リテラルに複数が含まれている場合、文字列配列が返され、文字列が互いに分離されます。

たとえば、“abc“def”yields ['abc', 'def']

(いずれかのリテラルの最後の文字に応じて”«»‘’場所を、«現在実装されていない)、1はリテラルの異なる種類の間で選択することができます。ために、我々は、コード・ポイントを取得ゼリーのコード・ページの代わりに、対応するUnicode文字。

たとえば、“abc“def‘yields [[97, 98, 99], [100, 101, 102]]

プログラムの3つのリテラルは、次のコードポイント配列に対応しています。

“(ẹ+)‘           -> [40, 214, 43, 41]
““((ẹẹ++))‘      -> [[], [40, 40, 214, 214, 43, 43, 41, 41]]
“““(((ẹẹẹ+++)))‘ -> [[], [], [40, 40, 40, 214, 214, 214, 43, 43, 43, 41, 41, 41]]

N + N

“(ẹ+)‘FQṖṪỌv                          Main link. Argument: n

“(ẹ+)‘                                As before.
      F                               Flatten the array. Yields an integer array.
       Q                              Unique; deduplicate the integers.
                                      This yields [40, 214, 43, 41].
        Ṗ                             Pop; remove the last element.
         Ṫ                            Tail; extract the last element. 
                                      This yields 43, the Unicode code point of +.
          Ọ                           Unordinal; cast to character.
           v                          Eval; execute the character as a Jelly
                                      program with argument n.

N×N

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv              Main link. Argument: n

““((ẹẹ++))‘                           As before.
           ‘                          Increment all integers.
            FF                        Flatten the array. Yields an integer array.
              QQ                      Unique; deduplicate the integers.
                                      This yields [41, 215, 44, 42].
                ṖṖ                    Pop twice; remove the last two elements.
                  ṪṪ                  Tail; extract the last element.
                                      This yields 215, the Unicode code point of ×.
                    ỌỌ                Unordinal; cast to character.
                      v               Eval; execute the character as a Jelly
                                      program with argument n.
                       v              Eval; convert the return value (n×n) to a
                                      string and execute that string as a Jelly
                                      program with argument n. Since the string
                                      consists of a single integer literal, that
                                      integer is returned, ignoring the argument.

なおFQ、および(それぞれ)1Dアレイ、重複、整数、文字なしの配列を変化させません。

N ^ N

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv  Main link. Argument: n

“““(((ẹẹẹ+++)))‘                      As before.
                ‘‘                    Increment all integers twice.
                  FFF                 Flatten the array. Yields an integer array.
                     QQQ              Unique; deduplicate the integers.
                                      This yields [42, 216, 45, 43].
                        ṖṖṖ           Pop thrice; remove the last three elements.
                           ṪṪṪ        Tail; extract the last element.
                                      This yields 42, the Unicode code point of *.
                              ỌỌỌ     Unordinal; cast to character.
                                 v    Eval; execute the character as a Jelly
                                      program with argument n.
                                  vv  Eval twice. See N×N.

73
ここにいる皆さんは何でも解決できるので、私は答えを期待していましたが、これは本当におかしなことです。あなたはマスターであり、私はあなたの素晴らしさにa敬の念を抱いています。
ノヴァ

19
デニスからの答えを見たことがないからといって、「まさか」と考え始めた後、説明を読んで彼が神のようなものであると徐々に確信しているとは思わない。
魔法のタコUr

14
賛成票に参加しました。ワオ。
ダニエルR

4
まさか...ゴルフに一日何時間費やしているの?!?
-tfrascaroli

16
@Falcoデニスが投稿されたとき、デニスはただ眠っていたに違いない。;)
マーティン・エンダー

87

> <>、41バイト

\<
1:: :
&&* +
i*n n
c&
%:
4l
0(
.i
n}
&?

オンラインそれを試してみてください:N + NN * NN ^ N。STDIN入力は正確に1文字であると想定しています。

> <>は2D言語です。したがって、命令を下向きに実行すると、コードのセマンティクスがほとんど変更されないという事実を利用できます。この例外は、条件付きトランポリンある?値をポップし、値がゼロだった場合、次の命令をスキップします-余分な改行でしょう台無し?に起因挿入されていない-OPSに、しかし、我々は置くことによってこの問題を回避することができます?の終わりに列とラッピングを利用します。

実行する操作を決定するためのキーは40.、IPを位置にテレポートすること(4, 0)です。コードの拡張により、x = 4+は基本プログラム、*2倍プログラム^、3倍プログラムに対応します。残念ながら、> <>には累乗が組み込まれていないため、プログラムの大部分を占めています。

[Setup]
\         Mirror: reflect IP direction to downwards
1&        Put 1 into the register
ic%       Push a code point of input, then take it mod 12. This maps the char '1' to the
          number 1, and so forth for '2' to '9'.
40.       Jump to (4, 0), still heading downwards

[N+N version]
:+        Duplicate then add
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N*N version]
:*        Duplicate then multiply
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N^N version]
:&*&      Multiply register by N
:l(       Push (N < length of stack + 1)
i         Push input, but since we're now at EOF this pushes -1 (stack length += 1)
}         Move -1 to the back
?<        If (N < length + 1) was 1, execute the < to move leftward. Otherwise, skip it.
          (Continue loop)

\         Mirror: reflect IP direction upwards
&n        Output register
.         Jump to (-1, N), which is invalid so the program errors out

21

TovTovTovチキンの突然変異):810147050バイト

以下に2つの推奨ソリューションを説明します。大量のバイトを必要とする問題に対する完全なソリューションと、2番目の部分的なソリューション(N + NおよびN * N部分のみを解決し、484バイトのみを必要とする)クールなトリックのセット!:)

1.完全なソリューション(810147050バイト)

使用してTovTovTov(TOV='hi',SEP=',')TOV要素が所定の位置に文字を複製する免疫がある(両方"hihihi""hhiihhiihhii"3つの持っている"hi"それらにSを、そしてすべてがTovTovTov気にすることは何であるTOV間に表示される秒SEP秒)。

を使用した場合SEP=', '、プログラム全体が文字の重複の影響を受けません(これはクールですが、問題は解決しません)。使用しますSEP=','

したがって、"hihihi,hi"たとえば、プログラムはints配列[3,1]"hhiihhiihhii,,hhii"コンパイルされ[3,0,1]"hhiihhiihhii,,hhii"to およびtoにコンパイルされ[3,0,0,1]ます。これは、コマンド自体は複製後に意味を変えず、文字の複製によって全体の長さが変わることを意味します。以下のソリューションはプログラムの長さを質問して、これを使用して印刷するか決定するかN+NN*NまたはN^N

ints配列として推奨される完全なソリューションは次のとおりです。 [6, 12, 9, 18, 9, 142, 11, 38, 8, 9, 260, 11, 73, 8, 22, 75, 7, 10, 14, 3, 1, 22, 24, 18, 15, 8, 10, 16, 3, 1, 22, 24, 18, 15, 8, 10, 45, 16, 7, 22, 3, 1, 22, 24, 18, 15, 8, 22, 3, 1, 22, 24, 18, 15, 8, 25, 3, 1, 22, 24, 18, 15, 8, 48, 3, 1, 22, 24, 18, 15, 8, 277, 3, 1, 22, 24, 18, 15, 8, 3146, 3, 1, 22, 24, 18, 15, 8, 46677, 3, 1, 22, 24, 18, 15, 8, 823564, 3, 1, 22, 24, 18, 15, 8, 16777237, 3, 1, 22, 24, 18, 15, 8, 387420510, 3, 1, 22, 24, 18, 15, 8]

文字列として、これは810147050文字で構成される非常に長いプログラムであり、次で始まります。 hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2.質問のN + NおよびN * N部分のみを解く(484バイト)

を使用するTovTovTov(TOV='1',SEP=', ')と、今回はSEPsは複製の影響を受け",, "ません(まだ1つしかありませ", "ん)。したがって、次の推奨ソリューションでは、文字の複製後でも常に33個のコマンドが含まれます。

1111, 111111111111111111111111111111111111111111111111, 1111111111, 1111111111, 1111111111, 111111, 111111111111, 111111111, 11111111111111, 111, 1, 1111111111111111111111, 111111111111111111111111, 111111111111111111, 111111111111111, 11111111, 111111111111, 1111111111111111, 111111111111111, 1111111111111111111111, 111111111111111111111111111111111111, 11, 1111111111111111111111111111, 111111, 111, 111111, 11111111111, 111111111111111111111111111, 1111, 1, 11111111, 1, 11111111

対応するints配列(上記の33個のコマンドのそれぞれTOVのs(1s)の数)は次のとおりです。[4,48,10,10,10,6,12,9,14,3,1,22,24,18,15,8,12,16,15,22,36,2,28,6,3,6,11,27,4,1,8,1,8]

文字を所定の場所に複製すると、まったく異なる 33個のコマンドのリストが作成されます[8,96,20,20,20,12,24,18,28,6,2,44,48,36,30,16,24,32,30,44,72,4,56,12,6,12,22,54,8,2,16,2,16]

元のint配列(N + Nを計算する)は、コマンドの意味が変わった後でもプログラムが意味をなすように注意深く設計されていますが、N * Nを計算します。たとえば、最初の4TovTovTov「次のopをasciiコードとして処理して文字に変換する」と理解する)は、文字複製後にに変更されます8。これはまったく異なるコマンドです(「プログラムカウンタを直後にポップされた値がtrueの場合、スタック」)。


9

Befunge-98、38バイト

vx:k:2-k*.@
20@
j3.
>^*
>:^
>:+.@

オンラインで試してください:N + NN * NN ^ N

このプログラムは、実行開始時に入力がスタック上にある必要があるため、すぐに動作しません。最初の行を次のコードに置き換える(3バイトを追加する)ことにより、stdinからの入力を取得します(残念ながらtryitonline.netでは機能しませんが)。

v
&x:k:2-

説明

セットアップ

v       Redirect motion downward
02j     Jump over two instructions/spaces, executing the third
        If N=1, it will skip to the 6th line
        If N=2, it will skip to the 5th line
        If N=3, it will skip to the 4th line

N = 1

>       Move right
:+.@    Duplicate, add, print and exit

N = 2

>>::^^  Move right, duplicate twice, move up
*.@     Multiply, print and exit

N = 3

>>>^^^  Redirect motion
30x     Set instruction pointer delta to (3, 0), causing it to
        move right, executing every third instruction
:k:     Duplicate the number (we'll call it M) M+1 times
        The stack is now [M]*(M+2)
2-k*    Multiply things M-1 times (`k' is a quirky instruction)
.@      Print and exit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.