Dengeli bazlar arasında dönüştürme!


13

Dengeli bazlar:

Dengeli bazlar esasen normal bazlarla aynıdır, ancak basamaklar pozitif veya negatif olabilirken, normal bazlarda rakamlar sadece pozitif olabilir.

Buradan sonra, bazın dengeli bazları - yani dengeli baz 4 = bolarak temsil edilebilir .balbbal4

Bu meydan tanımı, baz dengeli bir tabanı basamak aralığı bile ilgili olduğu -(k - 1)için b - k, burada

k = ceil(b/2)

Çeşitli dengeli bazlarda basamak aralığına örnekler:

bal10:
  k = ceil(10/2) = 5
  range = -(5 - 1) to 10 - 5 = -4 to 5
        = -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
  k = ceil(5/2) = 3
  range = -(3 - 1) to 5 - 3 = -2 to 2
        = -2, -1, 0, 1, 2

Dengeli bazlarda sayıların temsili temel olarak normal bazlarla aynıdır. Örneğin, dizi gösterimi 27(10 tabanı) bal4(dengelenmiş taban 4) olduğu 2 -1 -1için,

  2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)

Görev:

Göreviniz, üç girdi verildiğinde:

  • dönüştürülecek sayı ( n)
    • bu giriş esnek olabilir, bkz. "G / Ç Esnekliği"
  • nşu anda bulunan taban ( b)
  • ndönüştürülecek taban ( c)

Nerede 2 < b, c < 1,000.

Dengeli taban cgösterimindeki sayıyı döndürür n. Çıktı da esnek olabilir.

Program / fonksiyon ngirişin kendisinin uzunluğunu belirlemelidir .

G / Ç Esnekliği:

Giriş nve çıktınız aşağıdaki şekillerde gösterilebilir:

  • dilinizin bir dizi tanımı
  • ayırıcı olarak herhangi bir karaktere sahip bir dize (örneğin boşluklar, virgül)

Örnekler:

Bunların bir Python dizisi olarak nve çıktı kullandığını unutmayın. "I / O Esnekliği" tanımına uyduğu sürece dilinize uyan her şeyi kullanabilirsiniz.

[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]

Bu , bayt en kısa kod kazanır!


İlk cevabınızda, 4 yasal bir bal7 rakamı değildir; Cevabın [1, -3, -1] olması gerektiğine inanıyorum. İkinci test durumu ([1,2,2, -1,2]) ve üçüncü test durumu ([1,1,0, -2,1,0]) için de farklı cevaplar alıyorum ...?
Greg Martin

@GregMartin Ah, whoops - Bunları elle hesapladım, bu yüzden bazı problemler vardı. Fark ettiğiniz için teşekkürler! Her ihtimale karşı çözümlerinizi iki kez kontrol edebilir misiniz?
clismique

Qwerp-Derp Üçüncü test örneği[1,1,1,-2,1,0]
ngenisis

Yanıtlar:


2

Mathematica, 85 bayt

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

açıklama

#~FromDigits~#2

#1Bir tamsayı tabanına #2(giriş 2) dönüştürmek (1 ima edilir - giriş 1, basamak listesi ).

... ~IntegerDigits~#3

Elde edilen tam sayıyı tabana #3(giriş 3) dönüştürerek bir basamak listesi oluşturun.

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

Rakam listesini tekrar tekrar değiştirin; bir rakam zeminden ( #3/ 2) büyükse #3, ondan çıkartın ve 1sola doğru rakamı ekleyin . Solda hiçbir şey yoksa, a 0ekleyin ve ekleyin 1.


Genellikle çözümünüz hakkında biraz konuşmanız ve Mathematica'yı bilmeyen insanlar için açıklamanız önerilir.
ATaco

@ATaco Açıklama eklendi!
JungHwan Min

Bununla biraz gizem duyuyorum. İşlev tanımları dışında hiçbir yerde isteğe bağlı kalıplar görmedim. {...}Sadece bir değiştirme kuralı olduğundan dış kısma ihtiyacınız yoktur .
ngenisis

1
@JungHwanMin Doğru, sanırım beni şaşırtan şey bunun maçı nasıl etkilediğidir p___. Bu p___, ya en kısa ya a_,b_da bunu izler mi b_, yoksa isteğe bağlı kalıpların her birini gerektiren tüm deseni kontrol eder ve ardından bir eşleşme (ya da üçüncü bir seçenek) bulana kadar isteğe bağlı kalıpları aşamalı olarak düşürür mü?
ngenisis

1
@ngenisis Ben önceki yorumda (silinmiş) yanlış olduğunu düşünüyorum, sonucu gözlemleyerek FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&. {p___,a_,b_,q___}önce eşleştirilir (mümkün olan her şey için p) ve sonra {p___,b_,q___}eşleştirilir. İkinci değiştirme sadece bbaşlangıçta geçerlidir, çünkü bortada koşulu karşılayan bir varsa , {p___,a_,b_,q___}onunla eşleşir.
JungHwan Min

1

Perl 6 , 121 bayt

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

Yavaş kaba kuvvet çözümü.

Nasıl çalışır:

  • map {[ .base(c).comb]}, 0..*- cHer sayı bir basamak dizisi olarak temsil edilen , tabanda doğal sayıların tembel sonsuz dizisini oluşturun .
  • $_ - ($_ > floor c/2) * c- cZeminden daha büyük olan her basamaktan (c / 2) çıkararak dönüştürün .
  • first { f(b, n) == f(c, $_) }, ...- Bu sıralamanın temel csayı nolarak yorumlandığında, temel bsayı olarak yorumlanan giriş dizisine eşit olan ilk dizisini alın .
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Ters dizi, tabanın güçler dizisi ile sıkıştırılarak elde edilen ürünlerin toplamını alarak, bir diziyi @^ntabandaki bir sayıya dönüştüren yardımcı işlevi $^b.

1

JavaScript (ES6), 89 bayt

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100 bayt, negatif değerleri için çalışır n.

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))

0

Mathematica, 118 114 bayt

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

ve sırasıyla 3 baytlık karakterlerdir U+230Ave U+230B. Dönüştürür #3tabanına 10tabanından #2, daha sonra tabanına dönüştürür #(argüman sırası örneklerden ters çevrilir böylece). Herhangi bir basamak izin verilen maksimum basamaktan büyükse k=⌊#/2⌋, bu rakamı bir #sonraki basamağa kadar azaltın ve artırın (başa geçmesi gerekebilir 1). Tüm rakamlar küçük olana kadar bunu yapmaya devam edin k.

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.