Karma Taban Dönüşümü


12

Arka fon

Buradaki çoğu insan birkaç temel sisteme aşina olmalıdır: ondalık, ikili, onaltılık, sekizli. Örneğin onaltılık sistemde, sayı 12345 16 temsil edeceğini

1*16^4 + 2*16^3 + 3*16^2 + 4*16^1 + 5*16^0

Genellikle tabanın (burada 16) rakamdan basamağa değişmesini beklemediğimizi unutmayın .

Bu olağan konum sistemlerinin genelleştirilmesi, her bir basamak için farklı bir sayısal taban kullanmanıza izin verir. Örneğin, biz ondalık ve ikili sistem arasında değişen edildi, numarayı (en az önemli basamak taban 10 ile başlayan) 190.315 [2,10] temsil eder

1*10*2*10*2*10 + 9*2*10*2*10 + 0*10*2*10 + 3*2*10 + 1*10 + 5 = 7675

Bu üs olarak belirtiyoruz [2,10]. En sağdaki taban, en küçük anlamlı basamağa karşılık gelir . Daha sonra, basamaklardan (sola) geçerken, tabanlardan daha fazla basamak varsa, etrafı sararsınız.

Daha fazla okuma için Wikipedia'ya bakınız .

Meydan okuma

Basamaklı bir listesi verilmiştir, bir program ya da işlev Yazın Dbir giriş baz Ive bir çıkış baz Oile temsil edilen tam sayı dönüştürür Dtabanından Itabanına O. STDIN, ARGV veya işlev bağımsız değişkeni ile girdi alabilir ve sonucu döndürebilir veya STDOUT'a yazdırabilirsiniz.

Varsayabilirsiniz:

  • içindeki rakamlar, bu Ive Odaha bütün büyüktür 1.
  • Ive Oboş olmayan bulunmaktadır.
  • Girilen numaranın verilen tabanda geçerli olması (yani tabanından daha büyük bir rakam olmaması).

Dboş olabilir (temsil eden 0) veya başında sıfır olabilir. Çıktınız önde gelen sıfır içermemelidir. Özellikle, temsil eden bir sonuç 0boş bir liste olarak döndürülmelidir.

Yerleşik veya 3. taraf temel dönüştürme işlevlerini kullanmamalısınız.

Bu kod golf, en kısa cevap (bayt cinsinden) kazanır.

Örnekler

D               I                  O        Result
[1,0,0]         [10]               [2]      [1,1,0,0,1,0,0]
[1,0,0]         [2]                [10]     [4]
[1,9,0,3,1,5]   [2,10]             [10]     [7,6,7,5]
[1,9,0,3,1,5]   [2,10]             [4,3,2]  [2,0,1,1,0,1,3,0,1]
[52,0,0,0,0]    [100,7,24,60,60]   [10]     [3,1,4,4,9,6,0,0]
[0,2,10]        [2,4,8,16]         [42]     [1,0]
[]              [123,456]          [13]     []
[0,0]           [123,456]          [13]     []

Temel bir tanım olarak sonsuz bir listeye ihtiyacım olabilir mi yoksa kendim de sınırlandırmak zorunda mıyım?
John Dvorak

@JanDvorak Temel listelerin tüm rakamları kapsayacak kadar çok sayıda yinelemeye sahip olmasını bekleyebilir misiniz? Hayır, etrafı sarmalısın veya kendini tekrar etmelisin.
Martin Ender

ÜB olarak boş bir liste almayı varsayıyorum, ancak rakam listesinin boş olmadığını varsayabilir miyiz? Ayrıca, sıfırın sonuna ilişkin politika nedir?
John Dvorak

Yani, girişte boş bir liste umursamıyorum, ancak []giriş ise üretmek istiyorum[0]
John Dvorak

Rakamların listesini ters sırada isteyebilir ve üretebilir miyim (önce LSD)?
John Dvorak

Yanıtlar:


6

CJam, 45

