Repdigit Tabanı Bulma


21

Bir repdigit aynı rakam tekrarlanarak sadece yazılabilir doğal bir sayıdır. Örneğin 777, bir repdigit, çünkü yalnızca 7üç kez tekrarlanan rakamdan oluşuyor .

Bununla birlikte, bu sadece ondalık sayı (10 taban) ile sınırlı değildir, ancak:

  • (Formun her Mersenne sayısı M n = 2 , n -1 ) ikili (taban 2) yazılmış bir repdigit olup.
  • Her sayı, unary (un1) basamağında, trivally bir repdigit'tir.
  • Her sayı nda trivially repdigit olarak yazılabilir 11tabanında n-1(örneğin, 17onaltılı (baz 16) yazılmış zaman olan 11ve 3ikili olarak (2 tabanlı) yazıldığında da 11).

Buradaki zorluk , giriş sayısının repdigit olabileceği başka üsler bulmaktır.

Giriş

x > 3Herhangi bir uygun formatta pozitif bir tamsayı .

Çıktı

Pozitif bir tam sayı bile (x-1) > b > 1temsil burada xbaz bbir repdigit olup.

  • Eğer böyle bir şey byoksa, çıktı 0veya bir miktar falsey değeri.
  • Eğer böyle bir çoklu bvarsa, bunların herhangi birini veya tümünü çıkarabilirsiniz.

kurallar

  • (x-1) > b > 1Kısıtlama tekli önemsiz dönüşüm ya da "çıkarma bir" temel önlemektir. Çıkış numarası tekli ya da herhangi bir uygun baz yazılabilir, ancak baz kendisi önemsiz dönüşümlerin biri olmamalıdır.
  • Giriş / çıkış, uygun herhangi bir yöntemle yapılabilir .
  • Standart boşluk deliği kısıtlamaları uygulanır.

Örnekler

In --> Out
11 --> 0            (or other falsey value)
23 --> 0            (or other falsey value)
55 --> 10           (since 55 is 55 in base 10)
90 --> 14           (since 90 is 66 in base 14 ... 17, 29, 44 also allowed)
91 --> 9            (since 91 is 111 in base 9 ... 12 also allowed)

Varsayalım b ≤ 36(birçok dilin yerleşik temel dönüştürme işlevi daha da artmaz)?
Doorknob

2
@Doorknob Bu sorunun kapsamını b ≤ 36 ciddi şekilde sınırladığını varsaymak ve mevcut tüm cevapların daha büyük tabanları doğru bir şekilde işlediğini kabul etmek b;
AdmBorkBork

Sayıların çoğu bazı temellerde repdigittir. Örneğin, 91 = 13 * 7, bu yüzden üs 12'de 77.
Neil

@Neil ... Neredeyse bişeyler yapıyor gibisin, orda ...
AdmBorkBork

Yanıtlar:


11

Jöle, 11 9 bayt

bRI¬P€TḊṖ

Hiçbiri yoksa boş (sahte) olan bir taban listesi döndürür. Çevrimiçi deneyin!

Nasıl çalışır

bRI¬P€TḊṖ  Main link. Argument: x (number)

 R         Range; yield [1, ..., x].
b          Base; convert x to base n, for each n in the range.
  I        Compute the increment (differences of successive values) of each array
           of base-n digits. This yields only 0's for a repdigit.
   ¬       Apply logical NOT to each increment.
    P€     Compute the product of all lists of increments.
      T    Get the indices of all truthy products.
       Ḋ   Discard the first index (1).
        Ṗ  Discard the last index (x - 1).

9

Pyth, 11 10

fqjQT)r2tQ

Görünüşe göre Pyth unary q, yaklaşık 10 gün önce tüm benzersiz değerlere sahip bir liste olup olmadığını kontrol ediyor. Anlaşılan Pyth hatalarını araştırmak golf puanlarını arttırıyor.

[2..input-1)O tabandaki girişin benzersiz rakam dizisinin uzunluğu 1 ise listeyi filtreler .

Test odası

Açıklama:

r2tQ     ##  generate the python range from 2 to the input (Q) - 1
         ##  python range meaning inclusive lower and exclusive upper bounds
f        ##  filter that list with lambda T:
  jQT    ##  convert the input to base T
 q    )  ##  true if the resulting list digits has all equal elements

5

Ruby, 87 69 63 bayt

->x{(2..x-2).find{|b|y=x;a=y%b;a=0if a!=y%b while(y/=b)>0;a>0}}

Baz dönüşümünü elle yapmak zorunda kaldım, çünkü Ruby'nin yerleşikleri yalnızca üsse kadar yükseldi ...

İade nilbulunamadı için.

