하이퍼 프로그래밍 : N + N, N × N, N ^ N 모두 하나로


151

1에서 9까지의 숫자 N을 포함하는 프로그램을 작성하십시오. 네이티브에서 출력합니다 N + NEG 출력 프로그램을 형성 2N 인 경우 1, 4N 인 경우 2, 6N 인 경우 3, 등등.

프로그램의 모든 문자가 장소에 중복되는 경우, 다음은 (1에서 9 여전히) N에 걸리는 프로그램 출력 N × NEG 출력해야 1N 인 경우 1, 4N 인 경우 2, 9N 인 경우 3, 등등.

프로그램의 모든 문자 대신 triplicated 때, 그것은 (1 내지 9에 계속) N에 소요 N ^ NEG 출력을 출력하는 프로그램되어야 1N 인 경우 1, 4N 인 경우 2, 27N 인 경우 3, 387420489N 인 경우를 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\n때문에 하나의 문자로 취급 할 수 \r\r\n\n있습니다.

  • 바이트 단위의 가장 짧은 기본 프로그램 (N + N 프로그램)이 이깁니다.


11
가능합니까?
Sarge Borsch

77
당신이 일을 끝낼 때까지 항상 불가능한 것 같다 넬슨 만델라 -
아드 난

42
@SargeBorsch 예.
Dennis

8
불행히도 제한된 언어로만 가능합니다.
MatthewRock

2
@ R.Kap 아니오, 너무 혼란스러워 보입니다.
Calvin 's Hobbies

답변:


203

젤리 , 12 바이트

N + N

“(ẹ+)‘FQṖṪỌv

온라인으로 사용해보십시오!

N × N

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

온라인으로 사용해보십시오!

N ^ N

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

온라인으로 사용해보십시오!

작동 원리

Jelly에는 여러 가지 유형의 문자열 리터럴이 있습니다. 그들 모두는로 시작합니다 . 리터럴에 둘 이상의이 포함 된 경우 문자열 배열이 반환 되고 문자열이 서로 분리됩니다.

예를 들어 “abc“def”yields ['abc', 'def']입니다.

(어떤의 문자의 마지막 문자에 따라 ”«»‘’경우, «현재 구현되지 않은 것입니다), 하나는 리터럴의 다른 유형 중에서 선택할 수 있습니다. 의 경우 , 해당 유니 코드 문자 대신 Jelly의 코드 페이지 에서 코드 포인트를 얻습니다 .

예를 들어 “abc“def‘yields [[97, 98, 99], [100, 101, 102]]입니다.

프로그램의 세 리터럴은 다음 코드 포인트 배열에 해당합니다.

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

참고 F, Q, , 및 중복, 정수, 문자 (각각)없이 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
나는 당신이 여기에서 무엇이든 해결할 수 있기 때문에 대답을 기대했지만, 이것은 정말 미친 것입니다. 당신은 주인이고 나는 당신의 장엄함을 경외합니다.
Nova

19
나는 데니스의 대답을 본 적이 없다고 생각한다. 그로 인해 "길이 없다"는 생각이 들지 않았고, 그 설명을 읽음으로써 그가 일종의 신임을 확신하게되었다.
Magic Octopus Urn

14
공감에 합류했습니다. 와.
Daniel R

4
안 돼요 ... 하루에 몇 시간을 골프에 쓰십니까?!?
tfrascaroli

16
@Falco 데니스가 게시되었을 때 잠들었을 것입니다. ;)
Martin Ender

87

> <> , 41 바이트

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

온라인으로보십시오 : N + N , N * N , N ^ N . STDIN 입력이 정확히 하나의 문자라고 가정합니다.

> <>는 2D 언어이므로 명령을 아래쪽으로 실행하면 코드 의미가 거의 변하지 않는다는 사실을 활용할 수 있습니다. 추가되는 빈 줄은 아무 문제가 없습니다. 이에 대한 예외는 조건 트램 폴린 인 ?값을 나타나고 값이 0 인 경우 다음 명령을 건너 뜁니다 - 여분의 줄 바꿈 것 엉망으로 ?인해 어떤 작전을 삽입 없지만, 우리는을 놓음으로써이 문제를 피할 수있다에 ?의 끝에서 열 및 줄 바꿈 활용.

실행할 작업을 결정하기 위해 키는 40.IP를 위치로 이동시킵니다 (4, 0). 코드의 확장으로 인해 x = 4+은 기본 프로그램, *이중 프로그램 및 ^삼중 프로그램에 해당합니다. 불행히도> <>에는 지수가 내장되어 있지 않으므로 프로그램의 대부분을 만들 수 있습니다.

[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 ( Chicken 의 돌연변이) : 810147050 바이트

다음은 두 가지 제안 솔루션입니다. 많은 바이트가 필요한 질문에 대한 완전한 솔루션 하나 와 484 바이트 만 필요한 N + NN * N 부분 만 해결 하는 두 번째 부분 솔루션입니다. 멋진 트릭 세트! :)

1. 전체 솔루션 (810147050 바이트)

사용 TovTovTov(TOV='hi',SEP=',')TOV요소는 장소에 중복 문자 면역 (둘 "hihihi""hhiihhiihhii"셋이 개 "hi"그들들, 그리고 모두 TovTovTov에 대한 관심이 많은 방법이다 TOV들 사이에 표시 SEP들).

를 사용 SEP=', '하면 전체 프로그램이 문자 복제에 영향을받지 않습니다 (멋지지만 문제는 해결되지 않습니다). 그래서 우리는을 사용 SEP=','합니다.

그래서이 프로그램은 "hihihi,hi", 예를 들어,의 int 배열로 컴파일 [3,1]하는 동안, "hhiihhiihhii,,hhii"컴파일에 [3,0,1]"hhiihhiihhii,,hhii"[3,0,0,1]. 이는 명령 자체가 복제 후에 의미를 변경하지 않지만 전체 길이는 문자 복제에 따라 변경됨을 의미합니다. 이 솔루션은 아래의 프로그램의 길이를 조회하고 인쇄 여부를 결정하려면이 옵션을 사용 N+N, N*N또는 N^N.

정수 배열로 제안 된 전체 솔루션은 다음과 같습니다. [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가 복제에 영향을받지 않으므로 ( ",, "여전히 하나만 ", "있음) 다음 제안 된 솔루션에는 문자 복제 후에도 항상 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 개 명령 각각에서 TOVs ( 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]

원래 ints 배열 ( N + N 을 계산 )은 명령의 의미가 변경된 후에도 프로그램이 의미가 있지만 N * N을 계산 하도록 신중하게 설계되었습니다 . 예를 들어, 첫 번째 (즉 에 문자 복사 후 변경 "문자로 변환하는 아스키 코드로 다음 연산을 처리"로 이해) A는, 완전히 다른 명령 (이하 "에서 첫 번째 튀어 값으로 프로그램 카운터를 변경가 스택 바로 다음에 값이 튀어 나온 경우 ").4TovTovTov8


9

Befunge-98 , 38 바이트

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

온라인으로 사용해보십시오 : N + N , N * N , N ^ 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.