q~_,@m>0@{@(:T+@T*@+}/\;La{\)_@+@@md@@j@+}jp;

Sonunda iyi bir kullanım buldum j.

Nasıl çalışır

Long ArrayList Block jparametre olarak bir tamsayı alan bloğu yürütür ve Long jbu bloğu özyineli olarak blokta çağırır. Ayrıca, blok tarafından döndürülen değerleri, array parametresi tarafından başlatılan dahili bir dizide saklar. Girdi zaten dizideyse bloğu yürütmez ve dizideki değer döndürülür.

Boş bir dizi dizisiyle başlatırsam, boş dizi 0 girişi için döndürülür ve blok diğer girdiler için yürütülür.

q~_,@m>0@{@(:T+@T*@+}/\;     " See below. Stack: O decoded-D ";
La                           " Initialized the value with input 0 as empty list. ";
{
  \)_@+@@md@@                " See below. Stack: remainder O quotient ";
  j                          " Call this block recursively except when the same quotient has
                               appeared before, which is impossible except the 0.
                               Stack: remainder O returned_list ";
  @+                         " Append the remainder to the list. ";
}j
p;                           " Format and output, and discard O. ";

CJam, 49 48

q~_,@m>0@{@(:T+@T*@+}/\;{\)_@+@@md@@}h;;_{}?]W%`

Giriş olmalıdır O I D.

Örnekler:

$ while read; do <<<$REPLY ./cjam-0.6.2.jar <(echo 'q~_,@m>0@{@(:T+@T*@+}/\;{\)_@+@@md@@}h;;_{}?]W%`');echo; done
[2] [10] [1 0 0]
[10] [2] [1 0 0]
[10] [2 10] [1 9 0 3 1 5]
[4 3 2] [2 10] [1 9 0 3 1 5]
[10] [100 7 24 60 60] [52 0 0 0 0]
[42] [2 4 8 16] [0 2 10]
[13] [123 456] []
[13] [123 456] [0 0]
[1 1 0 0 1 0 0]
[4]
[7 6 7 5]
[2 0 1 1 0 1 3 0 1]
[3 1 4 4 9 6 0 0]
[1 0]
""
""

Nasıl çalışır

