Büyük taban, küçük rakamlar


19

J dili sabitleri belirtmek için çok aptalca bir sözdizimine sahiptir . Özellikle harika bir özelliğe odaklanmak istiyorum: keyfi olarak yazma yeteneği.

Eğer yazarsanız XbYiçin Xherhangi bir sayı ve Yalphanumerics herhangi bir dize, ardından J yorumlayacak Ybir üs olarak Xdizi 0boyunca 9her zamanki anlamı vardır ve aiçinden z35'e kadar 10 temsil eder.

Ben dediğimde Xherhangi bir sayıda, yani herhangi bir sayı. Bu sorunun amaçları için, Xpozitif bir tam sayı olmayı kısıtlayacağım , ancak J'de her şeyi kullanabilirsiniz: negatif sayılar, kesirler, karmaşık sayılar, her neyse.

Tuhaf olan şey, 0'dan 35'e kadar olan rakamları, basamağınız ne olursa olsun, tabanınız olarak kullanabilmenizdir , çünkü kullanılabilir semboller koleksiyonunuz yalnızca 0-9 ve az'dan oluşur .

Sorun

Bu yöntemi kullanarak 2,933,774,030,998 gibi sihirli sayıları golf etmeme yardımcı olacak bir program istiyorum . Pekala, tamam, belki de o kadar büyük değil, sana kolay geleceğim. Yani...

Görev, bir (genellikle büyük) ondalık sayı alan bir program ya da fonksiyonu yazmak için N1 ile 4,294,967,295 (= 2 arasında 32 formunun kısa temsil girdi olarak 1) ve çıkış / döner XbY, Xpozitif bir tam sayı olduğu Ybir alfasayısallardan (0-9 ve az, büyük / küçük harfe duyarsız) oluşan ve Ytaban Xeşitliğinde yorumlanan bir dize N.

Her gösterim XbYtemsilinin uzunluğu, rakam sayısından büyük veya ona eşitse N, Nbunun yerine çıktı alın . Diğer tüm bağlarda, en kısa gösterimlerin boş olmayan alt kümelerini çıkarabilirsiniz.

Bu kod golf, bu yüzden daha kısa daha iyidir.

Test senaryoları

      Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
          5 | 5
            |
   10000000 | 79bkmom  82bibhi  85bgo75  99bauua  577buld
            | 620bq9k  999baka
            |
   10000030 | 85bgo7z
            |
   10000031 | 10000031
            |
   12345678 | 76bs9va  79bp3cw  82bmw54  86bjzky  641buui
            |
   34307000 | 99bzzzz
            |
   34307001 | 34307001
            |
 1557626714 | 84bvo07e  87brgzpt  99bglush  420blaze
            |
 1892332260 | 35bzzzzzz  36bvan8x0  37brapre5  38bnxkbfe  40bij7rqk
            | 41bgdrm7f  42bek5su0  45bablf30  49b6ycriz  56b3onmfs
            | 57b38f9gx  62b244244  69b1expkf  71b13xbj3
            |
 2147483647 | 36bzik0zj  38br3y91l  39bnvabca  42bgi5of1  48b8kq3qv
 (= 2^31-1) | 53b578t6k  63b2akka1  1022b2cof  1023b2661  10922bio7
            | 16382b8wv  16383b8g7  32764b2gv  32765b2ch  32766b287
            | 32767b241
            |
 2147483648 | 512bg000  8192bw00
            |
 4294967295 | 45bnchvmu  60b5vo6sf  71b2r1708  84b12mxf3  112brx8iv
 (= 2^32-1) | 126bh5aa3  254b18owf  255b14640  1023b4cc3  13107bpa0
            | 16383bgwf  21844b9of  21845b960  32765b4oz  32766b4gf
            | 32767b483  65530b1cz  65531b1ao  65532b18f  65533b168
            | 65534b143  65535b120

Bazı temsillerin bir sayıya eşit olup olmadığından emin değilseniz, Çevrimiçi Deneyin'deki gibi herhangi bir J yorumlayıcısını kullanabilirsiniz . Sadece yazın stdout 0":87brgzptve J geri tükürecektir 1557626714. Bu sorun büyük / küçük harfe duyarlı olmasa da, J'nin yalnızca küçük harf kabul ettiğini unutmayın.

Bazı yararlı teoriler

  • N10.000.000'dan az olan herkes için , ondalık gösterim diğeri kadar kısadır ve bu nedenle kabul edilebilir tek çıktıdır. Herhangi bir şeyi kaydetmek için, yeni tabanda en az dört basamak daha kısa ve taban 99'dan büyükse daha da fazla olması gerekir.
  • Kare kök tavana kadar üsleri kontrol etmek için yeterlidir N. Daha büyük herhangi bir baz için B , Nbaz içinde en fazla iki basamaklı olacak B Geçerli bir ilk rakam ile bir şey çıkacak ilk kez bu kadar etrafında yer almaktadır, BN/ 35. Ancak bu boyutta her zaman en az ondalık gösterim kadar büyük olacaksınız, bu yüzden denemenin bir anlamı yok. Bunu göz önünde bulundurarak, tavan (sqrt (bu sorunu çözmenizi isteyeceğim en büyük sayı)) = 65536.
  • Bir bazda 36'dan daha az bir temsilciliğiniz varsa, temel 36 temsili en azından kısa olacaktır. Bu nedenle, 36'dan daha düşük bazlardaki kazara kısa çözümler konusunda endişelenmenize gerek yoktur. Örneğin, 35bzzzzzz1.892.332.260'ın temsili , bu taban için alışılmadık bir basamak kullanır, ancak 36bvan8x0aynı uzunluğa sahiptir.

