Jaki jest starter tego skonstruowanego numeru?

14

Wiele języków programowania konstruuje duże liczby całkowite poprzez „łączenie” cyfry z końcem istniejącej liczby. Na przykład Labirynt lub Adapt . Przez połączenie cyfry do końca rozumiem, że jeśli istniejąca liczba to 45 , a cyfra to 7 , to liczba wynikowa to 457(45×10+7) .

Skonstruowana liczba to liczba, którą można zbudować w ten sposób za pomocą wielokrotności liczb jednocyfrowych: 1,2),3),4,5,6,7,8,9 AKA element w jednej z tych 9 sekwencji:

1,12,123,1234,12345,
2),24,246,2468,24690,
3),36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

Aby podać przykład budowy sekwencji, oto jak zbudowana jest sekwencja dla a=3 :

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359u34=10×u33+34×a=37359+102=373692

u33 and u34 included to demonstrate when n×a100. A lot of digits dotted out for space.

It may still not be clear how these sequences are constructed, so here are two different ways to understand them:

  • Każda sekwencja zaczyna się od pojedynczej cyfry. Następny termin można znaleźć, biorąc następną wielokrotność tej cyfry, mnożąc poprzedni termin przez 10 i dodając wielokrotność. Sekwencyjnie:

    un=10×un1+n×a,u1=za

    gdzie a jest pojedynczą cyfrą (od 1 do 9 )


  • Each of the 9 elements at any point in the sequence (take n=3 for instance) are the multiples of 123 from 1 to 9, where 123 is constructed by un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    So the first values are 1×1,2),3),,8,9, the second are 12×1,2),3),,8,9, the third 123×1,2),3),,8,9, etc.

Twoim zadaniem jest pobranie skonstruowanej liczby jako danych wejściowych i wyprowadzenie początkowej cyfry użytej do jej skonstruowania. Możesz założyć, że dane wejściowe będą zawsze liczbą konstruowaną i będą większe niż 0 . Może być pojedynczą cyfrą, która odwzorowuje się z powrotem na sobie.

Możesz przyjmować dane wejściowe w dowolny rozsądny sposób, w tym jako listę cyfr, ciąg znaków itp. Dopuszczalne (choć nie zalecane) jest wprowadzanie danych jednostronnie lub w dowolnej innej wybranej przez ciebie bazie.

To jest więc wygrywa najkrótszy kod!

Przypadki testowe

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

lub jako dwie listy:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

Kiedy opublikowałem to wyzwanie, nie zdawałem sobie sprawy, że można go uprościć dzięki metodzie użytej w odpowiedzi Grimy'ego , dlatego bardzo interesują mnie odpowiedzi, które mają bardziej matematyczne podejście do rozwiązania, niż „cyfra” trick (oczywiście wszystkie poprawne odpowiedzi są jednakowo ważne, tylko to, co chciałbym zobaczyć).

Cairney Coheringaahing
źródło
Post w piaskownicy . Mam 9-bajtowe rozwiązanie w Galaretce, jeśli ktoś chce to zakwestionować.
caird coinheringaahing

Odpowiedzi:

26

05AB1E , 7 5 4 bajtów

>9*н

Wypróbuj online!

>            # input + 1
 9*          # * 9
   н         # take the first digit
Ponury
źródło
6
Hmm, to nie wróży dobrze temu wyzwaniu, jeśli można to tak łatwo uprościć
caird coinheringaahing
9
Masz około 1 bajta kodu na 800 bajtów wyjaśnienia wyzwania. : p
Arnauld
1
Jak wymyślić rozwiązanie i dlaczego jest poprawne?
Joel
7
@ Połącz (n-1) część sekwencji rozpoczynającą się od a a * (((10**n - 1) / 9 - n) / 9). Pomnóż to przez 9 i dodaj a*n, a otrzymasz a * ((10**n - 1) / 9), czyli cyfrę, powtarzaną n razy. Okazuje się, że dodanie 9 zamiast a*ndziała dla n = 1, a dla większego n stała różnica jest nieznaczna obok wzrostu wykładniczego.
Grimmy,
3
@Grimy Bardzo dziękuję za wyjaśnienie. Może umieścisz go w swoim poście.
Joel
3

MathGolf , 6 bajtów

)9*▒├Þ

Wypróbuj online!

Niestety headw MathGolf nie ma żadnej operacji, więc muszę zrobić, ▒├Þaby przekonwertować na ciąg, pop od lewej i odrzucić wszystkie oprócz wierzchu stosu.

Jo King
źródło
2

Węgiel drzewny , 7 bajtów

§I×⁹⊕N⁰

