En Küçük Zeroless Base


28

Pozitif bir tamsayı Verilen nen küçük taban çıkışı, b >= 2temsili ntabanında bhiçbir lider sıfır ile bir içermiyor 0. b <= 256Tüm girişler için bunu varsayabilirsiniz .

Test Kılıfları

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])

1
Kullandığınız daha yüksek tabanlardaki on, onbir vb. Değerler nelerdir? Sıfır içeriyorlar mı?
Stephen

19
@Stephen Yukarıdaki haneler için seçilen değerler 9önemli değil çünkü öyle değil 0.
Mego


1
@Titus Bu iyi bir nokta. Tabanı makul bir şeyle sınırlayacağım.
Mego

1
@Mego: 232792560'ı deneyin. 2,3, ..., 20'lik lcm'dir, bu nedenle her tabanda <= 20 en az anlamlı basamak olan 0'a sahiptir.
Nate Eldredge

Yanıtlar:


15

Pyth , 6 bayt

f*FjQT

Tüm test durumlarını doğrulayın.

Nasıl çalışır

f * FjQT ~ Tam program.

f ~ Durumun acımasız olduğu ilk pozitif tamsayı.
   jQT ~ Giriş, geçerli öğenin tabanına dönüştürülmüş.
 * F ~ Ürün. Listede 0 varsa, 0 olur, aksi halde kesinlikle olumludur.
          0 -> Falsy; > 0 -> Truthy.
        ~ Sonucu dolaylı olarak çıktılayın.

Pyth'ler devam etse fde 1, 2, 3, 4, ...(1'den başlayarak), Pyth, 1'inci basamağındaki (unary) sayıları bir grup sıfır gibi ele alır, bu nedenle 1 numaralı temel yoksayılır.


Pyth'un temel-1 temsilinin tamamen sıfır olduğu gerçeğinin hoş kullanımı.
Outgolfer Erik,

@EriktheOutgolfer Teşekkürler! Bununla ilgili bir açıklama ekleyeceğim.
Bay Xcoder

Pyth, temsili temsili rakamları ipucu olarak sıfır kullanan tek dil değil : P
Mego

Sen yazdım 0 -> Falsy; > 0 -> Truthy. O kasıtlı mı 0hem Truthyve Falsybu durumda?
Brian J,

@BrianJ Saniyenin >önünde bir işaret var, 0yani 0'dan daha yüksek olan her şey truthy demektir.
Bay Xcoder,

11

C,  5250  bayt

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

Çevrimiçi deneyin!

C (gcc),  47  45 bayt

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

Çevrimiçi deneyin!


@ Nevay'ın @Kevin Cruijssen'in cevabındaki önerisi sayesinde iki bayt kurtarıldı!


2
İkinci versiyon, belirli bir derleyicide ısrar etseniz bile, sadece şans eseri olarak çalışır. Ve, elbette, ikisi de gerçekten C değil
AnT

3
@ ANT C ... çok fazla uyarı verecek, ancak derleyecektir. Kodunuz için uygun bir derleyici bulduğunuz sürece, sorun değil
Felipe Nardi Batista

1
@ Blacksilver k%iburada bir üçlü çek olduğunu. Bir daha okunabilir varyant olacağını k=(k%i?k:n*++i);bile daha net ya: if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen

1
Ayrıca 2 byte kadar golf oynayabilirsiniz: i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}ve i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Tüm kredi, bu öneriyi benim yayınlanan Java 8 cevabımda yazan @Nevay'e gidiyor .
Kevin Cruijssen

1
@Felipe Nardi Batista: CodeGolf kurallarının "derlediği sürece" dediğinin farkındayım. Bununla birlikte, “derlediği” gerçeği, hiçbir şekilde C olduğunu kanıtlamaz. Bu C değildir. C (K&R) eski versiyonlarında olduğu gibi var olan i, k;ve olmayan tipik beyanlar f(n), ancak, yalnızca returnkendi etrafında yuvarlak parantez gerektiğinde , çağda argüman. K & R'yi birlikte kullanmak istiyorsanız, kullanmak i,k;zorundasınız return(i);. Yukarıdakiler gnuc olabilir, ancak C olmayabilir.
AnT

8

Haskell , 56 52 48 bayt

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

Çevrimiçi deneyin!

Oldukça basit ama kısaltmanın iyi bir yolunu düşünemiyorum

