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ć).


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

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.





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.



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

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.


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!


-~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


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!



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)

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.