Malbolge'nın “çılgın” işlecini uygulayın


41

Malbolge programlama dilinin birçok benzersiz özelliğinden biri, OPdokümantasyon ve kaynak kodunda sadece "op" olarak adlandırılan, ancak popüler olarak "çılgın" operatör olarak bilinen , son derece sezgisel olmayan operatörüdür. Dilin yaratıcısı Ben Olmstead'in açıkladığı gibi, belgelerinde: " kalıp arama, orada yok ."

op "tritwise" operatörüdür - iki argümanının üçlü rakamları üzerinde çalışır. Her bir değer için (üçlü bit), op sonucu aşağıdaki arama tablosu tarafından verilir:

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

Örneğin, hesaplamak için op(12345, 54321)önce her iki sayıyı da üçlü olarak yazın ve ardından tablodaki her bir çift çifti arayın:

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

Son önemli nokta girdi değerleri 10 bir genişliğe sıfır ile boşluklarla böylece Malbolge tüm değerler 10 Trits geniş olmasıdır (Örneğin, op(0, 0)bir 1111111111üçlü olarak).

Göreviniz giriş olarak 0 a, b<59049 olan iki tamsayı almak ve tamsayı değerini çıkarmaktır op(a,b).

Test durumları (biçiminde a b op(a,b)):

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

İşte bir referans uygulaması (doğrudan Malbolge kaynak kodundan kopyalandı).


28
Malboge'da cevaplanabilir mi? ;)
Görünen ad

3
Bence Malbolge şimdi iyi bir golf dili!
Ethan

7
Buna değer, 54616_3"bu diğer şey 54616 ondalık sayı değil, üçüncüsü olarak gösterilir" anlamına gelmez. " 54616Temel 3 olarak oku" anlamına gelir . Tabii ki yapamazsınız (Valf'ın burada hesaba katamayacağı rakamlar var). Eğer _3tamamen ve daha doğru bir şekilde kurtulduysanız, hala aynı derecede açık olacaktır .
Nic Hartley

@Orangesandlemons Ben sadece Malbolge operatörünü kullanarak standart boşluk altında kalacaktı sanırım. Farklı bir kod kullanarak yeniden uygulamak tamam olacaktır.
Paŭlo Ebermann

7
@ PaŭloEbermann Hayır, bu bir kaçamak değil .
user202729

Yanıtlar:



28

JavaScript (ES7), 56 bayt

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

Çevrimiçi deneyin!

Nasıl?

Verilen ve içinde , biz hesaplamak:b [ 0..2 ]ab[0..2]

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

Giden:

 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

İşlev seçimi

Formun birkaç olası aday işlevi vardır:

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

En kısa olanlardan biri:

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

Ancak ile ilgili iyi olan şey , bitsel operatörlerle gerçekleştirilebilmesi, böylece ve ondalık bölümlerini dolaylı olarak . Bu nedenle, her bir yineleme arasında yuvarlamadan bunları bölebiliriz .bir B 3(a+512b+8)ab3

Yorumlananlar

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

Bence (1581093>>b%3*2+a%3*8&3)bir bütün baytı kurtarıyor!
Neil,

@Neil Maalesef geçiyorum a/3ve b/3yuvarlama yapmıyorum . Bu yüzden başarısız olur.
Arnauld,

9
Var olmayan bir deseni nasıl bulduğunuzu ilginç.
Outgolfer Erik,

Tercih k = 9 ... => ~k && ...etmek için bir sebep var mı k = 10 ... => k && ...?
Falco,

1
@Falco Hayır, hiçbir şekilde kısaltılmaz ve daha verimli olmaz. Daha doğrusu taklit ediyorum yüzden sadece, 0-endeksli şeyler tercih güderdik for(k=9;k>=0;k--)daha for(k=10;k>=1;k--).
Arnauld,

13

05AB1E , 18 bayt

Kod:

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

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!


Algoritma Açıklama

Sayıyı sıfırlarla doldurmak için her iki sayıya da 59049 eklememiz gerekir (çünkü üçlü olarak 59049, 10000000000 ). Önde gelen 1'i olarak bırakmak zorunda değiliz . Sayıları ondalıktan üçe dönüştürür ve her çifti her bir sayı olarak birleştiririz.(1,1)0

Örneğin, 12345 ve 54321 girişi için bunlar:

12345101212210205432112202111220

Hangi birleştirilmiş tamsayıların listesini verir:

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

Bu tamsayılar, OP'de verilen arama tablosu ile eşleştirilmelidir. Şu anda kullandığımız formül bu sayıları karşılık gelen değerlerine eşleştirir ( ):01,100,

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

Oysa bitsel xor işlevini belirtir .

Sonunda, bu işlevi birleştirilmiş tamsayılar listesinde eşleştirdikten sonra, bu sonuç listesini 3. tabanda gösterilen bir sayı olarak ele alıyoruz ve 3. tabandan desene dönüştürüyoruz.


Kod Açıklaması

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.

Can 3Tm+3Bø19sm74%3%3βgolfed edilecek?
Jonathan Allan,

@JonathanAllan Güzel bul! Bununla birlikte, başka türden bir kara büyü formülü kullanmadan daha fazla golf oynamak imkansız görünüyor.
Adnan,

11

R , 64 62 bayt

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

Çevrimiçi deneyin!

Bazı kara büyü golf hileleri ve -2 bayt için JAD'a teşekkürler !

30801, 10 basamaklı üçlü bir tamsayıya dönüştürüldüğünde 1120020210, sütunlar okunduğunda işlem tablosuna sadece sonuncu bir sıfır eklenir. Sonra üçgensel sayılarını ave belementwise bir tamsayıya dönüştürüyoruz ve bunu indis olarak üçgenin rakamlarına kullanıyoruz 30801.


1
Operatör önceliği için 62 bayt Yay!
JAD,

1
Evet, bu sayede ilk endeksini xkullanıyorsunuz [.*]. Sonra tüm %any%işlemler gerçekleşir. Eğlenceli bir parçası olduğunu görürseniz 30801%/%x%%3olarak f=function(x)30801%/%x%%3yani f(x[index]) == (f(x))[index]. Diş tellerini kaydetme :)
JAD,