EDIT: Beni 4 bayt kurtardığın için Laikoni'ye teşekkürler! Neden hiç düşünmedim bilmiyorum !!0. Herhalde bu parantez çıkarmadan yeterdi ama kullanmaya çalışırken bazı garip hata belirsiz anıları var ||ve &&birlikte. Belki de eşitlik operatörleri ile karıştırıyorum.

2 EDIT: 4 bayt başka bir tıraş için teşekkürler @Lynn! Daha untilönce nasıl hiç bilmediğimi bilmiyorum .


1
Neredeyse aynı çözümü ile beni bir dakika kadar yendi. :) !!0daha kısa headve parantezi bırakabileceğinizi düşünüyorum #.
Laikoni

2
Suçlu underrated until :: (a → Bool) → (a → a) → a → adört bayt kazandırır:f n=until(#n)(+1)2
Lynn


6

Kabuğu , 7 bayt

→V▼MBtN

Çevrimiçi deneyin!

açıklama

→V▼MBtN
     tN    list of natural numbers starting from 2
   MB      convert the (implicit) input to each of those bases
 V▼        find the (1-based) index of the first result where the minimum digit is truthy
→          add 1 to this index

5

Python 2 , 57 bayt

n=x=input()
b=2
while x:z=x%b<1;b+=z;x=[x/b,n][z]
print b

Çevrimiçi deneyin!

Bu özyinelemeli bir işlevden bir bayt daha kısadır:

f=lambda n,b=1,x=1:b*(x<1)or f(n,b+(x%b<1),[x/b,n][x%b<1])

1
Btw bu benim çözüm oldukça benzer.
Outgolfer Erik,



3

Kabuğu , 9 bayt

←foΠ`B⁰tN

Çevrimiçi deneyin!

açıklama

            -- input N
        tN  -- tail of [1..] == [2..]
←f(    )    -- filter with the following:
    `B⁰     --   convert N to that base
   Π        --   product (0 if it contains 0)
←           -- only keep first element

3

Java 8, 61 56 54 bayt

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

Burada dene.

Açıklama:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

Bunun aritmetik bir yaklaşımla golf oynayabileceği hissine sahibim. Gerçekten de, @ Steadybox 'C bağlantı noktası ile cevap verebilir ve sonra @Nevay sayesinde 2 baytlık golf oynadı .

Eski ( 61 bayt ) cevap:

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

Burada dene.

Açıklama:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method

2
54 bayt:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japt , 8 bayt

@ìX e}a2

Çevrimiçi deneyin!

açıklama

@    }a2

XFonksiyonu geçmek için ilk sayıyı ( ) başlayarak döndürün.2

ìX

Giriş numarasını bir dizi Xbasamağa dönüştürün.

e

Tüm rakamların kaba olup olmadığını kontrol edin.


Dizi birden fazla içeriyorsa, bu başarısız olmaz 10mı?
Shaggy

@Shaggy Anladığım kadarıyla OPs yorumuna göre, 9'un üzerindeki tabanların rakamları sıfır sayılmaz.
Justin Mariner

Ah, şimdi anlıyorum. Bu zorluğun ifadesinde bir sorun var, o yüzden (ya da sadece çok yorgunum!).
Shaggy,

2

JavaScript (ES6), 43 41 37 bayt

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

Test durumları



2

Python 2 , 57 bayt

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

Çevrimiçi deneyin!

-1 - Felipe Nardi Batista'ya teşekkürler .
-2 Lynn'e teşekkürler (ve şimdi bu onun çözümünün bir dupe'si: D)


59 byte değiştirerek a,b=a+c,diçina+=c;b=d
Felipe Nardi Batista

Ben değiştirmek düşünüyorum while m>1tarafından while m(ve sonra biz bağlıyız!)
Lynn

@Lynn Bu yüzden çözümünüz hakkında yorum yaptım, o zaman tam olarak aynı olurdu.
Outgolfer Erik


1
@ Lynn, zaten biliyordum: p aksi takdirde sizinkini silmenizi isterdim.
Outgolfer Erik

2

APL (Dyalog) , 20 19 bayt

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

Çevrimiçi deneyin!

Her zamanki gibi, sohbet etmeye yardımcı olduğu ve TIO'da çalışacak kodu aldığınız için @ Adám'a teşekkür ederiz. Ayrıca, 1 byte tasarrufu.

