Podwajanie Pandigital

14

Zainspirowany tym CMC

Biorąc pod uwagę dodatnią liczbę całkowitą większą niż 0, wykonaj na niej następującą operację:

  • Jeśli wszystkie dziesięć pojedynczych cyfr ( 1234567890) jest co najmniej raz w liczbie, wypisz licznik i wyjdź z programu
  • W przeciwnym razie należy podwoić liczbę i powtórzyć, zwiększając liczbę.

Liczenie zaczyna się od 0 i jest liczbą podwojonych danych wejściowych. Na przykład, jeśli dane wejściowe to 617283945, należałoby je podwoić raz, ponieważ 1234567890 zawiera wszystkie 10 cyfr.

To jest więc wygrywa najkrótszy kod. Dane wejściowe mogą być traktowane jako ciąg, jeśli chcesz.

Przypadki testowe

input => output

617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55
Cairney Coheringaahing
źródło
Czy możemy brać dane wejściowe jako ciąg?
Stephen
@Stephen możesz wziąć dane wejściowe jako ciąg znaków.
caird coinheringaahing
3
Czy jest npewne, że dla niektórych istnieje coś ktakiego jak nkpandigital? Chciałbym zobaczyć dowód.
shooqie
1
@bfontaine Chat Mini Challenge
caird coinheringaahing
3
@shooqie Proof! Dla każdego n, który jest coprime do 10, jest to również coprime do 10 ^ 10, a więc istnieje pewne k takie, że nk to 1 mod 10 ^ 10. Następnie 1234567890 * nk = 1234567890 mod 10 ^ 10, więc każda cyfra koniecznie pojawia się co najmniej raz. Jeśli nie, pomnóż przez 2, 5 lub 25, jeśli to konieczne, aby wykonać ostatni niezerowy kod cyfrowy z 10, a wariant powyższego dowodu działa (formalnie, n = 10 ^ m * p, gdzie p spełnia powyższy warunek , więc 1234567890 * p * k jak powyżej jest pandigitalem, więc 1234567890 * p * k * 10 ^ m = 1234567890 * k * n jest). :)
B. Mehta

Odpowiedzi:

4

J , 24 23 bajty

(]1&(+$:)2**)10>#@~.@":

Wypróbuj online!

Wyjaśnienie

(]1&(+$:)2**)10>#@~.@":  Input: integer n
                     ":  Format as string
                  ~.@    Unique
                #@       Length
             10>         Less than 10
           *             Multiply, gives n if previous was true, else 0
         2*              Multiply by 2
 ]                       Get the previous condition
  1&(   )                Execute this if true on 2n, else return 0
      $:                   Recurse
  1  +                     Add 1
mile
źródło
Ładny. Utknąłem na zbieraniu wyników, nie myślałem o użyciu tego rodzaju funkcji rekurencyjnej.
Conor O'Brien
4

05AB1E , 11 10 bajtów

-1 bajt dzięki scottinet

