Malbolge의 "미친"연산자 구현


41

Malbolge 프로그래밍 언어 의 많은 고유 한 기능 중 하나는 직관적이지 않은 OP연산자로, 설명서 및 소스 코드에서 "op"로만 알려져 있지만 "crazy"연산자로 널리 알려져 있습니다. 언어의 창시자 인 벤 올 름스 테드 (Ben Olmstead)의 설명에 따르면, " 패턴을 찾지 말고 존재하지 않는다 "고 문서에 기록되어 있다 .

op는 "tritwise"연산자이며 두 인수의 해당 삼항 숫자에서 작동합니다. 각 trit (3 진 비트)에 대해 op의 결과는 다음 찾아보기 테이블에 의해 제공됩니다.

           a
op(a,b)  0 1 2
       +-------
     0 | 1 0 0
   b 1 | 1 0 2
     2 | 2 2 1

예를 들어, 계산하려면 op(12345, 54321)먼저 두 숫자를 모두 삼항으로 쓴 다음 테이블에서 각 쌍의 트 라이트를 찾습니다.

   0121221020   (12345_3)
op 2202111220   (54321_3)
--------------
   2202220211   (54616_3)

마지막으로 중요한 점은 입력 값 (10)의 폭을 제로로 채워질 수 있도록한다 말레 볼제 모든 값이 10 trits가 넓은 점이다 (예를 들어, op(0, 0)1111111111원이다.)

당신의 임무는 입력으로 두 개의 정수 0 ≤ a, b<59049를 취하고의 정수 값을 출력하는 것입니다 op(a,b).

테스트 사례 (형식 a b op(a,b)) :

0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616

다음은 Malbolge 소스 코드에서 직접 복사 한 참조 구현 입니다.


28
Malboge에서이 답변을받을 수 있습니까? ;)
표시 이름

3
나는 Malbolge가 좋은 골프 언어라고 생각합니다!
Ethan

7
가치있는 54616_3것은 "이것은 십진수 54616이지만 기본 3으로 표시됨"을 의미하지는 않습니다. " 54616기본 3으로 읽기"를 의미 합니다. 물론, 당신은 할 수 없습니다 (Valve가 계산할 수없는 숫자가 있습니다). 당신이 _3전체적이고 더 정확한 것을 제거했다면 여전히 분명 합니다.
Nic Hartley

@Orangesandlemons Malbolge에서 연산자를 사용하면 표준 허점에 빠질 것입니다. 다른 코드를 사용하여 다시 구현해도 괜찮습니다.
Paŭlo Ebermann

7
@ PaŭloEbermann 아니요, 허점이 아닙니다 .
user202729

답변:



28

자바 스크립트 (ES7), 56 바이트

f=(a,b,k=9)=>~k&&(a%3|b%3<<9|8)**2%82%3+3*f(a/3,b/3,k-1)

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

어떻게?

에 와 가 주어지면 을 계산합니다.b [ 0..2 ]ab[0..2]

f(a,b)=((a+512b+8)2mod82)mod3

이어지는 :

 a | b | 512b | a + 512b |  + 8 | squared | MOD 82 | MOD 3
---+---+------+----------+------+---------+--------+-------
 0 | 0 |    0 |      0   |    8 |      64 |   64   |   1                  a
 1 | 0 |    0 |      1   |    9 |      81 |   81   |   0                0 1 2
 2 | 0 |    0 |      2   |   10 |     100 |   18   |   0              +-------
 0 | 1 |  512 |    512   |  520 |  270400 |   46   |   1            0 | 1 0 0
 1 | 1 |  512 |    513   |  521 |  271441 |   21   |   0    -->   b 1 | 1 0 2
 2 | 1 |  512 |    514   |  522 |  272484 |   80   |   2            2 | 2 2 1
 0 | 2 | 1024 |   1024   | 1032 | 1065024 |    8   |   2
 1 | 2 | 1024 |   1025   | 1033 | 1067089 |   23   |   2
 2 | 2 | 1024 |   1026   | 1034 | 1069156 |   40   |   1

기능 선택

다음과 같은 형식으로 가능한 몇 가지 후보 기능이 있습니다.

fk,c,p,m(a,b)=((a+kb+c)pmodm)mod3

가장 짧은 것 중 하나는 다음과 같습니다.

f(a,b)=((a+5b+2)4mod25)mod3

그러나 에 대한 좋은 점은 비트 연산자로 수행 할 수 있으므로 및 의 소수 부분을 암시 적으로 무시한다는 것 입니다. 그렇기 때문에 반복마다 반올림하지 않고 단순히 나눌 수 있습니다 .a b 3(a+512b+8)ab3

댓글

