En Düşük Bazlı Palindrom


16

Bir sayı verildiğinde n, tabandaki bir palindrom b ≥ 2gibi en küçük tabanı bulan bir işlev yazın . Örneğin, 28'in üçlü temsili 1001 olduğundan bir girdi tabana dönmelidir . Hem taban 2 hem de taban 5'te bir palindrom olmasına rağmen , çıktı 2 <5'ten beri olmalıdır .nb283932

Giriş

Pozitif bir tamsayı n < 2^31.

Çıktı

b ≥ 2Taban btemsili nbir palindrom olacak şekilde en küçük tabanı döndürün. Başında sıfır varsayalım.

Örnekler (giriş => çıkış):

11 => 10

32 => 7

59 => 4

111 => 6

kurallar

En kısa kod kazanır.


1
Bence taban sınırlı olmalı.
Snack

3
@ Snack: Yüksek bazlarda sorun nedir? Sembol seçiminden bağımsız olarak, bir taban 1000 numarası ya bir palindrom olacaktır ya da olmayacaktır.
Dennis

3
N-1 bazındaki ilginç fıkra: n> = 2 için her zaman 11'dir ve bu nedenle bir palindrom her zaman mümkündür.
Cruncher

1
@Cruncher: n1 olabilir ve 2 temel 1 palindrom değildir. Bununla birlikte, her pozitif nbir temel n + 1palindromdur.
Dennis

1
@Dennis Nasıl bir temel 1 palindrom değildir? 11. ya da II ya da kullandığınız her hangi bir sembolden 2'si. Aslında tüm temel 1 numaraları palindromlardır. Ve n> = 2 dedim, çünkü 0 dünya üssünde ne olacağını bilmiyorum.
Cruncher

Yanıtlar:


4

CJam , 19 bayt / GolfScript, 23 bayt

q~:N;1{)_N\b_W%=!}g

veya

~:N;1{).N\base.-1%=!}do

Çevrimiçi deneyin:

Örnekler

$ cjam base.cjam <<< 11; echo
10
$ cjam base.cjam <<< 111; echo
6
$ golfscript base.gs <<< 11
10
$ golfscript base.gs <<< 111
6

Nasıl çalışır

q~:N;   # Read the entire input, interpret it and save the result in “N”.
1       # Push 1 (“b”).
{       #
  )     # Increment “b”.
  _N\   # Duplicate “b”, push “N” and swap.
  b     # Push the array of digits of “N” in base “b”.
  _W%   # Duplicate the array and reverse it.
  =!    # Compare the arrays.
}g      # If they're not equal, repeat the loop.

GolfScript için, q~is ~, _is ., bis base, Wis -1ve gis do.


6

GolfScript, 20 karakter

~:x,2>{x\base.-1%=}?

Dışındaki GolfScript ile farklı bir yaklaşım Dennis '. Bir lehine masraflı açık döngü önler bulmak operatörü. Çevrimiçi deneyin .

~:x        # interpret and save input to variable x
,2>        # make a candidate list 2 ... x-1 (note x-1 is the maximum possible base)
{          # {}? find the item on which the code block yields true
  x\       # push x under the item under investigation
  base     # perform a base conversion
  .-1%     # make a copy and reverse it
  =        # compare reversed copy and original array
}?         

1
Zeki! Ancak, bu x = 1ya da çalışmaz x = 2. Her ikisi de tek basamaklı, baz x + 1palindromlardır, bu yüzden x))düzeltmelidir.
Dennis

4

Mathematica, 67 66 bayt

g[n_]:=For[i=1,1>0,If[(d=n~IntegerDigits~++i)==Reverse@d,Break@i]]

Burada kod boyutu açısından GolfScript ile gerçekten rekabet edemezsiniz, ancak 2 32 için sonuç temel olarak anında döndürülür.


Güzel. İşlevin isimlendirilmesi gerekmez, değil mi? Adsız bir işlev kullanabilir misiniz?
numbermaniac

(Ayrıca, PalindromeQters kontrol için de kullanılabilir mi?)
numbermaniac

4

Japt , 12 9 bayt