Bu (tradfn edilir Çevirmen itional f unctio n ) gövdeyi. Kullanmak için, bir isim atamanız gerekir (bu, TIO'nun başlık alanındadır), onu s ( içine koymadan önce bir tane ve TIO'nun alt bilgi alanında bir tane) ve ismini kullanarak çağırmanız gerekir. Kullanıcının girişini yapmak için bir quad ( ) kullandığından f \n input, normal yerine denir.f input

Nasıl?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

İşlev daha sonra elde edilen tabanı döndürür.


1
İpucu Golf: beri n←⎕basit bir sayı olabilir ve ihtiyacınız olacak 1kodunun geri kalanı için ilk argüman olarak, sadece öğe sayısını sayabilir ndeğiştirerek, (1) 1⊣ile . Çevrimiçi deneyin!
Adám


1

R , 79 71 66 63 65 bayt

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

Çevrimiçi deneyin!

Bu cevap, Giuseppe'nin tek bir döngüde yeniden düzenlenişine dayanıyor.

JDL sayesinde 8 bayt, Giuseppe sayesinde 6 bayt kaydedildi.


1
Sen alt can biçin Tolarak tanımlanan başlar ki, TRUE == 1ihtiyacını ortadan kaldırarak, b=1. Benzer şekilde alt edebilir Fiçin k( Folan FALSE)
JDL

Orada ne yaptığını gördüm. Bu bilmek yararlı bir!
NofP,

1
66 bayt m%/%Tyerine (tam sayı bölümü)(m-m%%T)/T
Giuseppe

65 bayt . biraz dağınıktı ama iç içe döngülerden kurtulmaktan bir şeyleri koruyacağından şüphelendim ; Sadece 1 bayttan daha fazla olacağını düşündüm :(
Giuseppe

1

Matl , 13 12 bayt

`G@Q_YAA~}@Q

Çevrimiçi deneyin!

Luis Mendo sayesinde -1 bayt. Bu program flintmax, varsayılan veri türü doubleMATL'de olduğu gibi, 2 ^ 53'ten büyük (( kayan nokta tipiyle temsil edilebilen ardışık tam sayı) daha büyük test evrelerini işlemez. Ancak, bu sayının altında herhangi bir keyfi sıfır tabanını bulabilmelidir.

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.

@LuisMendo Gerçekten daha iyi dokümanlar okumaya başlamalıyım. Teşekkürler.
Sanchises

Bu, daha büyük test durumları için işe yaramaz gibi görünüyor, ancak bunun tamsayı limitlerinden kaynaklanıp kaynaklanmadığını bilmek için MATL / Matlab hakkında yeterince bilgim yok.
Mego

@Mego MATL R2017a'da mevcut sürümüne 1e6'ya eşit olması gereken 13 bayt versiyonumu test ettim. Hangi test ayarları sizin için sorunlara yol açtı?
Sanchises

Son 2 test vakası hatalara neden olur.
Mego

@Mego Ah Ben daha önce bu testis görmedim. Bu, YAdahili olarak çiftler kullanan MATL'lerin uygulanmasından kaynaklanmaktadır , bu yüzden sadece bir çift tarafından gösterilebilen maksimum ardışık tamsayıya kadar olan girdileri kaldırabilir (bkz. flintmax). Bu, cevabı geçersiz kılar mı? Prensipte algoritma keyfi bir temel için çalışır, açıkça yalnızca 36 tabanına
dayanacak

0

PHP, 59 + 1 bayt

yerleşikleri kullanarak , maksimum taban 36:

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

yerleşik değil, 63 60 + 1 bayt , herhangi bir temel

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .



0

J, 26 bayt

]>:@]^:(0 e.]#.inv[)^:_ 2:

Bu iyileştirilebilir olup olmadığını bilmek isterim.

Ana fiil bir didik cümledir:

>:@]^:(0 e.]#.inv[)^:_

solda girdi ve sağda sabit 2 verilir. Bu ana fiil cümlesi daha sonra J'nin Do'yu kullanır.e. tabanındaki argümanının .

Çevrimiçi deneyin!



0

Samanyolu , 38 bayt

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

kullanımı: ./mw base.mwg -i 3


açıklama

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

Bunun bir for döngüsü yerine while döngüsü kullanılarak kısaltılabileceğinden eminim, ancak işe yaramadı.



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.