Wypróbuj online! Link jest do pełnej wersji kodu. @ Metoda Grimy'ego oczywiście. Oto 27-bajtowe podejście matematyczne:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

Wypróbuj online! Link jest do pełnej wersji kodu. Awarie przy nieprawidłowych danych wejściowych. Wyjaśnienie:

Nθ

Wprowadź skonstruowaną liczbę.

W¬№Eχ×κ↨υχθ

Zinterpretuj listę jako liczbę w bazie 10, pomnóż ją przez wszystkie liczby od 0do 9i sprawdź, czy pojawi się skonstruowana liczba.

⊞υLυ

Pchnij długość listy do siebie. Lista staje się zatem formą [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Odtwórz skonstruowane liczby, ale tym razem znajdź i wyślij indeks, pod którym pojawił się numer wejściowy.

Neil
źródło
2

Biała spacja , 108 bajtów

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

Dodane litery S(spacja), T(tab) i N(nowa linia) tylko jako wyróżnienia.
[..._some_action]dodano tylko jako wyjaśnienie.

Port odpowiedzi 05AB1E @Grimy , z wyjątkiem tego, że nie mam wbudowanego, aby uzyskać pierwszą cyfrę. ;)

Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).

Objaśnienie w pseudo-kodzie:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT
Kevin Cruijssen
źródło
2

Python 3 , 22 bajty

lambda i:str(-~i*9)[0]

Wypróbuj online!

Port Grimy „s 05AB1E odpowiedź


Python 3 , 74 bajty

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

Wypróbuj online!

Wyjaśnienie

Funkcja rekurencyjna. Powtarza sekwencję dla każdej cyfry l, zaczynając od 1. Jeśli wartość wejściowa ijest równa bieżącej iteracji j, lzwracana jest odpowiednia cyfra . W przeciwnym razie, jeśli bieżąca wartość jw sekwencji przekroczy wartość wejściową i, zwiększy cyfrę li rozpocznie od nowa. Argument ksłuży do zwiększania mnożnika.

Jitse
źródło
1

JavaScript (ES6),  16  15 bajtów

Dzięki @Grimy za zniesienie 32-bitowego ograniczenia, które miałem w poprzedniej wersji.

Używanie magicznej inkantacji Grimy'ego . Pobiera dane wejściowe jako ciąg.

n=>(n*9+9+n)[0]

Wypróbuj online!


JavaScript (ES6), 53 bajty

Naiwne brutalne podejście.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

Wypróbuj online!

Arnauld
źródło
-~n*9może być n*9+9, co jest tym samym bajtem, ale powinienem pozbyć się ograniczenia 32-bitowego, jeśli dobrze zrozumiałem.
Grimmy,
brutalna siła działa dla> = 10, jak14808
Nahuel Fouilleul
1
@NahuelFouilleul, jeśli weźmiemy pod uwagę> = 10, odpowiedź nie jest już unikalna (14808 może być albo czwartym wyrażeniem a = 12, albo pierwszym wyrazem a = 14808). Jeśli wysyłanie któregokolwiek z nich jest dozwolone, n=>ndziała dla wszystkich danych wejściowych.
Grimmy,
1

Java 8, 23 bajty

n->(n*9+9+"").charAt(0)

Port odpowiedzi @ABrimy 05AB1E , więc pamiętajcie o jego głosowaniu!

Wypróbuj online.

Ale ponieważ trochę mi przykro z powodu @cairdCoinheringaahing , oto podejście brutalnej siły z nieco większym budżetem ( 83 bajty ):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

Wypróbuj online.

Wyjaśnienie:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result
Kevin Cruijssen
źródło
0

Galaretka , 8 bajtów

RRḌ÷@fⱮ9

Wypróbuj online!

Pełny program, który pobiera liczbę całkowitą i drukuje cyfrę początkową. Nie używa sprytnej metody Grimy'ego! Strasznie nieefektywny przy większych nakładach. Następująca wersja obsługuje wszystkie przypadki testowe, ale jest bajtem dłuższym:

Galaretka , 9 bajtów

DJRḌ÷@fⱮ9

Wypróbuj online!

Nick Kennedy
źródło
0

Hy , 44 bajty

(defn a[p](print(get(str(*(+(int p)1)9))0)))

Wykorzystuje metodę Grimy'ego

Wypróbuj online!

girobuz
źródło
0

Beczka -rr , 4 bajty

⑨9*÷

Wypróbuj online!

Oczywiście stosuje to samo podejście, co odpowiedź 05AB1E. Używa również nowego-rr flagi (odwróć i drukuj raw).

Transpozycje do:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)
Lyxal
źródło