->x{      # anonymous lambda that takes one argument
(2..x-2)  # range of the possible bases to search over
.find{    # return the first element that satisfies the block, or nil if none
|b|       # b represents the base currently being tested
y=x;      # a temporary value to avoid mutating the original value of x
a=y%b;    # the first (well, last) digit in base b, which will be compared to

                   y/=b      # divide the number by the base
   if a!=y%b                 # if this digit does not match (is different)...
a=0                          # set a to a value representing "failure"
             while(    )>0;  # keep doing this until we get zero (no digits left)

a>0       # return whether a has maintained its original value (no digit change)
}}        # find then returns the first element for which this is true (or nil)

5

Python, 71 72 78 bayt

lambda x:{b for b in range(2,x-1)for d in range(x)if x*~-b==x%b*~-b**d}

Özyineleme yok, sadece tüm temelleri deniyor ve işe yarayanları çıkarıyor.

Bu kodlamak için cazip gelebilir bve dtek sayıda, ancak bunları ayıklamak için çok fazla parantez ifadeler alır. 77 bayt:

lambda x:{k/x for k in range(2*x,x*x-x))if x*~-(k/x)==x%(k/x)*~-(k/x)**(k%x)}

72 bayt:

f=lambda x,b=2:b*any(x*~-b==x%b*~-b**d for d in range(x))or f(x,b+1)%~-x

İşe yarayan ilk bya 0da hiçbiri yoksa çıktılar .

Bir temsilcisi birimi xarasında dbasamak ctabanında bbir değere sahiptir x==c*(b**d-1)/(b-1). Eşdeğerde x*(b-1)==c*(b**d-1).

Değer colmalıdır x%b, son basamak. dAritmetik olarak belirlemek için bir yol göremiyorum , bu yüzden kod bunlardan herhangi birinin çalışıp çalışmadığını görmek için tüm olasılıkları deniyor.

Dennis'in çıktı modülünü alarak bulaştığında yanlış bir çıktı verme hilesini kopyalayarak 5 bayt x-1kurtardı x-1. Dennis'ten kurtarılan başka bir bayt, üstelleştirmenin açıklanamaz bir şekilde daha yüksek önceliğe sahip olduğunu hatırlattı ~.

Bunun inyerine eşit uzunlukta bir çözüm any.

f=lambda x,b=2:b*(x*~-b in[x%b*~-b**d for d in range(x)])or f(x,b+1)%~-x

4

Ruby, 50 bayt

->n{(2..n-2).find{|b,i=n|i%b==(i/=b)%b ?redo:i<1}}

Gerçekten bu sinir bozucu alanı kaldırmak isterdim ama yakut olmaya yeni başlayan biri olarak, sözdizimsel tuhaflıklarına hâlâ aşina değilim.


Bu durumda rahatsız edici tuhaflık b?geçerli bir yöntem adı olacaktır, bu nedenle alandan kurtulmanız mümkün değildir.
Ürdün

4

Emojicode , 214 bayt

(77 karakter):

🐇🐹🍇🐇🐖🏁➡🚂🍇🍦b🍺🔲🗞🔷🔡😯🔤🔤🚂🍮i 2🍮n 0🔁◀i➖b 1🍇🍦v🔷🔡🚂b i🍊▶🐔🔫v🔪v 0 1📏v🍇🍮n i🍉🍫i🍉😀🔷🔡🚂n 9🍎0🍉🍉

9 tabanındaki sonuçları yazdırır.

Birkaç haftadan beri emojicode ile bir golf kodu yapmak istedim, ancak dil henüz son zamanlarda 😉 ile çalışacak kadar kararlı hale geldi. Bir bonus olarak, bu soru bir işlevsellikten yararlanıyor emojicode aslında gerçekten iyidir: tamsayıları diğer temellerde temsil etmek.

Ungolfed (👴 emojicode içinde bir satır yorumu)

🐇🐹🍇         👴 define main class "🐹"
  🐇🐖🏁➡🚂🍇  👴 define main method

    👴 read an integer from stdin, store it in frozen variable "b"
    🍦 b 🍺 🔲 🗞 🔷🔡😯🔤🔤 🚂

    🍮 i 2  👴 i = 2
    🍮 n 0  👴 n = 0

    🔁◀i➖b 1🍇     👴 while i < b - 1
      🍦 v 🔷🔡🚂b i  👴 v = the string representation of b in base i

      👴 Split v on every instance of the first character of v.
      👴 If the length of that list is greater than the actual length of v,
      👴 n = i
      🍊▶🐔🔫v🔪v 0 1📏v🍇
        🍮 n i
      🍉

      🍫 i  👴 increment i
    🍉
    😀 🔷🔡🚂 n 9  👴 represent n in base 9 instead of 10, to save a byte 😜
    🍎 0          👴 return error code 0
  🍉
🍉

4

Python 2,79 bayt

