Lập trình siêu tốc: N + N, N × N, N ^ N tất cả trong một


151

Viết chương trình bao gồm một số N từ 1 đến 9. Ở dạng nguyên gốc, chương trình của bạn sẽ xuất đầu ra N + NEg 2nếu N là 1, 4nếu N là 2, 6nếu N là 3, v.v.

Khi mọi ký tự trong chương trình của bạn được nhân đôi tại chỗ, thì đó sẽ là một chương trình lấy N (vẫn từ 1 đến 9) và xuất ra đầu ra N × NEg 1nếu N là 1, 4nếu N là 2, 9nếu N là 3, v.v.

Khi mọi ký tự trong chương trình của bạn được nhân ba tại chỗ, thì đó sẽ là một chương trình lấy N (vẫn từ 1 đến 9) và xuất ra N ^ NEg đầu ra 1nếu N là 1, 4nếu N là 2, 27nếu N là 3, 387420489nếu N là 9, Vân vân.

Các số trên 9 không bắt buộc vì 10 ^ 10 nằm ngoài phạm vi số nguyên thông thường của nhiều ngôn ngữ.

Thí dụ

Nếu chương trình ban đầu của bạn là

My_Program!
Exit();

Sau đó, nó sẽ có khả năng nhận N và xuất ra N + N.

Ngoài ra, chương trình

MMyy__PPrrooggrraamm!!

EExxiitt(());;

nên lấy N và đầu ra N × N.

Cuối cùng, chương trình

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

nên lấy N và đầu ra N ^ N.

Chương trình tăng gấp bốn lần và không cần thiết.

Quy tắc

  • Đầu vào và đầu ra phải đơn giản, thường được định dạng số thập phân. Bạn có thể trả lời bằng cách sử dụng một cơ sở khác để hiển thị mã của mình nhưng sau đó câu trả lời của bạn không cạnh tranh.

  • Người dùng Windows có thể coi \r\nlà một nhân vật vì những thứ như \r\r\n\nsẽ không có ý nghĩa hoặc thậm chí có thể hoạt động.

  • Chương trình gốc ngắn nhất (N + N one) tính bằng byte sẽ thắng.


11
thậm chí là có thể?
Sange Borsch

77
Nó dường như luôn luôn là không thể cho đến khi nó được thực hiện - Nelson Mandela
Adnan

42
@SarshBorsch Có.
Dennis

8
Thật không may, nó chỉ có thể trong số lượng ngôn ngữ hạn chế.
MatthewRock

2
@ R.Kap Không, có vẻ quá khó hiểu.
Sở thích của Calvin

Câu trả lời:


203

Thạch , 12 byte

N + N

“(ẹ+)‘FQṖṪỌv

Hãy thử trực tuyến!

N × N

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

Hãy thử trực tuyến!

N ^ N

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Jelly có một số loại chuỗi ký tự khác nhau; tất cả đều bắt đầu bằng a . Nếu nghĩa đen chứa nhiều hơn một , một chuỗi chuỗi được trả về và tách các chuỗi với nhau.

Ví dụ, “abc“def”sản lượng ['abc', 'def'].

Tùy thuộc vào ký tự cuối cùng của chữ (bất kỳ ”«»‘’, «hiện không được thực hiện), người ta có thể chọn giữa các loại chữ khác nhau. Đối với , chúng tôi nhận được các điểm mã trong trang mã của Jelly thay vì các ký tự Unicode tương ứng.

Ví dụ, “abc“def‘sản lượng [[97, 98, 99], [100, 101, 102]].

Ba chữ trong các chương trình tương ứng với các mảng điểm mã sau đây.

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

Lưu ý rằng F, Q, , và không làm thay đổi mảng 1D, mảng mà không cần bản sao, số nguyên, và các nhân vật (tương ứng).

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
Tôi đã mong đợi một câu trả lời, bởi vì các bạn ở đây có thể giải quyết bất cứ điều gì, nhưng đây chỉ là một số thứ thực sự điên rồ. Bạn là một bậc thầy và tôi rất kính phục sự vĩ đại của bạn.
Nova

19
Tôi không nghĩ rằng tôi đã thấy một câu trả lời từ Dennis trước đó, điều đó không khiến tôi bắt đầu nghĩ "không thể nào", sau đó dần dần bị thuyết phục rằng anh ta là một vị thần bằng cách đọc lời giải thích.
Bạch tuộc ma thuật Urn

14
Tham gia để upvote. Ồ
Daniel R

4
Không thể nào ... bạn dành bao nhiêu giờ mỗi ngày để chơi golf?!?
tfrascaroli

16
@Falco Tôi chắc chắn rằng Dennis chỉ ngủ khi được đăng. ;)
Martin Ender

87

> <> , 41 byte

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

Dùng thử trực tuyến: N + N , N * N , N ^ N . Giả sử rằng đầu vào STDIN chính xác là một char.

