Znalezienie bazy Repdigit


21

Repdigit jest liczbą naturalną, która może być napisany wyłącznie powtarzając tę samą cyfrę. Na przykład 777jest repdigit, ponieważ składa się wyłącznie z cyfry 7powtórzonej trzy razy.

Nie ogranicza się to jednak do liczb dziesiętnych (podstawa 10):

  • Każda liczba Mersenne'a (w postaci M n = 2 n -1 ) jest powtórką, gdy jest zapisana w formacie binarnym (podstawa 2).
  • Każda liczba jest w trywialny sposób powtórką, gdy jest zapisana jednoargumentowo (baza 1).
  • Każda liczba nmoże być również trywialnie zapisana jako powtórka 11w bazie n-1(na przykład, 17gdy jest zapisana w systemie szesnastkowym (podstawa 16) 11, a 3gdy jest zapisana w formacie binarnym (podstawa 2) również 11).

Wyzwanie polega tutaj na znalezieniu innych podstaw, w których liczba wejściowa może być powtórką.

Wkład

Dodatnia liczba całkowita x > 3, w dowolnym dogodnym formacie.

Wydajność

Dodatnia liczba całkowita, bw (x-1) > b > 1przypadku której reprezentacja xw bazie bjest repdigit.

  • Jeśli takiego nie bma, wartość wyjściowa 0lub pewna wartość falsey .
  • Jeśli bistnieje wiele takich , możesz wypisać jeden lub wszystkie z nich.

Zasady

  • (x-1) > b > 1Ograniczeniem jest to, aby zapobiec trywialne konwersje jednoskładnikowa lub odejmowania „jeden” podstawy. Wyjście numer może być napisany w jednoargumentowego lub dowolnej wygodnej bazy, ale sama baza nie musi być jednym z błahych konwersji.
  • Wejście / wyjście może odbywać się dowolną odpowiednią metodą .
  • Obowiązują standardowe ograniczenia dotyczące luk .

Przykłady

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)

Czy możemy założyć b ≤ 36(wbudowane funkcje konwersji wielu języków nie idą wyżej)?
Klamka

2
@Doorknob Zakładając, że b ≤ 36 poważnie ogranicza zakres tego problemu, a wszystkie istniejące odpowiedzi poprawnie obsługują większe bazy, więc powiem, że nie, nie możesz założyć górnej granicy bwykraczającej poza to, co podano.
AdmBorkBork

Większość liczb to reprodukcje w niektórych bazach. Na przykład 91 = 13 * 7, czyli 77 w bazie 12.
Neil

@Neil ... To prawie tak, jakbyś miał coś do
roboty

Odpowiedzi:


11

Galaretka, 11 9 bajtów

bRI¬P€TḊṖ

Zwraca listę baz, która jest pusta (fałsz), jeśli nie ma żadnej. Wypróbuj online!

Jak to działa

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

Najwyraźniej jednoosobowe Pyth qsprawdza listę, która ma wszystkie unikalne wartości sprzed około 10 dni. Najwyraźniej badanie błędów Pyth poprawia wyniki w golfa.

Filtruje listę, [2..input-1)jeśli unikalny zestaw cyfr wejścia w tej bazie ma długość 1.

Pakiet testowy

Wyjaśnienie:

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 bajtów

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

Musiałem zaimplementować konwersję bazy ręcznie, ponieważ wbudowane Ruby idą tylko do bazy 36 ...

Zwraca nilza nie znaleziono.

->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 bajtów

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

Bez rekurencji, po prostu wypróbowuje wszystkie zasady i generuje zestaw tych, które działają.

To kuszące do kodowania bi dw jednym szeregu, ale to zajmuje zbyt wiele wyrażeń w nawiasach, aby je wydobyć. 77 bajtów:

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 bajty:

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

Generuje pierwszy, bktóry działa, lub 0jeśli żaden nie.

