Hyperprogramming: N + N, N × N, N ^ N semuanya dalam satu


151

Tulis program yang memasukkan angka N dari 1 hingga 9 inklusif. Dalam bentuk aslinya program Anda harus menampilkan keluaran N + NEg 2jika N adalah 1, 4jika N adalah 2, 6jika N adalah 3, dan seterusnya.

Ketika setiap karakter dalam program Anda digandakan, maka itu harus berupa program yang mengambil N (masih dari 1 hingga 9) dan menghasilkan N × NEg output 1jika N adalah 1, 4jika N adalah 2, 9jika N adalah 3, jika N adalah , dan seterusnya.

Ketika setiap karakter dalam program Anda rangkap tiga di tempat, maka itu harus menjadi program yang mengambil dalam N (masih dari 1 hingga 9) dan output N ^ NEg output 1jika N adalah 1, 4jika N adalah 2, 27jika N adalah 3, 387420489jika N adalah 9, jika N adalah , dll.

Angka di atas 9 tidak diperlukan karena 10 ^ 10 berada di luar rentang integer biasa banyak bahasa.

Contoh

Jika program awal Anda adalah

My_Program!
Exit();

Maka itu harus mampu mengambil N dan mengeluarkan N + N.

Selain itu, program ini

MMyy__PPrrooggrraamm!!

EExxiitt(());;

harus mengambil N dan output N × N.

Akhirnya, programnya

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

harus mengambil N dan output N ^ N.

Program karakter empat kali lipat dan seterusnya tidak diperlukan.

Aturan

  • Input dan output harus berupa angka desimal yang diformat secara normal. Anda dapat menjawab dengan menggunakan pangkalan yang berbeda untuk memamerkan kode Anda, tetapi kemudian jawaban Anda tidak kompetitif.

  • Pengguna Windows dapat memperlakukan \r\nsebagai satu karakter karena hal-hal seperti \r\r\n\ntidak masuk akal atau bahkan mungkin berfungsi.

  • Program asli terpendek (N + N satu) dalam byte menang.


11
apakah itu mungkin?
Sarge Borsch

77
Tampaknya selalu mustahil sampai selesai - Nelson Mandela
Adnan

42
@SargeBorsch Ya.
Dennis

8
Sayangnya itu hanya mungkin dalam jumlah bahasa yang terbatas.
MatthewRock

2
@ R.Kap Tidak, sepertinya terlalu membingungkan.
Hobi Calvin

Jawaban:


203

Jelly , 12 byte

N + N

“(ẹ+)‘FQṖṪỌv

Cobalah online!

N × N

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

Cobalah online!

N ^ N

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

Cobalah online!

Bagaimana itu bekerja

Jelly memiliki beberapa jenis string literal; semuanya dimulai dengan a . Jika literal berisi lebih dari satu , array string dikembalikan, dan memisahkan string satu sama lain.

Misalnya, “abc“def”hasil ['abc', 'def'].

Tergantung pada karakter terakhir dari literal (salah satu dari ”«»‘’, di mana «saat ini tidak diterapkan), seseorang dapat memilih antara berbagai jenis literal. Karena , kami mendapatkan poin kode di halaman kode Jelly alih-alih karakter Unicode yang sesuai.

Misalnya, “abc“def‘hasil [[97, 98, 99], [100, 101, 102]].

Tiga literal dalam program sesuai dengan array titik kode berikut.

“(ẹ+)‘           -> [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.

Perhatikan bahwa F, Q, , dan tidak mengubah array 1D, array tanpa duplikat, bilangan bulat, dan karakter (masing-masing).

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
Saya memang mengharapkan jawaban, karena kalian di sini bisa menyelesaikan apa pun, tetapi ini hanya beberapa hal yang benar-benar gila. Anda adalah seorang master dan saya kagum akan keindahan Anda.
Nova

19
Kurasa aku belum pernah melihat jawaban dari Dennis sebelum itu tidak membuatku mulai berpikir "tidak mungkin", kemudian perlahan-lahan diyakinkan bahwa ia semacam dewa dengan membaca penjelasannya.
Magic Octopus Mm

14
Bergabung untuk memilih. Wow.
Daniel R

4
Tidak mungkin ... berapa jam sehari yang Anda habiskan dalam bermain golf?!?
tfrascaroli

16
@ Falco Saya yakin Dennis baru saja tertidur ketika diposting. ;)
Martin Ender

87

> <> , 41 byte

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

Cobalah secara online: N + N , N * N , N ^ N . Asumsikan bahwa input STDIN adalah tepat satu karakter.