@ JAD büyüleyici! Ve yukarıda yorum yaptığım gibi, temelde kara büyü.
Giuseppe,

1
Mutlu bir şekilde bunun çok uğraştığını itiraf edeceğim: P
JAD

10

C (gcc) , 74 72 71 bayt

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;}

Çevrimiçi deneyin!

Yıkmak

Doğruluk tablosu

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

3x3 dizisi olarak düşünülebilir, burada a sütun ve b satırdır. Bunu tek boyutlu bir listeye dönüştürmek bize 100102221 verir. Yer kazanmak için listelerden ve dizelerden kaçınır ve bunun yerine bir sayı haline geliriz. Bunun için emri çeviririz ve her basamağı 2 bitlik bir sayıya dönüştürürüz. Onları bir araya yapıştırın ve sağa kaydırarak 2 * (b * 3 + a)ve maskeleme yaparak "indeksleyebileceğimiz" ikili bir numaraya sahibiz :

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

Daha sonra, yukarıdaki uyuşukluk olmak için işlem önceliğini kullanarak ifadeyi masaj yaparız.

3 ^ 9 = 19683, bu iyi bir döngü limitidir. Sayacı her seferinde 3 ile çarptığımızdan, 2e4bunun yerine sınırı yazabiliriz . Ayrıca kendimizi, pow()benzer veya zahmetten kurtarırız .

İkinci düşüncede, 3 ^ 10'da başlayalım ve döngü öncesi böl ve testle aşağı doğru çalışalım.




6

Jöle ,  23  18 bayt

-1 Erik Outgolfer sayesinde (yeniden düzenlemek 3*⁵¤için ⁵3*)

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

İki tamsayının listesini kabul eden bir monadik bağlantı.

Çevrimiçi deneyin! Veya bir test odasına bakın .

⁹*%733%3şundan daha uzun bir bayttır ị⁽½Ṡb3¤:(

Nasıl?

⁵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

Ayrıca 18: ⁵3*+b3ZḌ19*%74%3ḅ3(çıktının gerekli değerlerini elde etmek için taban ondan çift dönüşümlü üstelik daha sonra 19'unu bu güce, modulo 74, modulo 3'e aldıktan sonra sihirli bir formül kullanır) - Python'da bir arama kullanarak bulundu


18 bayt (not: gerçekten bir "prepend y 0s" yerleşik olmalı )
Outgolfer Erik,

Ugh, garip görünüyordu sanıyordum. Teşekkürler!
Jonathan Allan,

Birçok şey garip görünüyor, bazen onlara alışmak zorundasın. : P
Outgolfer Erik,


4

J , 37 bayt

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

Açıklama:

((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

Nispeten okunabilir hale geldi, tbh.


PPCG'ye Hoşgeldiniz! İşte bir test paketi - Paket kodunu Galen Ivanov'un cevabından çaldım.
Jonathan Allan

PPCG'ye Welcom! Güzel çözüm! İşte bir TIO bağlantısı.
Galen Ivanov,



@ FrownyFrog güzel!
Jonah


3

Kömür , 31 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

     χ                          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

Alternatif çözüm, ayrıca 31 bayt:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur.

        χ                  χ    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 bayt

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

Çevrimiçi deneyin!

Her biri için 10 rakam elde edinceye kadar ayrıştırır ave btekrarlar. 6883düzleştirilmiş üçlü tablo (ters) verir. Üçlü ile ondalık arasında çoğaltarak yeniden yapılandırır 3**(10-l).



2

J , 43 bayt

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

Kesinlikle daha fazla golf oynayabilir.

Açıklama:

                         &(               ) - 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  

Çevrimiçi deneyin!



2

Pyth 26 25 24 bayt

@ErikTheOutgolfer sayesinde 1 bayt kaydedildi

@ JonathanAllan'ın cevabından ilham alan başka bir byte kaydet

im@j3422 3id3Cm.[0Tjd3Q3

Giriş 2 eleman listesidir [a,b]. Burada çevrimiçi deneyin veya tüm test durumlarını burada doğrulayın .

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

.Tolabilir C.
Outgolfer Erik,


1

Japt , 24 23 bayt

Topu Japt'ın ayın koşusu olarak çalıştırması - Bu konuda tamamen aşılmayı bekliyorum!

Bir tamsayı dizisi (yani, [b,a]) olarak girişi ters sırada alır .

ms3 ùTA y_n3 g6883ì3Ãì3

Dene

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 Dili (Mathematica) , 75 72 60 bayt

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

Çevrimiçi deneyin!

golfsüz versiyonu:

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

Her ikisi de ave bon-trit listelerine dönüştürülür, daha sonra bir sayı indeksleri tablosuna 2B indeks olarak kullanılır {1, 0, 0, 1, 0, 2, 2, 2, 1}. Sonuç tekrar on basamaklı bir liste olarak yorumlanır ve tamsayı haline geri döndürülür.

Arama tablosu IntegerDigits[6883,3]kısa olarak kodlanmıştır , çünkü IntegerDigitssembolü geri dönüştürüyoruz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.