Rep-unit xz dcyfr cw bazie bma wartość x==c*(b**d-1)/(b-1). Odpowiednio x*(b-1)==c*(b**d-1).

Wartość cmusi być x%bostatnią cyfrą. Nie widzę jednak sposobu na określenie darytmetyczne, więc kod wypróbowuje wszystkie możliwości, aby sprawdzić, czy któraś z nich działa.

Zaoszczędzono 5 bajtów, kopiując sztuczkę Dennisa, aby dać wyjście falsey, gdy bosiągnie x-1, biorąc moduł wyjścia x-1. Kolejny bajt ocalony od Dennisa przypominający mi, że potęgowanie w niewytłumaczalny sposób ma wyższy priorytet niż ten ~.

Rozwiązanie o równej długości z inzamiast 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

Rubinowy, 50 bajtów

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

Naprawdę chciałbym usunąć tę irytującą przestrzeń, ale jako nowicjusz ruby ​​wciąż nie jestem zaznajomiony z jego dziwactwami składniowymi.


Dziwnym dziwactwem w tym przypadku jest b?to poprawna nazwa metody, więc nie można pozbyć się miejsca.
Jordan

4

Emojicode , 214 bajtów

(77 znaków):

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

Wyświetla wyniki w bazie 9.

Od kilku tygodni zamierzam grać w golfa kodowego za pomocą emojicode, ale dopiero niedawno język stał się wystarczająco stabilny, aby móc z nim współpracować 😉. Jako bonus, to pytanie korzysta z jednego elementu funkcjonalności, który jest naprawdę dobry w emojicode: reprezentowanie liczb całkowitych w innych bazach.

Ungolfed (👴 jest komentarzem liniowym w emojicode)

🐇🐹🍇         👴 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 bajtów

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

Wypróbuj na Ideone .

Pomysł

Każde powtórzenie x podstawy b> 1 i cyfry d <b spełnia następujące warunki.

stan

Ponieważ d <b , mapa (b, d) ↦ cb + d jest iniekcyjna.

Ponadto, ponieważ b, x> 1 , mamy c <x , więc cb + d <cb + b = (c + 1) b ≤ xb .

Oznacza to, że aby znaleźć odpowiednie wartości c i d dla danej bazowej B , można iterację wszystkich I w [0, ..., BX) i sprawdza, czy (B - 1) x == (% B) i (B i / b - 1) .

Kod

Nazwana lambda f sprawdza, czy (b - 1) x jest w zbiorze {(i% b) (b i / b - 1) | 0 ≤ i <bx} , zaczynając od wartości b = 2 .

  • Jeśli test się powiedzie, zwracamy b .

  • Inaczej, nazywamy f ponownie, z tą samą x i b wzrasta o 1 .

Ponieważ b może ostatecznie osiągnąć x - 1 , bierzemy wynik końcowy modulo x - 1, aby zwrócić 0 w tym przypadku. Zauważ, że tak się nie stanie, jeśli b = 2 spełnia warunek, ponieważ jest zwracane bez powtarzania. Pytanie to gwarantuje jednak, że b = 2 <x - 1 w tym przypadku.


3

Perl 6, 45 43 42 bajtów

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

Wyjaśnione (w pewnym sensie)

Dla porównania, zmienna $^xw { ... }jest tym samym co czynność-> $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 *)daje odwróconą listę cyfr / „cyfr” $nw bazie$b

Polymod (rzeczywisty): Metoda polymod jest prawie jak bardziej rozbudowana wersja funkcji pythona divmod. $n.polymod(*@args)dzieli $ n przez każdą wartość na * @ args, dodając resztę ( $n mod $x) do zwracanej listy i używając ilorazu do następnego dzielenia. Wydaje mi się, że źle to wytłumaczyłem, więc oto kilka przykładów (napisanych w perl 6, ale wystarczająco czystych, aby być zrozumiałym dla większości):

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
W rzeczywistości, ponieważ możesz wyprowadzać „ dowolne lub wszystkie ” prawidłowe wartości, możesz użyć grepmetody zamiast firstmetody.
Brad Gilbert b2gills 17.03.16