[D9ÝåË#·]N

Wypróbuj online! lub jako pakiet testowy

[          // Start infinity loop
 D         // Duplicate current value (or input)
  9Ý       // Push [0,1,2,3,4,5,6,7,8,9]
    å      // Does each exist in the current value
     Ë#    // Break if all equal (if every digit exists)
       ·   // Else double the current value
        ]N // End loop and print the number of times through the loop
Riley
źródło
-1 bajt
scottinet
@scottinet Thanks! Nie wiem jak mi tego brakowało.
Riley
@riley miał zamiar powiedzieć, use xale to też 10 ... Ładna odpowiedź. Myśl xmogłaby się pozbyć D, ale to ten sam pomysł.
Magic Octopus Urn
3

Perl 6 ,31 28 bajtów (27 znaków)

-3 bajty dzięki @Joshua

{($_,2×*...*.comb.Set>9)-1}

Wypróbuj online!

Objaśnienie: Nadal ten sam konstrukt do rekurencyjnego generowania list. Pierwszym elementem jest dany numer ( $_), każdy następny element to 2 razy poprzedniego ( 2×*- używamy x, ponieważ, chociaż 2 bajtów charakter, to jeszcze 1 bajt tańsze niż 2 * *), i robimy to do stanu koniec *.comb.unique>9jest zadowolony , tzn. gdy liczba zawiera więcej niż 9 unikalnych znaków. (Technicznie dzielimy ciąg na listę znaków za pomocą .comb, wymuszamy na zestawie za pomocą .Set(oczywiście, Zestawy zawierają każdy element tylko raz) i porównujemy z 9, co wymusza zestaw w kontekście numerycznym, co z kolei daje jego liczba elementów).

Na koniec odejmujemy 1 z tej listy. Ponownie lista jest wymuszana na kontekst numeryczny, więc zwracamy o 1 mniej niż długość tej listy.

Ramillies
źródło
Możesz użyć .Setzamiast .uniquezapisać 3 bajty.
Joshua
@Joshua, dobry punkt! Dziękuję Ci. Nigdy o tym nie myślałem.
Ramillies
3

JavaScript (ES6) + big.js , 84 74 73 70 bajtów

Dzięki @ ConorO'Brien za uratowanie 10 bajtów, sugerując big.js zamiast bignumber.js.
Dzięki @Rick Hitchcock za -1 bajt.
Dzięki @Shaggy za -3 bajty.

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

Pobiera dane wejściowe jako ciąg; obsługuje do około 2 69 ze względu na automatyczną konwersję notacji naukowej występującą poza tym punktem.

Test Snippet

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

;[617283945, 2, 66833, 1234567890, 100, 42].forEach(t=>console.log(`f(${t}) = `+f(t)))
<script src="https://cdn.rawgit.com/MikeMcl/big.js/c6fadd08/big.min.js"></script>

Zakres nieskończony, 106 88 87 84 bajtów

Używając opcji config, aby skutecznie wyłączyć notację naukową podczas konwersji liczb na ciągi, możemy mieć prawie nieskończony zasięg.

Justin Mariner
źródło
Może mógłbyś BigNumbertrochę skrócić , używając big.js ?
Conor O'Brien
@ ConorO'Brien To z pewnością pomoże, zwłaszcza, że newjest w tym opcjonalne. Zaktualizuje się, dzięki!
Justin Mariner,
Zaoszczędź jeden bajt za pomocą f=n=>[..."0123456789"].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2)).
Rick Hitchcock,
Nie musimy obsługiwać dużych liczb całkowitych, więc możesz upuścić big.js, jeśli chcesz, zmniejszając do 61 bajtów. I można zaoszczędzić 3 bajty zastępując ciąg cyfr z "4"+2**29: tio.run/##BcGxDkAwEADQb2GQO41LNBZDbX7AKgbhKkSu0jZSX1/...
Shaggy
2

Galaretka , 12 , 11 bajtów

QLn⁵
ḤÇпL’

Wypróbuj online!

Muszę iść szybko!

Wyjaśnienie:

        # Helper link, takes one argument 'z'
Q       # The unique digits of 'z'
 L      # Length
  n     # Does not equal
   ⁵    # 10
        #
        # Main link
  п    # While <condition> is true, run <body> and return all intermediate results
        # Condition:
 Ç      #   The helper link
        # Body:
Ḥ       #   Double the input
        # Now we have a list of all the 'z's that we passed to the helper link
    L   # Return it's length
     ’  # minus one
James
źródło
Zestaw testowy
caird coinheringaahing
2

J , 43 bajty

