Çılgın ama Akılcı Üsler


11

Temel 10, temel 2, temel 36 ve hatta temel -10'a dayanan birçok zorluğumuz var , ama diğer tüm rasyonel temeller ne olacak?

Görev

Taban 10'daki bir tam sayı ve rasyonel bir taban verildiğinde, bu tabandaki tamsayıyı döndürün (dizi, dize vb.).

süreç

Rasyonel bir üssü hayal etmek zor, bu yüzden Patlayan Noktaları kullanarak onu görselleştirelim :

Temel 3'te 17 ifade eden bu animasyonu düşünün:

resim açıklamasını buraya girin

Her nokta bir birimi temsil eder ve kutular rakamları temsil eder: en sağdaki kutu kişinin yeri, ortadaki kutu 3 ^ 1 ve en soldaki kutu 3 ^ 2 yerdir.

Birinin yerinde 17 nokta ile başlayabiliriz. Ancak, bu temel 3, bu yüzden yer 3 daha az olması gerekir. Bu nedenle, biz 3 nokta "patlayabilir" ve soldaki kutuda bir nokta oluşturun. Bunu, patlayıcı noktaları olmayan (yani aynı kutuda 3 nokta) sabit bir konum elde edene kadar tekrarlıyoruz.

Yani 10 tabanındaki 17, 3 tabanındaki 122'dir.


Kesirli bir baz, bazı noktaların birden fazla noktaya patlatılmasına benzer. Baz 3/2, 2 oluşturmak için 3 noktayı patlatacaktır.

3/2 tabanındaki 17 ifadesi:

resim açıklamasını buraya girin

Yani 10 tabanındaki 17 3/2 tabanındaki 21012'dir.


Negatif bazlar benzer şekilde çalışır, ancak işaretleri takip etmeliyiz (anti-noktalar olarak adlandırılan, -1'e eşit; açık bir daire ile temsil edilir).

-3 tabanındaki 17 ifadesi:

resim açıklamasını buraya girin

Unutmayın, tüm kutuların işaretlerini aynı yapmak için ekstra patlamalar vardır (sıfırları yok sayarak).

Böylece, baz 10'daki 17 baz -3'deki 212'dir.

Negatif rasyonel bazlar, yukarıdaki iki vakanın bir kombinasyonunda benzer şekilde çalışır.

kurallar

  • Standart boşluklar yok.
  • Çıktıdaki her "basamak" ın işareti aynı (veya sıfır) olmalıdır.
  • Tüm basamakların mutlak değeri, tabanın payının mutlak değerinden küçük olmalıdır.
  • Tabanın mutlak değerinin 1'den büyük olduğunu varsayabilirsiniz.
  • Rasyonel bir temelin en düşük indirgenmiş formda olduğunu varsayabilirsiniz.
  • Girişte tabanın paydasını ve paydasını ayrı ayrı alabilirsiniz.
  • Bir sayının birden çok temsili varsa, bunlardan herhangi birini çıktı alabilirsiniz. (örneğin, taban 10'daki 12 {-2, -8}ve {1, 9, 2}tabandaki -10 olabilir)

Test senaryoları:

Biçim: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

Bazı girdilerin birden fazla temsili olabileceğinden, çıktıyı TIO'daki bu Mathematica snippet'ini kullanarak test etmenizi öneririm .

Bu , bu yüzden her dil kazanmak en kısa bayt sayımları ile gönderme!


Patlayan noktalar hakkında daha fazla bilgi için global matematik projesi web sitesini ziyaret edin ! Onlar bir sürü serin mathy şeyler var!


Yanıtlar:


6

Python 2 , 42 39 bayt

n,a,b=input()
while n:print n%a;n=n/a*b

Çevrimiçi deneyin!

Kısa formu bulmak için @xnor'a teşekkürler.

Eski sürüm (42 bayt):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

Çevrimiçi deneyin!

Parametreler: giriş, pay (işaretli) ve payda.

Önce en düşük basamak olan bir dizi döndürür.

Bu sadece işe yarıyor çünkü Python'daki bölünme ve modulo paydanın işaretini takip ediyor, bu yüzden aynı işaretleri açıkça önemsememiz gerekmiyor.

Test senaryosu çıkışı:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]

4
Alışılmadık şekilde, bir program daha kısa görünüyor .
xnor

@xnor Teşekkürler, her zaman bir şeyler yazmayı unuturum ...
Bubbler

4

Aheui (esotop) , 91 bayt

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

Çevrimiçi deneyin!

Alır integer,, numerator of baseve denominator of base.

TIO yorumlayıcısının sınırlandırılması nedeniyle, her girdi bir satırsonu ile bitmelidir.

Uygulanması Bubbler Python 2 cevap @ . Neyse ki, bu Aheui yorumlayıcısı Python'da yazılmıştır, böylece aynı hileyi kullanabiliriz.


4
o_O bu dilde ne var ... D:
HyperNeutrino

3

05AB1E , 11 10 bayt

[D_#²‰`,³*

Çevrimiçi deneyin!

Alır integer, numerator of baseve denominator of basetüm cevaplar gibi. 05AB1E tercümanı Python (?) Dilinde yazıldığı için, Bubbler'in Python 2 cevap numarası 05AB1E'de de kullanılabilir.

açıklama

[D_ # ² ‰ `³ *
[ Sonsuz döngü
 D_ # Sayı 0 ise çıkış döngüsü (örtük girdi
                                         ilk yinelemede)
     ² baz pay almak
      ‰ Divmod
       `Tüm elemanları yığının içine it
        , Kalanı yazdır
         ³ Bazın paydasını alın
          * Çarpın.

Böylece program kabaca bu Python koduyla aynı şekilde çalışır:

i1, i2, i3 = giriş ()
yığın = []
süre 1:
 stack = (yığın veya [i1])
 yığın + = [yığın [-1]]
 yığın değilse [-1]: ara
 yığın + = [i2]
 yığın = yığın [: - 2] + [divmod (yığın [-2], yığın [-1])]
 stack = stack [: - 1] + liste (yığın [-1])
 baskı yığını [-1]
 yığın = yığın [: - 1]
 yığın + = [i3]
 yığın = yığın [: - 2] + [yığın [-2] * yığın [-1]]

11> 10 Teşekkürler Neil


Sanırım burada kullanmak _yerine kullanabilirsiniz 0Q.
Neil

@Neil Ah doğru, negatif boole'yi unuttum!
Shieru Asakoto
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.