> <> là ngôn ngữ 2D, vì vậy chúng tôi có thể sử dụng thực tế là ngữ nghĩa mã hầu như không thay đổi nếu chúng tôi thực hiện các hướng dẫn xuống dưới - các dòng trống bổ sung xảy ra chỉ là không có. Ngoại lệ cho điều này là tấm bạt lò xo ?có điều kiện bật ra một giá trị và bỏ qua hướng dẫn tiếp theo nếu giá trị đó là khác không - các dòng mới sẽ gây rối ?do không có op-op, nhưng chúng ta có thể khắc phục điều này bằng cách đặt ?ở cuối một cột và lợi dụng gói.

Để quyết định thao tác nào sẽ thực hiện, khóa là 40., dịch chuyển tức thời IP đến vị trí (4, 0). Do việc mở rộng mã, x = 4cột tương ứng với +chương trình cơ sở, *cho chương trình nhân đôi và ^cho chương trình tăng gấp ba. Thật không may> <> không có tích lũy lũy thừa, khiến phần lớn chương trình.

[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 (một đột biến của ): 810147050 byte

Mô tả dưới đây là hai giải pháp được đề xuất: Một giải pháp đầy đủ cho câu hỏi cần nhiều byte và giải pháp một phần thứ hai (chỉ giải quyết các phần N + NN * N , chỉ cần 484 byte), mỗi giải pháp có một cách tiếp cận khác nhau thiết lập các thủ thuật hay! :)

1. Giải pháp đầy đủ (810147050 byte)

Sử dụng TovTovTov(TOV='hi',SEP=','), các TOVyếu tố miễn nhiễm với việc sao chép các ký tự tại chỗ (cả hai "hihihi""hhiihhiihhii"có ba "hi"s trong đó, và tất cả sự TovTovTovquan tâm là có bao nhiêu TOVs xuất hiện giữa SEPcác s).

Nếu chúng ta sử dụng SEP=', ', toàn bộ chương trình sẽ miễn nhiễm với nhân bản (điều này thật tuyệt, nhưng sẽ không giải quyết được câu hỏi). Vì vậy, chúng tôi sử dụng SEP=','.

Vì vậy, chương trình "hihihi,hi", ví dụ, biên dịch thành mảng ints [3,1], trong khi "hhiihhiihhii,,hhii"biên dịch thành [3,0,1]"hhiihhiihhii,,hhii"đến [3,0,0,1]. Điều này có nghĩa là bản thân các lệnh không thay đổi ý nghĩa của chúng sau khi sao chép, nhưng độ dài tổng thể thay đổi theo sao chép ký tự. Các giải pháp dưới đây truy vấn theo chiều dài của chương trình và sử dụng này để quyết định xem có nên in N+N, N*Nhoặc N^N.

Giải pháp đầy đủ được đề xuất, như mảng ints, là: [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]

Là một chuỗi, đây là một chương trình khá dài, bao gồm 810147050 ký tự, bắt đầu bằng: hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2. Chỉ giải các phần N + N và N * N của câu hỏi (484 byte)

Sử dụng TovTovTov(TOV='1',SEP=', '), lần này các SEPs miễn dịch với sao chép ( ",, "vẫn chỉ có một ", "trong đó), vì vậy giải pháp được đề xuất sau đây sẽ luôn có 33 lệnh trong đó, ngay cả sau khi sao chép ký tự:

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

Mảng ints tương ứng (số TOVs ( 1s) trong mỗi 33 lệnh trên) như sau:[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]

Sao chép các ký tự tại chỗ dẫn đến một danh sách 33 lệnh hoàn toàn khác nhau : [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]

Các mảng ints gốc (để tính toán N + N ) được thiết kế một cách cẩn thận để sau khi các lệnh thay đổi ý nghĩa của chúng, chương trình vẫn có ý nghĩa, nhưng tính toán N * N . Ví dụ: lần đầu tiên 4( TovTovTovhiểu là "coi op tiếp theo là mã ascii để chuyển đổi thành ký tự") thay đổi sau khi sao chép ký tự thành 8một lệnh hoàn toàn khác ("thay đổi Bộ đếm chương trình thành giá trị được bật đầu tiên từ ngăn xếp, nếu giá trị xuất hiện ngay sau đó là đúng ").


9

Befunge-98 , 38 byte

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

Dùng thử trực tuyến: N + N , N * N , N ^ N

Chương trình này sẽ không hoạt động vượt trội vì nó yêu cầu đầu vào phải ở trên ngăn xếp khi bắt đầu thực hiện. Bằng cách thay thế dòng đầu tiên bằng mã sau (thêm ba byte), nó sẽ lấy đầu vào từ stdin (mặc dù điều này không hoạt động trên tryitonline.net, thật đáng buồn):

v
&x:k:2-

Giải trình

Thiết lập

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.