q~           “ Read the input and evaluate. ";
_,@m>        " Rotate I to the right by the length of D. ";
0@{          " For each item in D, with the result initialized to 0: ";
  @(:T+      " Rotate I to the left, and set the original first item to T. ";
  @T*@+      " Calculate result * T + current. ";
}/
\;           " Discard I. ";
{            " Do: ";
  \)_@+      " Rotate O to the right, and get a copy of the original last item. ";
  @@md       " Calculate divmod. ";
  @@         " Move O and the quotient to the top of the stack. ";
}h           " ...while the quotient is not 0. ";
;;           " Discard O and the last 0. ";
_{}?         " If the last item is still 0, discard it. ";
]W%          " Collect into an array and reverse. ";
`            " Turn the array into its string representation. ";

CJam'in sahip olduğu için dizi rotasyonunu kullanmayı bırakmalıyım ... Bu _{}?hile gerçekten temiz.
Dennis

@sudo {}e|aynı.
jimmy23013

Kullanarak sürüm için bir açıklama eklemek ister misiniz j? :)
Martin Ender

@ MartinBüttner Tamamlandı.
jimmy23013

3

CJam, 62 61 59 57 bayt

q~Wf%~UX@{1$*@+\@(+_W=@*@\}/;\;{\(+_W=@\md@@}h;;]W%_0=!>p

Giriş dizilerini [O I D]STDIN'den okur . Çevrimiçi deneyin.

Nasıl çalışır

q~         " Read from STDIN and evaluate the input. Result: [O I D]                      ";
Wf%~       " Reverse each of the three arrays and dump them on the stack.                 ";
UX@        " Push U (0) and X (1); rotate D on top of both.                               ";
{          " For each N in D:                                                             ";
  1$*      "   N *= X                                                                     ";
  @+       "   U += N                                                                     ";
  \@(+     "   I := I[1:] + I[:1]                                                         ";
  _W=@*    "   X *= I[-1]                                                                 ";
  @\       "   ( U I X ) ↦ ( I U X )                                                      ";
}/         "                                                                              ";
;\;        " Discard I and X.                                                             ";
{          " R := []; Do:                                                                 ";
  \(+      "   O := O[1:] + O[:1]                                                         ";
  _W=@\md  "   R += [U / O[-1]], U %= O[-1]                                               ";
  @@       "   ( O U R[-1] ) ↦ ( R[-1] O U )                                              ";
}/         " While U                                                                      ";
;;]        " Discard U and O.                                                             ";
W%         " Reverse R.                                                                   ";
_0=!>      " Execute R := R[!R[0]:] to remove a potential leading zero.                   ";
p          " Print a string presentation of R.                                            ";

Test senaryoları

$ cjam mixed-base.cjam <<< '[ [2]     [10]             [1 0 0]       ]'
[1 1 0 0 1 0 0]
$ cjam mixed-base.cjam <<< '[ [10]    [2]              [1 0 0]       ]'
[4]
$ cjam mixed-base.cjam <<< '[ [10]    [2 10]           [1 9 0 3 1 5] ]'
[7 6 7 5]
$ cjam mixed-base.cjam <<< '[ [4 3 2] [2 10]           [1 9 0 3 1 5] ]'
[2 0 1 1 0 1 3 0 1]
$ cjam mixed-base.cjam <<< '[ [10]    [100 7 24 60 60] [52 0 0 0 0]  ]'
[3 1 4 4 9 6 0 0]
$ cjam mixed-base.cjam <<< '[ [42]    [2 4 8 16]       [0 2 10]      ]'
[1 0]
$ cjam mixed-base.cjam <<< '[ [13]    [123 456]        []            ]'
""
$ cjam mixed-base.cjam <<< '[ [13]    [123 456]        [0 0]         ]'
""

Boş dizelerin ve boş dizilerin CJam için ayırt edilemez olduğunu unutmayın, bu nedenle []pyazdırır "".


4
OMG 62 baytlık CJam programını hiç görmedim: D
Optimize Edici

@Optimizer Bu muhtemelen en uzun CJam sunumum.
Esolanging Fruit


@Dennis Bu kod golf değildi , değil mi?
Esolanging Fruit

@ Challenger5 Değil, ama golf edilmiş bir versiyonun 200 bayttan kısa olacağından şüpheliyim.
Dennis

2

Python 2-331

from operator import *
d,i,o=input()
c=len
def p(l):return reduce(mul,l,1)
n=sum(x[1]*p((i[-x[0]%c(i)-1:]+x[0]/c(i)*i)[1:]) for x in enumerate(d[::-1]))
r=[]
j=1
t=[]
k=c(o)
while p(t)*max(o)<=n:t=(o[-j%k-1:]+j/k*o)[1:];j+=1
while j:j-=1;t=(o[-j%k-1:]+j/k*o)[1:];r+=[n/p(t)];n%=p(t)
print (r if r[0] else [])

Argümanların sırasını kazara berbat ettim, bu yüzden onları tersine çevirmek zorunda kaldım. Daha sonra listelerin diğer yönde çalışmasını sağlamak için dilim-fu üzerinde çalışacağım, tüm öğle tatilimi boşa harcadım: p

Sabit


"Atık" demeyin;)
Martin Ender

286 byte'a kadar golf yapabilmelisiniz: repl.it/JbIk
Zacharý

@ Zacharý Bu benim ilk golfümdü, sanırım bundan daha kısa olabilir! Feersum'un cevabı bence oldukça iyi gösteriyor. Eğer istersen bu cevabı düzenleyebilirsin, ama korkarım ki bunu geliştirmek için motive olmadım.
FryAmTheEggman

2

APL, 78

{1↓(⊃1⌷⍺)({t←⍺[(⍴⍺)|⍴⍵]
(⌊0⌷⍵÷t)(t|0⌷⍵),1↓⍵}⍣{0=0⌷⍵}),+/(0,⍵)×⌽×\1,(⍴⍵)⍴⌽⊃0⌷⍺}

Örnekler:

f←{1↓(⊃1⌷⍺)({t←⍺[(⍴⍺)|⍴⍵]
  (⌊0⌷⍵÷t)(t|0⌷⍵),1↓⍵}⍣{0=0⌷⍵}),+/(0,⍵)×⌽×\1,(⍴⍵)⍴⌽⊃0⌷⍺}
(,10)(,2) f 1 0 0
1 1 0 0 1 0 0
(,2)(,10) f 1 0 0
4
(2 10)(,10) f 1 9 0 3 1 5
7 6 7 5
(2 10)(4 3 2) f 1 9 0 3 1 5
2 0 1 1 0 1 3 0 1
(100 7 24 60 60)(,10) f 52 0 0 0 0
3 1 4 4 9 6 0 0
(2 4 8 16)(,42) f 0 2 10
1 0
(123 456)(,13) f ⍬

⍴(123 456)(,13) f ⍬
0
(123 456)(,13) f 0 0

⍴(123 456)(,13) f 0 0
0

Sadece genel eğitim için - yerleşiklerle: {{⍵↓⍨1⍳⍨×⍵}(99⍴⎕)⊤⍵⊥⍨⎕⍴⍨⍴⍵}D'yi doğru argüman olarak alır, sonra I ve O'yu sorar.
Adám

2

Python 2-122

Çok basit, bu herhangi bir özel golf hileler bulmayı başaramadı.

def f(D,I,O):
 n,i,l=0,-len(D),[]
 for d in D:n=n*I[i%len(I)]+d;i+=1
 while n:i-=1;b=O[i%len(O)];l=[n%b]+l;n/=b
 return l

Ungolfed:

def f(D,I,O):
    n = 0
    for i in range(len(D)):
        dn = len(D) - i
        n = n * I[-dn % len(I)] + D[i]
    l = []
    i = 0
    while n:
        i -= 1
        b = O[i%len(O)]
        l = [n%b] + l
        n /= b
    return l

Düzenleme: FryAmTheEggman sayesinde 116 baytlık program sürümü

D,I,O=input()
n,i,l=0,-len(D),[]
for d in D:n=n*I[i%len(I)]+d;i+=1
while n:i-=1;b=O[i%len(O)];l=[n%b]+l;n/=b
print l

Bu sürüm, virgülle ayrılmış girişi kabul eder; [1,9,0,3,1,5], [2,10], [10]


@FryAmTheEggman Nasıl tırnak işaretleri ile girdi kabul emin değilim ama virgül dizileri ile dizileri ayırabilirsiniz.
feersum

1

k2 - 83 74 karakter

Bir argüman alan işlev. Bu K için J'den çok daha uygun, bu yüzden J kullanmıyorum. Sadece bir sürü boks / kutu çöpü olurdu ve kimse bunu istemiyor. Bu k2 lehçesinde (açık kaynak uygulaması Kona'da çalışmak için bazı uyarlamalar gerektirebilir), ancak daha kısa süre golf yapabilsem bunu k4 olarak değiştireceğim.

{:[#x@:|&~&\~x;|*{x 1}.[{_(x,y!*z;y%*z;1!z)}]/(();+/x*1*\(1-#x)#y;|z);()]}

Burada bir pikap için bir tavır aldığımı ve bir öğe listesinin bu şekilde girilmesi gerektiğini söyleyeceğim. ,2bir öğenin listesidir, bu öğe skalerdir 2. Genellikle skalerler ve 1 maddelik listeler değiştirilebilir, ancak bu golfte liste argümanlarının varsayımına dayanan bir mantık vardır.

Golfü açıklamak için iki bölüme ayıracağım. Fgolf, Lçıktıyı hesaplayan ana döngüdür. Döngünün kesin mekanizması L, ikinci argüman sıfır oluncaya kadar argümanlarına art arda uygulandığı ve ardından sonuç döndürüldüğü şeklindedir. (Bu .[L]/kısım.)

L: {_(x,y!*z;y%*z;1!z)}
F: {:[#x@:|&~&\~x;|*{x 1}.[L]/(();+/x*1*\(1-#x)#y;|z);()]}

Patlama ile:

{_(x,y!*z;y%*z;1!z)}  /function, args x y z
  (      ;    ;   )   / update each arg as follows:
               1!z    /  new z: rotate z left
            *z        /  head of z (current base digit)
          y%          /  y divided by that
 _                    /  new y: floor of that
     y!*z             /  y modulo head of z
   x,                 /  new x: append that to old x

{:[#x@:|&~&\~x;|*{x 1}.[L]/(();+/x*1*\(1-#x)#y;|z);()]}  /function, args x y z
            ~x                                           /find the 0s in x
          &\                                             /find leading zeros
        &~                                               /indices of digits that aren't
    x@ |                                                 /those items from x, reverse order
    x :                                                  /assign to x
 :[#          ;                                      ]   /if length is 0:
                                                   ()    / return empty list
                                                  ;      /else:
                      .[L]/                              / loop L repeatedly
                 {x 1}                                   / until y = 0
                           (  ;               ;  )       / starting with args:
                            ()                           /  Lx: empty list
                                       1-#x              /  number of input digits, minus 1
                                      (    )#y           /  cyclically extend base leftward
                                   1*\                   /  running product, start at 1
                                 x*                      /  multiply digits by these
                               +/                        /  Ly: sum of the above
                                               |z        /  Lz: out base, reverse order
               |*                                        / first elem of result, reversed

Eylemde:

  {:[#x@:|&~&\~x;|*{x 1}.[{_(x,y!*z;y%*z;1!z)}]/(();+/x*1*\(1-#x)#y;|z);()]}[1 0 0; ,10; ,2]
1 1 0 0 1 0 0
  f:{:[#x@:|&~&\~x;|*{x 1}.[{_(x,y!*z;y%*z;1!z)}]/(();+/x*1*\(1-#x)#y;|z);()]}
  f[1 0 0; ,2; ,10]
,4
  f .' ((1 9 0 3 1 5; 2 10;           ,10)  /f apply each
>       (1 9 0 3 1 5; 2 10;           4 3 2)
>       (52 0 0 0 0;  100 7 24 60 60; ,10)
>       (0 2 10;      2 4 8 16;       ,42)
>       (();          123 456;        ,13)
>       (0 0;         123 456;        ,13))
(7 6 7 5
 2 0 1 1 0 1 3 0 1
 3 1 4 4 9 6 0 0
 1 0
 ()
 ())

0

Perl 6 , 67 bayt

{[R,] [+]([R,](@^a)Z*1,|[\*] |[R,](@^b)xx*).polymod: |[R,](@^c)xx*}

Dene

Expanded:

{  # bare block lambda with placeholder parameters @a,@b,@c

  [R,]    # reduce the following using reverse meta op 「R」 combined with 「,」 op
          # (shorter than 「reverse」)

    [+](  # sum

        [R,](@^a) # reverse of first argument

      Z[*]        # zipped using &infix:<*> with the following

        1,
        |                    # slip the following in (flattens)
          [\*]               # triangle reduce

            |[R,](@^b) xx*   # reverse of second argument repeated infinitely
    )

    .polymod: |[R,](@^c) xx* # moduli the reverse of third argument repeated
}

Üçgenin azalmasının ne yaptığından emin değilseniz:

[\*] 1,2,3,4,5
# 1, 1*2, 1*2*3, 1*2*3*4, 1*2*3*4*5
# 1,   2,     6,      24,       120

Girişleri tersine alıp tersini çıkartabilseydim, 47 bayt olurdu.

{[+](@^a Z*1,|[\*] |@^b xx*).polymod: |@^c xx*}

Dene

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.