f = (a, b,            // given the input integers a and b
           k = 9) =>  // and starting with k = 9
  ~k &&               // if k is not equal to -1:
    ( a % 3           //   compute (a mod 3)
      | b % 3 << 9    //   add 512 * (b mod 3)
      | 8             //   add 8
    ) ** 2            //   square the result
    % 82              //   apply modulo 82
    % 3               //   apply modulo 3, leading to crazy(a % 3, b % 3)
    + 3 * f(          //   add 3 times the result of a recursive call with:
      a / 3,          //     a / 3  \__ no rounding required
      b / 3,          //     b / 3  /   (see 'Function choice')
      k - 1           //     k - 1
    )                 //   end of recursive call

나는 (1581093>>b%3*2+a%3*8&3)전체 바이트를 절약 한다고 생각합니다 !
Neil

@Neil 불행히도, 나는 반올림하지 않고 통과 a/3하고 b/3있습니다. 그 때문에 실패 할 것입니다.
Arnauld

9
존재하지 않는 패턴을 찾는 방법에 흥미가 있습니다.
Outgolfer Erik

선호하는 이유 k = 9 ... => ~k && ...k = 10 ... => k && ...있습니까?
팔코

1
@Falco 아니요, 어떤 식 으로든 짧거나 효율적이지는 않습니다. 나는 단지 색인이없는 0을 선호하는 경향이 있으므로 for(k=9;k>=0;k--)보다 모방하고 싶습니다 for(k=10;k>=1;k--).
Arnauld

13

05AB1E , 18 바이트

암호:

3Tm+3Bø5+3m5(^3%3β

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


알고리즘 설명

0으로 채워지는 숫자를 얻으려면 두 숫자 에 59049 를 더해야 합니다 (3 진수의 59049는 10000000000 이므로 ). 선행 1 을 으로 남겨 둘 필요는 없습니다 . 숫자를 10 진수에서 3 진수로 변환하고 각 쌍을 각 고유 번호로 결합합니다.(1,1)0

예를 들어, 입력 1234554321의 경우 다음에 맵핑됩니다.

12345101212210205432112202111220

다음은 결합 된 정수 목록입니다.

11,2,12,20,12,21,21,11,2,22,0

이러한 정수는 OP의 지정된 조회 테이블에 의해 맵핑되어야합니다. 현재 우리가 사용하는 공식은이 숫자를 해당하는 trit ( )에 매핑합니다 :01,100,

f(x)=((x+5)35) mod 3

반면 비트 단위를 나타내고, 배타적 기능.

결국이 함수를 결합 된 정수 목록에 매핑 한 후이 결과 목록을 밑이 3 인 숫자로 취급하고 밑을 3에서 10으로 변환합니다.


코드 설명

3Tm+                  # Add 59049 to pad the ternary number with zeroes.
    3B                # Convert to base 3.
      ø               # Zip the list to get each joined integer.
       5+             # Add 5 to each element.
         3m           # Raise each element to the power of 3.
           5(^        # XOR each element with -5.
              3%      # Modulo each element with 3.
                3β    # Convert from base 3 to decimal.

3Tm+3Bø19sm74%3%3β골프를 칠 수 있습니까 ?
Jonathan Allan

@JonathanAllan 좋은 발견! 그러나 다른 종류의 흑 마법을 사용하지 않으면 더 이상 골프를 치는 것이 불가능 해 보입니다.
Adnan

11

R , 64 62 바이트

function(a,b,x=3^(9:0))30801%/%x[a%/%x%%3*3+b%/%x%%3+1]%%3%*%x

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

블랙 매직 골프 트릭과 -2 바이트에 대한 JAD 덕분에 !

30801을 10 삼항 정수로 변환 1120020210하면 열을 읽을 때 작업 테이블에 후행 0을 추가합니다. 그런 다음 삼항 자릿수 abelementwise를 정수 로 변환하고이를 삼항 자릿수의 인덱스로 사용합니다 30801.


1
연산자 우선 순위는 62 바이트입니다 .
JAD

1
예, 이렇게하면 먼저을 x사용하여 색인 을 생성 [.*]합니다. 그런 다음 모든 %any%작업이 수행됩니다. 재미있는 부분은 당신이 볼 수있는 경우 30801%/%x%%3f=function(x)30801%/%x%%3그, f(x[index]) == (f(x))[index]. 중괄호 저장 :)
JAD

@JAD 매혹적인! 그리고 위에서 언급했듯이 기본적으로 흑 마법입니다.
주세페

1
나는이 과정에서 많은 어려움을 겪었 음을 행복하게 인정할 것이다. : P
JAD

10

C (gcc) , 74 72 71 바이트

f(a,b,i,r){for(r=0,i=59049;i/=3;)r+=(108609>>a/i%3*2+b/i%3*6&3)*i;i=r;}

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

고장

진리표

           a
op(a,b)  0 1 2
       +-------
     0 | 1 0 0
   b 1 | 1 0 2
     2 | 2 2 1

a는 열이고 b는 행인 3x3 배열로 생각할 수 있습니다. 이를 1 차원 목록으로 변환하면 100102221이됩니다. 공간을 절약하기 위해 목록과 문자열을 피하고 대신 숫자로 만듭니다. 그렇게하기 위해, 우리는 순서를 뒤집고 모든 trit를 2 비트 숫자로 변환합니다. 그것들을 함께 붙이면 오른쪽으로 이동 2 * (b * 3 + a)하고 마스킹 하여 "인덱싱"할 수있는 이진수가 있습니다 :

 1 0 0 1 0 2 2 2 1
 1 2 2 2 0 1 0 0 1
011010100001000001

다음으로 우리는 위의 혐오가되기 위해 작업 우선 순위를 사용하여 표현을 마사지합니다.

3 ^ 9 = 19683이므로 루프 제한이 좋습니다. 매번 카운터에 3을 곱하기 때문에 2e4대신 한도를 쓸 수 있습니다 . 또한 우리는 자신을 귀찮게 pow()또는 유사하게 저장합니다 .

다시 생각해 보면, 3 ^ 10에서 시작하여 사전 루프 분할 및 테스트로 하향 작업을하겠습니다.




6

젤리 ,  23  18 바이트

-1 에릭 Outgolfer 덕분 (순차 3*⁵¤⁵3*)

⁵3*+b3Zḅ3ị⁽½Ṡb3¤ḅ3

두 정수 목록을 허용하는 모나드 링크.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

⁹*%733%3다음보다 긴 바이트입니다. ị⁽½Ṡb3¤(

어떻게?

⁵3*+b3Zḅ3ị⁽½Ṡb3¤ḅ3 - Link: [a, b]      e.g. [11355,1131]
⁵                  - literal ten            10
 3                 - literal three          3
  *                - exponentiation         59049
   +               - addition (vectorises)  [70404,60180]
     3             - literal three          3
    b              - to base (vectorises)   [[1,0,1,2,0,1,2,0,1,2,0],[1,0,0,0,1,1,1,2,2,2,0]]
      Z            - transpose              [[1,1],[0,0],[1,0],[2,0],[0,1],[1,1],[2,1],[0,2],[1,2],[2,2],[0,0]]
        3          - literal three          3
       ḅ           - from base (vectorises) [4,0,3,6,1,4,7,2,5,8,0]
               ¤   - nilad followed by link(s) as a nilad:
          ⁽½Ṡ      -   literal 3706         3706
              3    -   literal three        3
             b     -   to base              [1,2,0,0,2,0,2,1]
         ị         - index into             [0,1,0,0,1,0,2,2,2,1,1]
                 3 - literal three          3
                ḅ  - from base              20650

또한 18 : ⁵3*+b3ZḌ19*%74%3ḅ3(기본 10에서 쌍으로 변환하는 쌍으로 묶은 트릭을 얻은 다음 19를 그 힘, 모듈로 74, 모듈로 3으로 가져 와서 출력의 필요한 트리트를 얻으면 마술 공식을 사용합니다-파이썬에서 검색하여 찾음)


18 바이트 (참고 : 실제로 "prepend y 0s"가 내장 되어 있어야 함 )
Outgolfer Erik

어색해 보인다고 생각했다. 감사!
Jonathan Allan

많은 것이 어색해 보이며 때로는 익숙해 져야합니다. : P
Outgolfer Erik 14:15에


4

J , 37 바이트

((3 3$d 30801){~{@,.)&.(d=.(10$3)&#:)

설명:

((3 3$d 30801){~{@,.)&.(d=.(10$3)&#:)   
                       (d=.(10$3)&#:)   convert to 10 trits, and name this function as d
                     &.                 ... which is done on both args and inverted on the result
                {@,.                    make boxed indices: 1 2 3 4 {@,. 5 6 7 8  ->  1 5 ; 2 6 ; 3 7 ; 4 8
              {~                        index out of a lookup table
 (3 3$d 30801)                          reusing the trits conversion function to make the table

상대적으로 읽기 쉬워졌습니다.


PPCG에 오신 것을 환영합니다! 다음은 테스트 스위트입니다 - 나는 갈렌 이바노프의 대답에서 포장 코드를 훔쳤다.
Jonathan Allan

PPCG에 오신 것을 환영합니다! 좋은 해결책! 여기 에 TIO 링크가 있습니다.
Galen Ivanov



트윗 담아 가기
요나


3

, 31 바이트

I↨³⮌⭆χ§200211⁺∨﹪÷θX³ι³¦⁴﹪÷ηX³ι³

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

     χ                          Predefined variable 10
    ⭆                           Map over implicit range and join
                    ι        ι  Current index
                  X³       X³   Power of 3
                 θ              Input `a`
                          η     Input `b`
                ÷        ÷      Integer divide
               ﹪     ³  ﹪     ³ Modulo by 3
              ∨       ¦⁴        Replace zero ternary digit of `a` with 4
             ⁺                  Add
      §200211                   Index into literal string `200211`
   ⮌                            Reverse
 ↨³                             Convert from base 3
I                               Cast to string
                                Implicitly print

대체 솔루션, 31 바이트 :

I↨³E↨⁺X³χθ³§200211⁺∨ι⁴§↨⁺X³χη³κ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.

        χ                  χ    Predefined variable 10
      X³                 X³     Power of 3 i.e. 59049
         θ                      Input `a`
                            η   Input `b`
     ⁺                  ⁺       Sum
    ↨     ³            ↨     ³  Convert to base 3
   E                            Map over elements
                    ι           Current ternary digit of `a`
                   ∨ ⁴          Replace zero with 4
                      §       κ Index into ternary digits of `b`
                  ⁺             Add
           §200211              Index into literal string `200211`
 ↨³                             Convert from base 3
I                               Cast to string
                                Implicitly print

2

루비 , 70 바이트

->a,b,l=10{l>0?6883.digits(3)[8-b%3*3-a%3]*3**(10-l)+f[a/3,b/3,l-1]:0}

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

우리가 각각 10 자리를 얻을 때까지 분해 a하고 b재귀 적으로. 6883평평한 3 진 테이블 (역순)을 제공합니다. 을 곱하여 삼항에서 십진수로 재구성합니다 3**(10-l).



2

J , 43 바이트

3#.((3 3$t 6883){~<@,~"0)&(_10{.t=.3&#.inv)

확실히 더 골프를 칠 수 있습니다.

설명:

                         &(               ) - for both arguments
                                t=.3&#.inv  - convert to base 3 (and name the verb t)
                           _10{.            - pad left with zeroes
   (              <@,~"0)                   - box the zipped pairs (for indexing)
    (3 3$t 6883)                            - the lookup table
                {~                          - use the pairs as indeces in the table
3#.                                         - back to decimal  

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



2

Pyth 26 25 24 바이트

@ErikTheOutgolfer 덕분에 1 바이트를 절약했습니다.

@JonathanAllan의 답변 에서 영감을 얻은 다른 바이트를 저장하십시오.

im@j3422 3id3Cm.[0Tjd3Q3

입력은 2 요소 목록 [a,b]입니다. 여기 에서 온라인으로 시도 하거나 여기 에서 모든 테스트 사례를 확인 하십시오 .

im@j3422 3id3Cm.[0Tjd3Q3   Implicit: Q=eval(input())
              m       Q    Map each element d of the input using:
                   jd3       Convert to base 3
               .[0T          Pad to length 10 with 0's
             C             Transpose
 m                         Map each element d of the above using:
   j3422 3                   The lookup table [1,1,2,0,0,2,0,2]
  @                          Modular index into the above using
          id3                Convert d to base 10 from base 3
i                      3   Convert to base 10 from base 3, implicit print

.T일 수 있습니다 C.
Outgolfer Erik


1

apt , 24 23 바이트

이 달의 언어로 Japt 's run에서 구르는 공 구하기 -나는 이것에 대해 능숙하게 기대합니다!

입력을 역순으로 정수 배열 (즉, [b,a])로 가져 옵니다 .

ms3 ùTA y_n3 g6883ì3Ãì3

시도 해봐

ms3 ùTA y_n3 g6883ì3Ãì3      :Implicit input of array U=[b,a]
m                            :Map
 s3                          :  Convert to base-3 string
    ù                        :Left pad each
     T                       :  With zero
      A                      :  To length 10
        y                    :Transpose
         _                   :Map
          n3                 :  Convert from base-3 string to decimal
             g               :  Index into
              6883ì3         :    6883 converted to a base-3 digit array
                    Ã        :End map
                     ì3      :Convert from base-3 digit array to decimal


0

Wolfram Language (Mathematica) , 75 72 60 바이트

(d=IntegerDigits)[6883,3][[{1,3}.d[#,3,10]+1]]~FromDigits~3&

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

골프 용 버전 :

M[{a_, b_}] := 
  FromDigits[{1, 0, 0, 1, 0, 2, 2, 2, 1}[[
    IntegerDigits[a, 3, 10] + 3*IntegerDigits[b, 3, 10] + 1
  ]], 3];

모두 ab그 다음 번호의 조회 테이블에 차원의 지표로 페어를 사용하는 열 - trit 목록으로 변환됩니다 {1, 0, 0, 1, 0, 2, 2, 2, 1}. 결과는 다시 10- 트릿 목록으로 해석되고 정수 형식으로 다시 변환됩니다.

조회 테이블은로 코딩되어 있으며 IntegerDigits[6883,3], IntegerDigits심볼을 재활용하기 때문에 짧습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.