f=:(,$:@+:@{.)`[@.(9<[:#@~.10&#.inv)
<:@#@f

Wypróbuj online!

Definiuje anonimową funkcję. Zbiera wyniki dość suboptymalnie. Sprawdź doskonałą odpowiedź mil tutaj!

Conor O'Brien
źródło
Nie ma potrzeby rekurencji, użyj ^:a::1#@}.+:^:(10>#@~.@":)^:a:
FrownyFrog
2

Haskell, 44 bajty

until(\c->all(`elem`show(n*2^c))['0'..'9'])(+1)0
jkabrg
źródło
2

Clojure, 115 89 82 bajtów

-26 bajtów, po prostu używając ciągu znaków do reprezentowania listy znaków (duh, z perspektywy czasu) i zmieniając z używania rekurencji na loop, co pozwoliło mi dokonać kilku optymalizacji.

-7 bajtów poprzez pozbycie się połączenia z bigint. Najwyraźniej musimy tylko obsługiwać dane wejściowe, które nie spowodują przepełnienia.

#(loop[n % c 0](if(empty?(remove(set(str n))"1234567890"))c(recur(* 2 n)(inc c))))

Pregolfed:

(defn pan [num]
  (loop [n num
         cnt 0]

    ; Remove all the characters from the stringified input
    ;  that are numeric. If the result is an empty list, all
    ;  the numbers were present.
    (if (empty? (remove (set (str n)) "1234567890"))
      cnt
      (recur (* 2 n) (inc cnt)))))
Carcigenicate
źródło
Możesz zapisać 7 bajtów, używając every?zamiast empty? (remove …:#(loop[n % c 0](if(every?(set(str n))"1234567890")c(recur(* 2 n)(inc c)))))
bfontaine
@bfontaine Oh, masz rację! Dzięki. Naprawię to później. Dzięki.
Carcigenicate
2

Siatkówka , 85 bajtów

^\d*
$&¶$&
D`.(?=.*¶)
\d{10}¶\d+|\d*¶

[5-9]
#$&
T`d`EE
T`_d#`d_`\d#
#
1
}`\d\b
$&@
@

Wypróbuj online! Link zawiera przypadki testowe. Nieznacznie zoptymalizowany pod kątem czasu działania. Wyjaśnienie:

^\d*
$&¶$&

Zduplikuj numer wejściowy.

D`.(?=.*¶)

Deduplikuj cyfry w pierwszej kopii.

\d{10}¶\d+|\d*¶

Jeśli pozostało 10 cyfr, usuń oba numery, w przeciwnym razie po prostu usuń pierwszą kopię. Pamiętaj, że usunięcie obu liczb powoduje, że reszta pętli przestaje działać.

[5-9]
#$&

Umieść #przed dużymi cyframi.

T`d`EE

Podwój każdą cyfrę.

T`_d#`d_`\d#

Dodaj w bagażnikach.

#
1

Radzić sobie z wiodącym carry.

}`\d\b
$&@

Dodaj @pętlę i do momentu znalezienia wszystkich 10 cyfr.

@

Wydrukuj liczbę @dodanych s.

Neil
źródło
2

APL (Dyalog Unicode) , 19 + 2 = 21 bajtów

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}

Wypróbuj online!

To dwójkowym Dfn( d Skierować F unctio n ), przy 0 jako lewego argumentu, i całkowitą, po prawej stronie. Ponieważ wejście ma być tylko liczbą całkowitą, dodałem 2 bajty dla argumentu 0∘do liczby bajtów.

f←nie jest uwzględniony w liczbie bajtów, ponieważ nie jest to konieczne . To po prostu ułatwia budowanie przypadków testowych.

Jak to działa:

Nagłówki: Usunąłem je z liczby bajtów po pewnym czacie w pokoju APL, ponieważ funkcja robi to, co powinna, a wyniki są nieprawidłowe tylko z powodu domyślnych ustawień REPL APL.

⎕FR←1287Ustawia prezentację F loat R na 128-bitową dziesiętną (7 to kod dziesiętny w REPL APL-a). ⎕PP←34Ustawia resekcję P rint P na 34 cyfry. Oba są potrzebne, ponieważ domyślna reprezentacja APL dla dużych liczb przekształca je w notację naukową (np. 3.14159265359E15), co znacznie psuje kod.

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}  Dyadic Dfn
0                      Fixes 0 as the left argument  
          :             If
     D                 String representation of all digits [0, 9]
                       "is in"
        ⍕⍵              String representation of the input
   ∧/                   AND-reduction. Yields 1 (true) iff all digits are in the right argument.
                       return the left argument
                       Else
                 2×⍵    Double the right arg
             ⍺+1        increment the left arg
                       Recursively call this function with the new arguments.
J. Sallé
źródło
2

Java 8, 132 110 87 74 bajty

n->{int c=0;for(;(n+"").chars().distinct().count()!=10;n*=2)c++;return c;}

-57 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj tutaj. (Uwaga: przypadek testowy dla 2jest wyłączony, ponieważ powinien zatrzymać się na 2 68 , ale rozmiar longjest ograniczony do 2 63 -1.)

n->          // Method with long parameter and integer return-type
  int c=0;   //  Count-integer, starting at 0
  for(;(n+"").chars().distinct().count()!=10;
             //  Loop (1) as long as the unique amount of digits in the number are not 10
    n*=2)    //    After every iteration: multiply the input by 2
   c++;      //   Increase the count by 1
             //  End of loop (1) (implicit / single-line body)
  return c;  //  Return the counter
}            // End of method

Stare 132 bajty odpowiadają za pomocą Stringdanych wejściowych i wyrażeń regularnych:

n->f(n,0)int f(String n,int c){String t="";for(int i=0;i<10;t+="(?=.*"+i+++")");return n.matches(t+".*")?c:f(new Long(n)*2+"",c+1);}

Wypróbuj tutaj. (Uwaga: przypadek testowy dla 2jest wyłączony, ponieważ powoduje wyjątek StackOverflowException z powodu nieco zbyt dużej rekurencji).

Wyrażenie całkowite, aby sprawdzić, czy Łańcuch zawiera wszystkie 9 cyfr, staje ^(?=.*0)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9).*$się pozytywnym spojrzeniem w przyszłość dla całego Łańcucha.

Kevin Cruijssen
źródło
1
111 bajtów (tak, liczba bajtów to „uni-cyfrowy” ;-)
Olivier Grégoire,
Zauważ, że 2 nigdy nie zadziała, ponieważ spodziewamy się 2^68pierwszej liczby pandigitalnej, ale długi w Javie są ograniczone do 2^63-1.
Olivier Grégoire,
1
87 bajtów . Dzięki reduce\ o /
Olivier Grégoire
1
74 bajty . Zatrzymuję się tutaj ;-)
Olivier Grégoire,
1
@KevinCruijssen Wiem, że zatarłeś swoją starą metodę, ale chcę tylko podkreślić, że możesz użyć następującego wyrażenia regularnego, aby dopasować wszystkie 10 cyfr:(?:.*?(\d)(?!.*\1)){10}
jaytea
1

Łuska , 10 bajtów

←Vö>9Lud¡D

Wypróbuj online!

Wyjaśnienie

        ¡D    Repeatedly double the input, collecting results in a list
 V            Return the first index where the following is true
     L          The length of
       d        the digits
      u         with duplicates removed
  ö>9           is greater than 9
←             Decrement (as Husk uses 1-indexing)
H.PWiz
źródło
1

Mathematica, 59 48 47 46 38 bajtów

-9 bajtów dzięki Jenny_mathy.

If[!FreeQ[DigitCount@#,0],#0[2#]+1,0]&

Wypróbuj online za pomocą matematyki!

całkowicie ludzki
źródło
2
46 bajtów: Jeśli [Tr [1 ^ Union @ IntegerDigits @ #] <10, # 0 [2 #] + 1,0] &
J42161217
Mathematica pozwala na anonimowe funkcje rekurencyjne. :o dzięki!
całkowicieludzki
2
38 bajtów: Jeśli [! FreeQ [DigitCount @ #, 0], # 0 [2 #] + 1,0] &
J42161217
Oh dziękuję! BTW, `` może być użyty do kodu, ale wiodące białe znaki nie są dozwolone. abędzie działać, ale „a” nie.
całkowicie ludzki
pewnie! BTW możesz użyć tej stopki w TIO Print/@f/@{617283945,2,66833,1234567890,100,42}
J42161217,
1

R , 74 bajty

function(x){while(!all(0:9%in%el(strsplit(c(x,""),"")))){F=F+1;x=2*x};F*1}

Wypróbuj online! Zauważ, że R da złą odpowiedź z f(2)powodu ograniczeń, w jaki język przechowuje duże liczby całkowite.

Objaśnienie: W celu przetestowania pandigitalności dane wejściowe są wymuszane na wektorze znaków przez połączenie pustym łańcuchem, a następnie podzielone na poszczególne cyfry. Następnie sprawdzamy, czy wszystkie 0: 9 są obecne w powstałym wektorze; jeśli nie, zwiększamy licznik, podwajamy dane wejściowe i powtarzamy.

Licznik używa F, który inicjuje się jako FAŁSZ. Aby upewnić się, że jest on wymuszony na liczbę, mnożymy przez jeden przed powrotem.

użytkownik2390246
źródło
używanie c(x,"")jest fajną sztuczką dlael(strsplit(...))
Giuseppe
1

PowerShell , 70 69 bajtów

for($n=[bigint]$args[0];([char[]]"$n"|group).count-le9;$n*=2){$i++}$i

Wypróbuj online!

(Prawie dwa razy dłużej niż odpowiedź Pythona: - \)

Pobiera dane wejściowe $args[0], przesyła je jako a [bigint], zapisuje je $n. Wchodzi w forpętlę. Przy każdej iteracji sprawdzamy, czy $number przekształcony na ciąg znaków, a następnie na chartablicę, gdy są Group-Objectrazem, ma wartość .count -lese lub ejakość 9. Oznacza to, że jedynym sposobem, w jaki wynosi ona 10, 1234567890jest obecność co najmniej jednej cyfry każdej liczby . Jeśli tak, wychodzimy z pętli. Jeśli nie, my $n*=2i kontynuujemy. Każdą iterację w pętli zwiększamy $i. Kiedy wychodzimy z pętli, po prostu generujemy dane wyjściowe $i.

Zauważ, że dla danych wejściowych, takich jak 1234567890tam, gdzie każda cyfra jest już uwzględniona, nie wyświetli to nic, co jest wartością falsey w PowerShell i równoważną 0po rzuceniu jako [int]. Jeśli to nie jest OK, możemy po prostu umieścić+ przed wyjściem, $iaby jawnie rzucić go jako liczbę całkowitą.

Oszczędność bajtu dzięki Rolandowi Heathowi.

AdmBorkBork
źródło
Czy możesz użyć le9 zamiast ne10? Nie znam PowerShell, ale to może zaoszczędzić bajt.
Roland Heath,
@RolandHeath Rzeczywiście; dobra decyzja. Dzięki!
AdmBorkBork,
0

Pyth , 11 bajtów

f>l{`.<QT9Z