Lol, 1557626714 = 420 alev = _ ^
DrQuarius

Yanıtlar:


9

JavaScript (ES6), 103 101 bayt

Girişi dize olarak alır.

n=>[...Array(7e4)].reduce(p=>p[(r=++b+(g=x=>x?g(x/b|0)+(x%b).toString(36):'b')(n)).length]?r:p,n,b=2)

Test senaryoları

Not: Snippet işlevindeki yineleme sayısı 600 ile sınırlıdır, böylece test senaryoları daha hızlı tamamlanır. (Aksi takdirde birkaç saniye sürer.)


Numaram bununla çalışmak için çok büyükse, nasıl düzeltebilirim? Yinelemeleri artırmak yardımcı görünmüyor.
FrownyFrog

N-<232

"Pernicious numbers" arama, 2136894800297704.
FrownyFrog

@FrownyFrog Yineleme sayısını artırarak veMath.floor(x/b) yerine kullanarak işleyebilirsiniz x/b|0. (Ama ben test etmedim.)
Arnauld

1
işe yaradı! Teşekkür ederim.
FrownyFrog

3

Ruby , 118 bayt

Bu başka bir soru ile bağlantılıydı ve burada çok fazla cevap olmadığını fark ettim, bu yüzden denemeye karar verdim.

Yürümek , bütün bazların ve tüm geçerli J numarası yapılar oluşturmak için giriş dahil olmak üzere. Yine de 1-8 arasında atlıyor, çünkü bunların yine de taban-10 temsilinden daha kısa olmasının bir yolu yok. Oldukça naif bir çözümdür, her şeyi dikkate alır, çünkü digitsrakamları almak için yerleşik'i çağırır , ancak bu ilk önce en az önemli basamakla başladığından beri reverse, gerçek sayıyı elde etmek için buna ihtiyacımız vardır, bu yüzden muhtemelen geliştirilebilir.

Yavaş. Soooooo inanılmaz derecede yavaş. Örneğin TIO, 34307000'de zaman aşımına uğradı. Biz olabilir karekökü ile gitmek hatta ait Arnauld Seçimi 7e4zaman kazanmak için, ama bu ücreti ilave bayt, neden rahatsız?

->n{([n.to_s]+(9..n).map{|b|d=n.digits b;"#{b}b"+d.reverse.map{|i|i.to_s 36}*''if d.all?{|i|i<36}}-[p]).min_by &:size}

Çevrimiçi deneyin!

Çevrimiçi olarak deneyin, böylece her şey zamanında biter


1

05AB1E , 37 bayt

[¼35ݾãvtîEyNβQižhA«yèJ'bìNìDgIg@i\}q

Teoride çalışmalı, ancak önemsiz olmayan tüm test durumları için zaman aşımına uğrar 10000000. Kartezyen ürün yerleşimi ãson derece yavaştır4..

Son if ifadesi olmadan, DgIg@i\}gerçekten işe yaradığını doğrulamak için daha düşük değerler için test edilebilir: Çevrimiçi olarak deneyin.

Daha sonra (muhtemelen çok daha uzun ama) daha verimli bir çözüm bulabilir miyim göreceksiniz.

Açıklama:

[              # Start an infinite loop:
 ¼             #  Increase the counter variable by 1 (0 by default)
 35Ý           #  Push a list in the range [0, 35]
 ¾ã            #  Take the cartesian product of this list with itself,
               #  with chunks-sizes equal to the counter variable
 v             #  Loop `y` over each of these lists:
  t            #   Take the square-root of the (implicit) input-integer
   î           #   Ceil it
  E            #   Loop `N` in the range [1, ceil(square(input))]:
   yNβ         #    Convert list `y` to base-`N`
   Qi          #    If it's equal to the (implicit) input-integer:
     žh        #     Push string "0123456789"
       A«      #     Append the lowercase alphabet
     yè        #     Index each value in list `y` into this string
     J         #     Join the characters to a single string
     'bì      '#     Prepend a "b"
        Nì     #     Prepend the number `N`
     D         #     Duplicate it
      g        #     And pop and push the length of this string
       Ig      #     Also push the length of the input
         @i }  #     If the length of the string is >= the input-length:
           \   #      Discard the duplicated string
     q         #     Stop the program
               #     (after which the result is output implicitly;
               #      or if the string was discarded and the stack is empty, it will
               #      implicitly output the implicit input as result instead)

1
Etkileyici cevap! Yine de bir kuralı kaçırdığınızı düşünüyorum: "Her gösterim XbYtemsilinin uzunluğu rakam sayısından büyük veya ona eşitse N, Nbunun yerine çıktı alın ." İlk 10 milyon numarayı kapsarken, bir girdinin 10000031benzer bir şey vereceğinden şüpheleniyorum 26blmoof. Sayı geçerlidir, ancak uzunluk girişle aynıdır, bu nedenle bunun yerine girişi döndürmesi gerekir.
Değer Mürekkep

@ValueInk Ah ayy. Fark ettiğiniz için teşekkürler! Şimdi birkaç bayt pahasına düzeltilmelidir.
Kevin Cruijssen
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.