f=lambda x,b=2:~-b*x in[i%b*~-b**(i/b)for i in range(b*x)]and b or f(x,-~b)%~-x

Üzerinde Deneyin Ideone .

Fikir

Herhangi bir repdigit x baz b> 1 ve basamak d <b biri aşağıdaki.

şart

Bu yana , d <b , harita (b, d) ↦ cb + d birebirdir.

Ayrıca, b, x> 1 olduğundan , c <x , yani cb + d <cb + b = (c + 1) b ≤ xb olur .

Bu, belirli bir b tabanı için c ve d için uygun değerleri bulmak için , [ i ,…, bx) ' deki tüm i' yi tekrarlayabilir ve (b - 1) x == (i% b) (b) olup olmadığını kontrol edebiliriz. i / b - 1) .

kod

Adlandırılmış lambda f testi (b - 1) x'in sette olup olmadığını test eder {(i% b) (b i / b - 1) | 0 ≤ i <bx} , b = 2 ile başlar .

  • Test başarılı olursa b .

  • Aksi takdirde, yine f diyoruz , aynı x ve b 1 ile arttırılıyor .

Yana b sonunda ulaşabilir x - 1 , biz nihai sonucu modülo almak 1 - x dönmek için 0 , bu durumda. B = 2 , durumu tekrarlarsa geri gönderildiği için şartı yerine getirirse bunun olmayacağını unutmayın. Ancak, soru bu durumda b = 2 <x - 1 olduğunu garanti eder .


3

Perl 6, 45 43 42 bayt

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}

Açıklanan (çeşit)

Referans olarak, bir değişken $^xolarak { ... }durumu ile aynıdır-> $x { ... }

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}
{                                          # Anonymous function taking $x
 grep                                      # Return the all values in
      2..$^x-2: {                          # Range from 2 to $x - 2 satisfying:
                 [==]                      #     Reduce with ==:
                      $x.polymod(          #         (See below for polymod)
                                 $_ xx*    #         An infinite list containing
                                           #         the current value
                                       )}}

Polymod (TL; DR): $n.polymod($b xx *)size $ntabandaki basamakların / 'basamakların' ters bir listesini verir$b

Polimod (Gerçek): Polimod yöntemi neredeyse piton divmodfonksiyonunun daha güçlü bir versiyonuna benzer . $n.polymod(*@args)$ n'yi * @ args öğesindeki her değere böler, kalanı ( $n mod $x) döndürdüğü listeye ekler ve bir sonraki bölüm için bölümü kullanır. Bunu kötü bir şekilde açıkladığımı hissediyorum, bu yüzden işte bazı örnekler (perl 6 ile yazılmıştır, ancak çoğu umarım tarafından anlaşılacak kadar temiz):

12.polymod(7)    # returns (5, 1)
# Roughly equivalent to:
(12 mod 7, 12 div 7)

86400.polymod(60,60,24) # returns (0, 0, 0, 1)
# Roughly equivalent to (this will give you an array rather than a list):
my $n = 86400;
my @remainders; # Here lies the end result
for (60, 60, 24) -> $divisor {
    @remainders.push( $n mod $divisor );
    $n div= $divisor;
}
@remainders.push($n)

# This is essentially the base conversion algorithm everyone
# knows and loves rolled into a method.
# Given an infinite list of divisors, polymod keeps going until
# the remainder given is 0.     
0xDEADBEEF.polymod(16 xx *) # returns (15 14 14 11 13 10 14 13)
# Roughly equivalent to (but gives an array rather than a list):
my $n = 0xDEADBEEF;
my @remainders; # Here lies the end result
while $n > 0 {
    @remainders.push( $n mod 16 );
    $n div= 16;
}

1
Aslında geçerli değerlerin " herhangi birini veya tümünü " vermenize izin verildiğinden , grepyöntem yerine firstyöntemi kullanabilirsiniz.
Brad Gilbert

Oh iyi yakalamak, bunu özledim
Hotkeys

3

Dyalog APL , 28 bayt

 {b/⍨⍵{1=≢∪⍵⊥⍣¯1⊢⍺}¨b←1+⍳⍵-3}