> <> adalah bahasa 2D, jadi kita dapat menggunakan fakta bahwa kode semantik sebagian besar tidak berubah jika kita menjalankan instruksi ke bawah - garis-garis kosong tambahan yang terjadi hanyalah no-ops. Pengecualian untuk hal ini adalah trampolin kondisional ?yang mengeluarkan nilai dan melompati instruksi berikutnya jika nilainya tidak nol - baris baru tambahan akan berantakan ?karena no-op yang dimasukkan, tetapi kita dapat mengatasinya dengan meletakkannya ?di akhir kolom dan memanfaatkan pembungkus.

Untuk memutuskan operasi mana yang akan dieksekusi, kuncinya adalah 40., yang mengirimi IP ke posisi IP (4, 0). Karena perluasan kode, x = 4kolom sesuai dengan +untuk program dasar, *untuk program dua kali lipat dan ^untuk program tiga kali lipat. Sayangnya> <> tidak memiliki eksponensial bawaan, menjadikannya bagian terbesar dari program.

[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 (mutasi Chicken ): 810147050 byte

Dijelaskan di bawah ini adalah dua solusi yang disarankan: Satu solusi penuh untuk pertanyaan yang membutuhkan banyak byte, dan solusi parsial kedua (hanya menyelesaikan bagian N + N dan N * N , hanya membutuhkan 484 byte), masing-masing mengambil pendekatan yang berbeda dan sendiri. mengatur trik keren! :)

1. Solusi lengkap (810147050 byte)

Dengan menggunakan TovTovTov(TOV='hi',SEP=','), TOVelemen-elemen tersebut kebal terhadap duplikasi karakter di tempat (keduanya "hihihi"dan "hhiihhiihhii"memiliki tiga "hi"di dalamnya, dan semua yang TovTovTovpeduli adalah berapa banyak TOVyang muncul di antara SEPs).

Jika kami menggunakan SEP=', ', seluruh program akan kebal terhadap duplikasi karakter (yang keren, tetapi tidak akan menyelesaikan pertanyaan). Jadi kami gunakan SEP=','.

Jadi program "hihihi,hi", misalnya, mengkompilasi ke array ints [3,1], sementara "hhiihhiihhii,,hhii"mengkompilasi ke [3,0,1]dan "hhiihhiihhii,,hhii"ke [3,0,0,1]. Ini berarti bahwa perintah itu sendiri tidak mengubah maknanya setelah duplikasi, tetapi panjang keseluruhan berubah dengan duplikasi karakter. Solusi di bawah ini menanyakan panjang program dan menggunakannya untuk memutuskan apakah akan mencetak N+N, N*Natau N^N.

Solusi lengkap yang disarankan, sebagai array ints, adalah: [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]

Sebagai string, ini adalah program yang cukup panjang, terdiri dari 810147050 karakter, dimulai dengan: hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2. Memecahkan hanya bagian-bagian N + N dan N * N dari pertanyaan (484 bytes)

Menggunakan TovTovTov(TOV='1',SEP=', '), kali ini SEPs kebal terhadap duplikasi ( ",, "masih memiliki hanya satu ", "di dalamnya), sehingga solusi yang disarankan berikut akan selalu memiliki 33 perintah di dalamnya, bahkan setelah duplikasi karakter:

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

The int array yang sesuai (jumlah TOVs ( 1s) di masing-masing 33 perintah di atas) adalah sebagai berikut:[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]

Duplikasi karakter di tempat menghasilkan daftar 33 perintah yang sama sekali berbeda : [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]

Asli int array (yang menghitung N + N ) dirancang dengan hati-hati sehingga setelah perintah mengubah maknanya, program ini masih masuk akal, tapi menghitung N * N . Misalnya, yang pertama 4(yang TovTovTovdipahami sebagai "memperlakukan op selanjutnya sebagai kode ascii untuk dikonversi ke karakter") berubah setelah duplikasi karakter menjadi 8, yang merupakan perintah yang sama sekali berbeda ("ubah Program Counter ke nilai yang muncul pertama dari stack, jika nilai muncul segera setelah benar ").


9

Befunge-98 , 38 byte

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

Cobalah online: N + N , N * N , N ^ N

Program ini tidak akan bekerja di luar kotak karena membutuhkan input untuk berada di tumpukan pada awal pelaksanaan. Dengan mengganti baris pertama dengan kode berikut (menambahkan tiga byte) ia akan mengambil input dari stdin (walaupun ini tidak bekerja di tryitonline.net, sayangnya):

v
&x:k:2-

Penjelasan

Mempersiapkan

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.