Zestaw testowy .

Pierwsza liczba naturalna, w Tktórej input << Tspełnia wymagania.

Leaky Nun
źródło
0

Perl, 43 + 1 bajtów

for$x(0..9){$_*=2,++$\,redo LINE if!/$x/}}{

Korzystanie z -pflagi. Opiera się to na rozwiązaniu dostarczonym przez Xcali powyżej.


źródło
0

Swift 4 , 111 bajtów

func p(_ x:Int,_ c:Int=0)->Int{if !(String(Set(String(x)).sorted())=="0123456789"){return p(x*2,c+1)};return c}

Uwaga: Nie działa dla x = 2 z powodu przepełnienia.

Objaśnienie - Wejście x jest najpierw typowane do łańcucha. Następnie Set () usuwa powtarzające się znaki. Następnie jest sortowany zgodnie z wynikiem. Jeśli nie pasuje, x podwaja się, a licznik jest zwiększany.

Naresh
źródło
1
nie działa, ponieważ var ma 64 bity. Istnieje wiele innych odpowiedzi z tym samym problemem.
Naresh,
Jeśli uważasz, że powinno to być dozwolone, przywołaj PO. Może to być powszechna praktyka, ale PO nie zezwala na to specjalnie, a przypadki testowe sugerują, że musisz wesprzeć 2.
Post Rock Garf Hunter
1
@FunkyComputerMan faktycznie, pozwoliłem na odpowiedzi, które nie potrafią obsłużyć liczb poza granicami języka, ale Kudłaty najwyraźniej usunął komentarz pytając o to. Ta odpowiedź jest w porządku.
caird coinheringaahing
0

Rubin, 46 45 39 38 bajtów

def f n;n.digits.uniq[9]?0:1+f(n*2)end

Wypróbuj online!

Aktualizacje:

  1. -1 przy użyciu def f n;zamiast def f(n);.
  2. -6 przy użyciu …[9]zamiast….size==10
  3. -1 przez usunięcie średnika
bfontaina
źródło
0

Japt , 15 bajtów

LÆ*2pXÃbì_â Ê¥A

Spróbuj


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.

LÆ    Ã

Utwórz tablicę liczb całkowitych od 0do 99i przekaż każdą z nich przez funkcję, w której Xjest bieżący element.

*2pX

Upomnożone przez 2 podniesione do potęgi X.

b

Uzyskaj indeks pierwszego elementu, który zwraca wartość true po przejściu przez następującą funkcję.

ì_â

Podziel na tablicę cyfr i usuń duplikaty.

Ê¥A

Uzyskaj długość tablicy i sprawdź równość z 10.


Alternatywnie, 15 bajtów

@*2pX)ìâ sÊ¥A}a