Och, dobry haczyk, przegapiłem to
Hotkeys

3

Dyalog APL , 28 bajtów

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

{... ... }funkcja anonimowa, które należy stosować do x(przedstawiciele ),
b←1+⍳⍵-3liczby całkowite od 2 - ⍵-2 składowanych, b
⍵{... dla każdego elementu b ( ) stosuje się funkcję {... }z X jako lewy argument
⍵⊥⍣¯1⊢⍺konwersji NOx do tej podstawy
1=≢∪jest 1 równy zgadzają unikalnej cyfry?
b/⍨elementy b gdzie prawda (że jest tylko jedna unikalna cyfra).

Przykładowe przypadki

Jeśli nie istnieje podstawa, dane wyjściowe są puste (co oznacza falsey), co może wykazać ten program:

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

To drukuje „False”


2

Pyth, 26 19 bajtów

hMfql{eT1m,djQdr2tQ

Wypróbuj tutaj!

Dodam wyjaśnienie po tym, jak zagrałem w golfa. Spójrz na tę odpowiedź, aby uzyskać krótsze wdrożenie i wyjaśnienie.


1
Dzięki za przypomnienie mi, że zapomniałem dodatkowe podstawy do 90i 91w moich przykładów!
AdmBorkBork

2

MATL , 15 14 bajtów

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

To działa z bieżącą wersją (14.0.0) języka / kompilatora .

Jeśli nie istnieje podstawa, dane wyjściowe są puste (co oznacza falsey).

Wypróbuj online!

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 bajtów

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

Funkcja anonimowa, niezbyt skomplikowana. Po prostu odfiltrowuje zasady w oparciu o repdigitity.


2

Python 2, 75 bajtów

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

Port mojej rubinowej odpowiedzi. Wyświetla wszystkie prawidłowe bazy, jeśli takie istnieją.


2

Julia, 45 bajtów

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

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę liczb całkowitych. Aby go wywołać, przypisz go do zmiennej. Zwróci wszystkie odpowiednie zasady lub pustą tablicę. Nie ma problemów z dużymi bazami.

Najpierw generujemy obejmujący zakres [2, n - 2], gdzie n jest wejściem. Następnie filterwyświetlamy listę tylko liczb całkowitych b, dla których n w bazie b ma mniej niż 2 unikalne cyfry. Aby to zrobić, dla każdej liczby całkowitej b w zakresie otrzymujemy cyfry nw bazie b jako tablicę używającą digits, uzyskujemy unikalne pozycje za pomocą i uzyskujemy indeks ostatniego elementu (tj. Długości) za pomocą endof.


1

Brachylog , 12 bajtów

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

Wypróbuj online! (jako generator!)

Pobiera dane wejściowe przez zmienną wejściową i wysyła bazę przez zmienną wyjściową w przypadku, gdy jest to możliwe, w przeciwnym razie zawodzi. Jednocześnie działa również jako generator, który wyświetla listę wszystkich baz, przy czym lista ta może być pusta.

Idealnie mogłoby to wyglądać mniej więcej ḃ↙.=&>>, prawdopodobnie poświęcając funkcjonalność generatora w takiej lub podobnej formie (ponieważ w końcu stałoby się jednoargumentowe), ale na razie 12 bajtów jest najkrótszym, jaki wiem, jak go zdobyć.

     ≜          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 bajtów

ÍL¦ʒвÙg

Zwraca wszystkie możliwe wartości lub pustą listę jako wartość falsey (chociaż technicznie ważne dane wyjściowe są również falsey, ponieważ tylko 1 prawdą jest 05AB1E, a wszystko inne to falsey).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Í        # 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 bajtów

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

Wypróbuj online!

Wysyła wszystkie możliwe odpowiedzi lub nic, jeśli nie ma rozwiązania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.