ใช้โอเปอเรเตอร์ "บ้า" ของ Malbolge


41

หนึ่งในคุณสมบัติที่เป็นเอกลักษณ์ของภาษาโปรแกรมMalbolgeคือOPตัวดำเนินการที่ไม่ได้ใช้งานง่ายซึ่งเรียกว่า "op" ในเอกสารและซอร์สโค้ด แต่รู้จักกันอย่างแพร่หลายว่าเป็นตัวดำเนินการ "บ้า" ตามที่อธิบายโดย Ben Olmstead ผู้สร้างภาษาในเอกสารประกอบของ: " อย่ามองหารูปแบบมันไม่ได้อยู่ที่นั่น "

op คือโอเปอเรเตอร์ "tritwise" - มันทำงานกับตัวเลขสามส่วนที่สอดคล้องกันของทั้งสองอาร์กิวเมนต์ สำหรับแต่ละ trit (บิตที่สาม) ผลลัพธ์ของ op จะได้รับจากตารางการค้นหาต่อไปนี้:

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

ตัวอย่างเช่นในการคำนวณop(12345, 54321)อันดับแรกให้เขียนตัวเลขทั้งสองเป็นไตรภาคแล้วค้นหาแต่ละคู่ของ trits ในตาราง:

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

จุดสำคัญสุดท้ายคือค่าทั้งหมดใน Malbolge มีความกว้าง 10 trits ดังนั้นค่าอินพุตควรถูกเติมด้วย zeroes จนถึงความกว้าง 10 (ตัวอย่างเช่นop(0, 0)อยู่1111111111ในไตรภาค)

งานของคุณคือการใช้จำนวนเต็มสองจำนวน 0 ≤ a, b<59,049 เป็น input และ output 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 แต่แสดงเป็นฐานสาม" มันหมายถึง "อ่าน54616เป็นฐาน 3" ซึ่งแน่นอนคุณไม่สามารถทำได้ (มีตัวเลขที่ Valve ไม่สามารถนับได้) มันอาจจะยังคงเป็นที่ชัดเจนถ้าคุณกำจัด_3ทั้งหมดและถูกต้องมากขึ้น
Nic Hartley

@ Orangeandlemons ฉันเดาว่าการใช้โอเปอเรเตอร์ใน Malbolge จะอยู่ภายใต้ช่องโหว่มาตรฐาน การนำไปใช้ใหม่โดยใช้รหัสอื่นจะไม่เป็นไร
Paŭlo Ebermann

7
@ PaŭloEbermannไม่มีที่ไม่หนี
user202729

คำตอบ:


43

C (gcc) , 99 98 96 ไบต์

  • บันทึกเป็นไบต์ขอบคุณไปที่catcat ; การเล่นกอล์ฟไป19683L'䳣'
  • บันทึกสองไบต์ การเล่นกอล์ฟไป108609L'𚡁'
M,a,l,b,o;L(g,e){for(o=b=L'䳣',l=0;o/=2.4;b/=3)M=g/b,g%=b,a=e/b,e%=b,l+=b*(L'𚡁'>>M+6*a+M&3);g=l;}

ลองออนไลน์!


14
ฉันชอบรูปแบบการตั้งชื่อ!
Matthieu M.

28

JavaScript (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
ที่น่าสนใจว่าคุณพบรูปแบบที่ไม่มีอยู่จริง
Erik the Outgolfer

มีเหตุผลใดที่จะชอบk = 9 ... => ~k && ...ไปk = 10 ... => k && ...?
Falco

1
@ ฟัลโกไม่มันไม่สั้นหรือมีประสิทธิภาพมากขึ้น แต่อย่างใด ฉันต้องการเพียงแค่มักจะชอบสิ่งที่ 0 การจัดทำดัชนีดังนั้นฉันอยากจะเลียนแบบกว่าfor(k=9;k>=0;k--) for(k=10;k>=1;k--)
Arnauld

13

05AB1E , 18 ไบต์

รหัส:

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

ใช้การเข้ารหัส05AB1E ลองออนไลน์!


คำอธิบายอัลกอริทึม

เพื่อให้ได้ตัวเลขที่เต็มด้วยศูนย์เราต้องเพิ่ม59049ให้กับทั้งสองหมายเลข (เนื่องจาก 59049 ในไตรภาคคือ10000000000 ) เราจะได้ไม่ต้องออกชั้นนำ1ในขณะที่0 เราแปลงตัวเลขจากทศนิยมเป็นไตรภาคและเข้าร่วมแต่ละคู่เป็นหมายเลขของตัวเอง(1,1)0

ตัวอย่างเช่นสำหรับอินพุต12345และ54321สิ่งเหล่านี้จะถูกแม็พกับ:

12345101212210205432112202111220

ซึ่งจะให้รายการของจำนวนเต็มเข้าร่วมต่อไปนี้:

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

จำนวนเต็มเหล่านี้ต้องถูกแมปด้วยตารางการค้นหาที่กำหนดใน OP สูตรที่เราใช้ในปัจจุบันนั้นแมปตัวเลขเหล่านี้กับ trits ที่สอดคล้องกัน ( ) คือ:01,100,

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

โดยที่หมายถึงฟังก์ชั่นbitor xor

ในที่สุดหลังจากการทำแผนที่ฟังก์ชั่นนี้ในรายการจำนวนเต็มที่เข้าร่วมเราถือว่ารายการผลลัพธ์นี้เป็นตัวเลขที่แสดงในฐาน 3 และแปลงจากฐาน 3 เป็นทศนิยม


รหัสคำอธิบาย

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

ลองออนไลน์!

ขอบคุณJADสำหรับเทคนิคการเล่นกอล์ฟมนต์ดำและ -2 ไบต์!

30801เมื่อถูกแปลงเป็นจำนวนเต็ม 10 จำนวนไตรภาค1120020210ซึ่งเป็นเพียงการเพิ่มศูนย์ต่อท้ายไปยังตารางการดำเนินงานเมื่ออ่านลงคอลัมน์ จากนั้นเราแปลงตัวเลขที่ประกอบไปด้วยaและbelementwise เป็นจำนวนเต็มและใช้เป็นดัชนีในจำนวนที่ประกอบ30801ไปด้วย


1
62 bytes Yay สำหรับผู้ปฏิบัติงานที่มีความสำคัญ!
JAD

1
ใช่วิธีนี้คุณดัชนีแรกที่ใช้x [.*]จากนั้นการ%any%ดำเนินการทั้งหมดจะเกิดขึ้น ส่วนที่สนุกก็คือว่าถ้าคุณเห็น30801%/%x%%3เป็นที่f=function(x)30801%/%x%%3 f(x[index]) == (f(x))[index]บันทึกการจัดฟัน :)
JAD