{... ... }anonim işlev uygulanacak x(ile temsil edilen )
b←1+⍳⍵-3, 2 den tamsayı - ⍵-2 olarak saklanır b
⍵{... b (her bir eleman için ) fonksiyonu uygulamak {... }sol bağımsız değişken olarak x
⍵⊥⍣¯1⊢⍺bu temel dönüştürmek x
1=≢∪hesabıyla 1 eşittir benzersiz rakam
b/⍨b 'nin elementleri doğrudur (sadece bir benzersiz rakam vardır).

Örnek vakalar

Taban yoksa, bu program tarafından gösterilebileceği gibi çıktı boştur (falsey'dir):

 WhatIsEmpty
 →''/TRUE ⍝ goto (→) TRUE: if (/) emptystring ('')
 'False'
 →END       
TRUE:       
 'True'     
END:        

Bu 'Yanlış' yazdırabilir


2

Pyth, 26 19 bayt

hMfql{eT1m,djQdr2tQ

Burada dene!

Bunu golf oynadıktan sonra bir açıklama ekleyeceğim. Daha kısa bir uygulama ve açıklama için bu cevaba bakınız .


1
Örneklerimde 90ve 91örneklerde ek üsleri unuttuğumu hatırlattığın için teşekkürler !
AdmBorkBork

2

MATL , 15 14 bayt

3-:Q"G@:YAd~?@

Bu , dilin / derleyicinin geçerli sürümüyle (14.0.0) çalışır .

Taban yoksa, çıkış boştur (falsey).

Çevrimiçi deneyin!

3-:Q    % take input x implicitly. Generate range of possible bases: [2,3,...,x-2]
"       % for each base b
  G     %   push input again
  @:    %   generate vector of (1-based) digits in base b: [1,2,...,b]
  YA    %   convert to that base
  d~    %   differences between consecutive digits; negate
  ?     %   if all values are true (that is, if all digits were equal)
    @   %     push that base
        %   end if implicitly
        % end for each implicitly
        % display implicitly

2

Mathematica, 55 bayt

Cases[4~Range~#-2,a_/;Equal@@#~IntegerDigits~a]/.{}->0&

Anonim işlev, çok karmaşık değil. Sadece repdigit-nessiteye göre bazları filtreler.


2

Python 2,75 bayt

n=input()
b=1
while b<n-2:
 i=n;b+=1
 while i%b==i/b%b:i/=b
 if i<b:print b

Yakut cevabımın bir limanı. Varsa tüm geçerli tabanları yazdırır.


2

Julia, 45 bayt

n->filter(b->endof(∪(digits(n,b)))<2,2:n-2)

Bu bir tamsayıyı kabul eden ve bir tamsayı dizisi döndüren adsız bir işlevdir. Aramak için değişkene atayın. Uygulanabilir tüm tabanları veya boş bir diziyi döndürür. Büyük bazlarda sorun yok.

İlk önce kapsayıcı aralığı üretiyoruz [2, n n'nin girdi olduğu - 2] oluştururuz . Sonra filtersadece tamsayılar için liste b kendisi için n baz içinde b az 2 benzersiz basamak vardır. Bunu yapmak için, b aralığındaki her bir tamsayı için, b tabanındaki n'nin rakamlarını kullanarak , dizi kullanarak benzersiz öğeler elde edin ve kullanılan son elemanın (yani uzunluk) dizinini alırız .digitsendof


1

Brachylog , 12 bayt

>>.ℕ₂≜&ḃ↙.=∧

Çevrimiçi deneyin! (bir jeneratör olarak!)

Giriş değişkeninden girdi alır ve bunun mümkün olması durumunda çıkış değişkeninden bir taban çıkarır, aksi takdirde başarısız olur. Aynı zamanda, bu listenin boş olabileceği tüm bazların bir listesini çıkaran bir jeneratör olarak da çalışır .

İdeal olarak, bu şekilde ḃ↙.=&>>jeneratör işlevselliğini feda etmek gibi bir şeye benzeyebilir ya da benzer bir yöntemle (nihayetinde birliğe çarpacağı için), ancak şu anki 12 bayt, nasıl alacağımı en kısa zamanda.

     ≜          Assign an integer value to
  .             the output variable
   ℕ₂           which is greater than or equal to 2
 >              and less than a number
>               which is less than the input.
      &         The input
       ḃ↙.      in base-(the output)
          =     is a repdigit.
           ∧    (which is not necessarily the output)


0

05AB1E , 7 bayt

ÍL¦ʒвÙg

Tüm olası değerleri veya boş bir listeyi falsey değeri olarak verir (teknik olarak geçerli çıktılar falsey olmasına rağmen, çünkü 1 falsey 05AB1E'de sıra dışıdır ve her şey falseydir).

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Í        # Decrease the (implicit) input-integer by 2
 L       # Create a list in the range [1, input-2]
  ¦      # Remove the first value to make the range [2, input-2]
   ʒ     # Filter this list by:
    в    #  Convert the (implicit) input to the base of the number we're filtering
     Ù   #  Uniquify it, leaving only distinct digits
      g  #  Get the length of this, which is truthy (1) if all digits were the same
         # (and then output the filtered list implicitly as result)

0

Perl 5 -Minteger -na , 63 bayt

map{$r=$,=($c="@F")%$_;$r*=$c%$_==$,while$c/=$_;$r&&say}2..$_-2

Çevrimiçi deneyin!

Hiçbir çözüm yoksa, olası tüm cevapları veya hiçbir şeyi çıkarmaz.

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.