Spróbuj


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.

@            }a

Zaczynając od 0, zwróć pierwszą liczbę, która zwraca true po przejściu przez następującą funkcję, przy Xczym jest to bieżąca liczba.

*2pX)

Jak wyżej, pomnóż Uprzez 2 do potęgi X.

ìâ

Podziel na tablicę cyfr, usuń duplikaty i ponownie dołącz do liczby całkowitej.

Konwertuj na ciąg, uzyskaj długość i przekonwertuj z powrotem na liczbę całkowitą.

¥A

Sprawdź równość z 10.

Kudłaty
źródło
0

QBIC , 48 bajtów, nc

{q=1[z|q=q*instr(!:$,!a-1$)]~q>0|_Xp\p=p+1┘b=b*2

Teoretycznie powinno to działać. Jednak w praktyce to się nie udaje, ponieważ QBasic rzuca dziesięciocyfrowe liczby (przynajmniej potrzebne, aby uzyskać wszystkie cyfry) do notacji naukowej ... Z tego powodu oznaczyłem ją jako niekonkurującą.

Wyjaśnienie

{             DO ad infinitum
q=1           set q to 1
[z|           FOR a = 1 to 10
q=q*instr     multiply q by the position
(!:$             - in 'b' (read from cmd line at start) cast to string (! ... $)
,!a-1$)          - of the number a-1 [0-9] cast to string
]             NEXT
~q>0          IF any character was not found, instr gave a 0. If q != 0 all digits were present
|_Xp          THEN quit, printing  p (is 0 at start)
\p=p+1        ELSE increase step counter p
┘b=b*2        and double 'b'
Steenbergh
źródło
0

GNU dc, 61 bajtów

Dane wejściowe są kopiowane z góry stosu (który w przeciwnym razie musi być pusty); wyjście jest wypychane na szczyt stosu.

[I~1r:ad0<s]ss[d1+r;a1=p]sp[d2*lfx]sh[0Sadlsxlpx11!=h]dsfxz1-

Wyjaśnienie

Używamy zmiennej tablicowej a, przechowując 1 w, a[d]jeśli cyfra djest obecna, w przeciwnym razie wracając do 0. Używamy rozszerzenia GNU, ~aby uzyskać iloraz i resztę w jednym poleceniu.

# populate a[0-9] from the digits
[I~1r:ad0<s]ss

# check pandigit
# return 1 more than lowest unset element of a[]
# start with stack=0
[d1+r;a1=p]sp

# Test for pandigit; double and repeat if needed
[dd+lfx]sh
[0Sadlsxlpx11!=h]dsfx

# We left one value on the stack for each doubling, plus the original
z1-

Jako bonus, będzie to działać w dowolnych bazach liczb (nie tylko dziesiętnych): po prostu ustaw podstawę wejściową zgodnie z wymaganiami (stała 11w definicji fbędzie odczytywana przy użyciu tej podstawy liczb, więc jest automatycznie poprawna).

Test

for i in 617283945 2 66833 1234567890 100 42
do
    printf '%s => ' $i
    dc -e $i \
       -e '[I~1r:ad0<s]ss[d1+r;a1=p]sp[dd+lfx]sh[0Sadlsxlpx11!=h]dsfxz1-' \
       -e p
done
617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55
Toby Speight
źródło
0

REXX, 57 bajtów

arg n
do b=0 while verify(0123456789,n)>0
  n=n*2
  end
say b
idrougge
źródło
0

q / kdb + , 33 bajty

Rozwiązanie:

(#)1_{x*2 1 min!:[10]in 10 vs x}\

Przykłady:

q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[100]
51
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[1234567890]
0
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[42]
55

Wyjaśnienie:

Wszystkie bajty są równe, może być w stanie zagrać w ten nieco dalej. Wykorzystuje scanprzysłówek q :

count 1_{x*2 1 min til[10] in 10 vs x}\ / ungolfed solution
        {                            }\ / scan over this lambda until it yields same result
                              10 vs x   / convert to base 10
                           in           / left list in right list, returns boolean list
                   til[10]              / range 0..9
               min                      / return the minimum of the list, 0 or 1
           2 1                          / list (2;1) indexed into with 0 or 1
         x*                             / return x multiplied by either 2 or 1
      1_                                / 1 drop, drop one element from front of list
count                                   / count the length of the list

Uwagi:

Jeśli przejdziemy do kmonitu, możemy uzyskać rozwiązanie 25-bajtowe. Konwertuje liczbę na listę znaków:

q)\
  #1_{x*2 1@&/($!10)in$$x}\[100]
51
streetster
źródło