Bir numarayı kaçırmadıkça (geç!), Bu en azından dahil olmak üzere tüm sayılar için çalışmalıdır 2**53-1.

(Kuşkusuz sınırlı ve tamamen rastgele) testlerimde, şimdiye kadar taban (!) 'A kadar sonuç aldım . JavaScript yalnızca doğal bazları destekleyen göz önüne aldığımızda çok perişan Değil için .11601 310,515236

@ìX êê}a2

Dene

  • ETH sayesinde 3 bayt tasarruf sağlayan ve verimliliği önemli ölçüde artıran yeni bir şey işaret etti.

açıklama

Örtük tamsayı girişi U.

@     }a2

İle başlayarak 2, aşağıdaki fonksiyondan geçtiğinde doğru olan ilk sayıyı Xgeçerli sayı olacak şekilde döndür

ìX

UTemel Xbasamak dizisine dönüştürün .

êê

Bu dizinin bir palindrom olup olmadığını test edin.


1) Evet. O topları için bira suçlayın! : D 2) Güzel; N.ì(n)daha büyük üsleri kaldıramayacağını hiç bilmiyordum 36. Bunun için teşekkürler.
Shaggy

Evet, taban-36 alfabesi, N.ì(n)ham tamsayılar kullandığımız için önemli değil ;-)
ETHproductions

2

Python 2 (83)

def f(n,b=2):
 l=[];m=n
 while m:l+=[m%b];m//=b
 return l==l[::-1]and b or f(n,b+1)

Sorunun hangi girdi / çıktı biçimini istediğinden emin değilim. Bir fonksiyon yazdım. Kod, btest ettiği mevcut tabanı izlemek için isteğe bağlı bir giriş kullanır . whileDöngüler tabanında basamaklı bir listesine numara çevirir b.

Son satır bir palindrom bise geri döner lve ardışık olarak bir sonrakini dener b. Boole endeksine göre hile burada işe yaramaz çünkü Boole'den bağımsız olarak her iki seçeneğin de değerlendirilmesine neden olur ve özyineleme asla dibe vurmaz.


1
Yani bu keyfi yüksek tabanlarla çalışmaz, değil mi? Bir sayının palindromu olan en düşük taban 10000 gibi ise, yığın taşması olur mu?
Cruncher

@Cruncher Python'un uygulanmasına bağlıdır. CPython ile çalıştırıldığında taşacak, ancak kuyruk çağrısı optimizasyonunu yapan ve dolayısıyla özyineleme sınırı olmayan Stackless Python ile değil (aslında test etmedim).
xnor

2

JavaScript, 88 bayt

f=function(n){for(a=b='+1';a^a.split('').reverse().join('');a=n.toString(++b));return+b}

Ungolfed:

f = function(n) {
    for(a = b = '+1'; // This is not palindrome, but equals 1 so we have at least one iteration
        a ^ a.split('').reverse().join(''); // test a is palindrome
        a = n.toString(++b));
    return+b
}

1

Javascript, 105 bayt

function f(n){for(var b=2,c,d;d=[];++b){for(c=n;c;c=c/b^0)d.push(c%b);if(d.join()==d.reverse())return b}}

JSFiddle: http://jsfiddle.net/wR4Wf/1/

Bu uygulamanın büyük üsler için de düzgün çalıştığını unutmayın. Örneğin, f(10014)1668 değerini döndürür (10014, temel 1668'de 66'dır).


Bu güzel. Hatta s/var b=2,c,d/b=d=2/6 bayt daha kazanabilirsiniz;)
core1024

1

Bash + coreutils, 100 bayt

for((b=1;b++<=$1;)){
p=`dc<<<${b}o$1p`
c=tac
((b<17))&&c=rev
[ "$p" = "`$c<<<$p`" ]&&echo $b&&exit
}

dcTemel biçimlendirme yapmak için kullanır . Zor olanın dcbiçimi n> 16 için farklıdır.

testcases:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 

1

J - 28 karakter

#.inv~(-.@-:|.@)(1+]^:)^:_&2