@ JAD น่าทึ่ง! และในขณะที่ฉันแสดงความคิดเห็นข้างต้นเวทมนตร์สีดำโดยทั่วไป
Giuseppe

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

ถือได้ว่าเป็นอาร์เรย์ 3x3 โดยที่ a คือคอลัมน์และ b คือแถว การแปลงให้เป็นรายการหนึ่งมิติให้เรา 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 และทำงานลงด้วย pre-loop divide-and-test



7

APL (Dyalog) , 41 25 ไบต์

บันทึกแล้ว 9 ไบต์ด้วย @ Adám

3⊥(b6883)[3⊥⍉⎕⊤⍨3,b93]

ลองออนไลน์!


ใช้เวลาในการสั่งซื้อปัจจัยการผลิตกลับ 25 ไบต์:3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
อดัม

@ Adámขอบคุณ! นั่นเป็นสิ่งที่เรียบร้อย ฉันเดาว่าฉันออกรสไปนิดหน่อยแล้ว: P
Uriel

6

เจลลี่ ,  23  18 ไบต์

-1 ขอบคุณที่เอริก Outgolfer (จัดเรียง3*⁵¤ไป⁵3*)

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

ลิงก์ monadic ยอมรับรายการของจำนวนเต็มสองตัว

ลองออนไลน์! หรือดูการทดสอบในตัว

⁹*%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(ใช้สูตรวิเศษหลังจากได้รับการแปลงจากฐานสิบแล้วนำ 19 ไปสู่พลังงาน, modulo 74, modulo 3 เพื่อรับเอาท์พุทที่ต้องการ - พบโดยใช้การค้นหาใน Python)


18 ไบต์ (หมายเหตุ: ควรมีตัว "prepend y 0s" จริง ๆ)
Erik the Outgolfer

ฮึฉันคิดว่ามันดูน่าอึดอัดใจ ขอบคุณ!
Jonathan Allan

หลายสิ่งดูน่าอึดอัดใจบางครั้งคุณต้องชินกับมัน : P
Erik the Outgolfer


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! นี่คือชุดทดสอบ - ฉันขโมยรหัสห่อจากคำตอบของ Galen Ivanov
Jonathan Allan

ยินดีต้อนรับสู่ PPCG! ทางออกที่ดี! นี่คือลิงค์ของ TIO
Galen Ivanov



@FrownyFrog ดี!
โยนาห์


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

Ruby , 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}

ลองออนไลน์!

สลายตัวaและเกิดbซ้ำจนกว่าเราจะได้ตัวเลข 10 หลัก 6883ให้ตารางที่ประกอบไปด้วยแบนราบ (กลับด้าน) reconstructs จาก ternary 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 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @ErikTheOutgolfer

บันทึกไบต์อื่นซึ่งได้แรงบันดาลใจจากคำตอบของ @ JonathanAllan

im@j3422 3id3Cm.[0Tjd3Q3

[a,b]การป้อนข้อมูลเป็นรายการที่ 2 องค์ประกอบ ลองออนไลน์ได้ที่นี่หรือตรวจสอบกรณีทดสอบทั้งหมดที่นี่

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

.TCสามารถ
Erik the Outgolfer


1

Japt , 24 23 ไบต์

ทำให้ลูกบอลกลิ้งตามการวิ่งของ Japt เป็นภาษาของเดือน - ฉันคาดหวังอย่างเต็มที่ว่าจะได้รับชัยชนะในครั้งนี้!

รับอินพุตในลำดับย้อนกลับเป็นอาร์เรย์จำนวนเต็ม (เช่น[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 (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];

ทั้งสองaและbจะถูกแปลงเป็นรายการสิบ trit แล้วใช้คู่เป็นดัชนี 2D {1, 0, 0, 1, 0, 2, 2, 2, 1}เป็นตารางการค้นหาของตัวเลข ผลลัพธ์จะถูกตีความอีกครั้งเป็นรายการสิบ trit และแปลงกลับเป็นรูปแบบจำนวนเต็ม

ตารางการค้นหาจะถูกเข้ารหัสตามIntegerDigits[6883,3]ซึ่งย่อมาจากเรากำลังรีไซเคิลIntegerDigitsสัญลักษณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.