Açıklaması:

  • #.inv~ - Sol argümanı sağ argümandaki tabana genişletin.

  • (-.@-:|.@) - Genleşme palindromikse 0, aksi takdirde 1 döndürün.

  • (1+]^:) - 1 döndürürsek doğru argümanı birer birer artırın, başka bir şey yapmayın.

  • ^:_ - İşlem yapılmayana kadar yukarıdaki artışı tekrarlayın.

  • &2 - Doğru argümanı 2 olarak hazırlayın, bunu bir argümanın fonksiyonu haline getirin.

Örnekler:

   #.inv~(-.@-:|.@)(1+]^:)^:_&2 (28)
3
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 93 11 32 59 111  NB. perform on every item
2 10 7 4 6
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 1234 2345 3456 4567 5678 6789
22 16 11 21 31 92

2+1 i.~[#.inv"*(-:|.@)~2+i.27 bayt için. (Ayrı olarak göndermek istemiyorum. Ben sadece burada bırakacağım.)
randomra

@randomra 29 olarak sayılır çünkü trenlerin satır içi kullanımı için parenlere ihtiyacı vardır; benimki bir karakteri en üst seviyede bir kavşakla kaydeder.
algorithmmshark

Çoğunluğun puanlama konusundaki duruşu, isimsiz bir fonksiyonla daha az sayımdır, ancak bu konuda her zaman bir tartışma vardır. Her neyse, onu burada bırakacağım ve herkes onu nasıl puanlayacağını seçebilir. :)
randomra

1

R, 122 95 bayt

function(n)(2:n)[sapply(2:n,function(x){r={};while(n){r=c(n%%x,r);n=n%/%x};all(r==rev(r))})][1]

122 baytta üç yıllık çözüm:

f=function(n)(2:n)[sapply(sapply(2:n,function(x){r=NULL;while(n){r=c(n%%x,r);n=n%/%x};r}),function(x)all(x==rev(x)))][1]

Bazı açıklamalarla:

f=function(n)(2:n)[sapply(
                    sapply(2:n,function(x){ #Return the decomposition of n in bases 2 to n
                                 r=NULL
                                 while(n){
                                     r=c(n%%x,r)
                                     n=n%/%x}
                                     r
                                     }
                           ),
                    function(x)all(x==rev(x))) #Check if palindrome
                   ][1] #Return the first (i. e. smallest) for which it is

1

Kabuk , 11 9 bayt

ḟoS=↔`B⁰2

-2 için @Zgarb teşekkürler!

Çevrimiçi deneyin!

açıklama

ḟ(      )2  -- find least number ≥ 2 that satisfies:
     `B⁰    --   convert input to base (` flips arguments)
  S=↔       --   is palindrome (x == ↔x)

0

Not: Pyth bu sorudan daha yenidir, bu nedenle bu cevap kazanmak için uygun değildir.

Pyth, 10 bayt

fq_jQTjQT2

Burada deneyin.


0

Scala, 83 bayt

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min



0

JavaScript 72 bayt

F=(n,b=2)=>eval(`for(t=n,a=c="";t;t=t/b|0)a=t%b+a,c+=t%b`)^a?F(n,b+1):b

console.log(F(11) == 10)

console.log(F(32) == 7)

console.log(F(59) == 4)

console.log(F(111) == 6)


0

Mathematica 42 bayt

Martin Ender'in girişinin bir çeşidi. IntegerReverseDağıtım yapan (sürüm 10.3'te kullanıma sunulan) ürününü kullanır IntegerDigits.

(i=2;While[#~IntegerReverse~i !=#,i++];i)&

0

Java 8, 103 bayt

n->{int b=1,l;for(String s;!(s=n.toString(n,++b)).equals(new StringBuffer(s).reverse()+""););return b;}

Açıklama:

Burada deneyin.

n->{                          // Method with integer as both parameter and return-type
  int b=1,                    //  Base-integer, starting at 1
      l;                      //  Length temp integer
  for(String s;               //  Temp String
      !(s=n.toString(n,++b))  //   Set the String to `n` in base `b+1`
                              //   (by first increase `b` by 1 using `++b`)
       .equals(new StringBuffer(s).reverse()+"");
                              //   And continue looping as long as it's not a palindrome
  );                          //  End of loop
  return b;                   //  Return the resulting base integer
}                             // End of method
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.