Bu inşa edilen numaranın başlatıcısı nedir?


14

Bazı programlama dilleri, rakamı mevcut sayının sonuna 'birleştirerek' büyük tamsayılar oluşturur. Örneğin, Labirent veya Adapt . Basamağı sonuna kadar birleştirerek, mevcut sayı ve basamak ise, sonuç sayısının olduğunu kastediyorum .457457(45×10+7)

Yapılandırılmış bir sayı, tek basamaklı sayıların katlarının kullanılmasıyla bu şekilde oluşturulabilen bir sayıdır: AKA, bu 9 diziden birinde bir eleman:1,2,3,4,5,6,7,8,9

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,

Dizilerin nasıl oluşturulduğuna ilişkin bir örnek sunmak için, a=3 dizisinin nasıl oluşturulduğu aşağıda açıklanmıştır:

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 u 34 n × a 100 ve , olduğunda göstermek için dahil edilmiştir . Boşluk için bir sürü basamak.u34n×a100

Bu sekansların nasıl oluşturulduğu hala net olmayabilir, bu yüzden bunları anlamanın iki farklı yolu vardır:

  • Her sekans tek basamaktan başlar. Sonraki terim, bu rakamın bir sonraki katını alarak , önceki terimi ile çarparak ve katını ekleyerek bulunur. Sıralı olarak:10

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

    burada tek basamaklı bir ( yoluyla )a19


  • Her biri, sırayla herhangi bir noktada elemanlar (alır için örnek) katlarıdır adlı işletmeye bulundunuz burada, tarafından oluşturulur9n=312319123un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    İlk değerler , ikincisi , üçüncü vb.1×1,2,3,,8,912×1,2,3,,8,9123×1,2,3,,8,9

Göreviniz, yapılandırılmış bir sayıyı girdi olarak almak ve bunu oluşturmak için kullanılan ilk basamağı çıkarmaktır. Sen girdi daima inşa numarayı olacak varsayabiliriz ve daha büyük olacaktır . Kendine eşlenen tek bir rakam olabilir.0

Girdiyi rakam listesi, dize vb. Dahil olmak üzere makul bir şekilde alabilirsiniz. Girdi tek başına veya seçtiğiniz başka bir temelde kabul edilebilir (önerilmez).

Bu bir yani kısa kod kazanır!

Test senaryoları

       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

veya iki liste halinde:

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

Bu meydan okumayı yayınladığımda, Grimy'nin cevabında kullanılan yöntemle bu kadar basitleştirilebileceğini fark etmedim ve bu nedenle, bunu çözmek için 'rakam' yerine daha matematiksel bir yaklaşım alan cevaplarla çok ilgileneceğim. (Açıkçası tüm geçerli cevaplar eşit derecede geçerlidir, sadece görmekle ilgilendiğim şey).


Korumalı alan gönderisi . Birisi buna meydan okumak isterse, Jelly'de 9 baytlık bir çözümüm var.
caird coinheringaahing

Yanıtlar:


26

05AB1E , 7 5 4 bayt

>9*н

Çevrimiçi deneyin!

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
Hmm, bu basitleştirilebiliyorsa bu meydan okuma için iyi bir şey değil
caird coinheringaahing

9
800 baytlık meydan okuma açıklaması için yaklaşık 1 bayt kodunuz var. : p
Arnauld

1
Çözümü nasıl buluyorsunuz ve neden doğru?
Joel

7
@ A ile başlayan dizinin (n-1) terimine dokunun a * (((10**n - 1) / 9 - n) / 9). Bunu 9 ile çarpın ve ekleyin a*nve a * ((10**n - 1) / 9)rakam olarak n tekrar tekrar rakam olsun . a*nN = 1 için işler yerine 9 ekleyerek ortaya çıkıyor ve daha büyük n için sabit fark, üstel büyümenin yanında ihmal edilebilir.
Grimmy

3
@ Grimy Açıklama için çok teşekkürler. Belki yazıya koyabilirsin.
Joel

3

MathGolf , 6 bayt

)9*▒├Þ

Çevrimiçi deneyin!

Ne yazık ki, headMathGolf hiçbir işlem yoktur , bu yüzden ▒├Þdize, soldan pop ve yığının üst hariç tüm atmak için yapmak zorunda .





2

Kömür , 7 bayt

§I×⁹⊕N⁰

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. @ Grimy'nin yöntemi elbette. İşte 27 baytlık bir matematiksel yaklaşım:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Geçersiz girişlerde çökmeler. Açıklama:

Nθ

Yapılan sayıyı girin.

W¬№Eχ×κ↨υχθ

Tüm sayılarla çarpma, 10 tabanında bir sayı olarak liste yorumlama 0için 9ve inşa numarası görünür olup olmadığını görmek.

⊞υLυ

Listenin uzunluğunu kendisine itin. Dolayısıyla liste form haline gelir [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Oluşturulan sayıları yeniden oluşturun, ancak bu kez giriş numarasının göründüğü dizini bulun ve çıktılayın.



2

Boşluk , 108 bayt

[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]

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklendi.
[..._some_action]yalnızca açıklama olarak eklendi.

Port @Grimy 'nin 05AB1E yanıtı , ancak ilk basamağı almak için bir yerleşik yok. ;)

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Sahte kodda açıklama:

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 bayt

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

Çevrimiçi deneyin!

Port Grimy 'ın 05AB1E cevap


Python 3 , 74 bayt

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])

Çevrimiçi deneyin!

açıklama

Özyinelemeli işlev. 'Den lbaşlayarak her basamak için dizi üzerinden tekrarlar 1. Giriş igeçerli yinelemeye eşitse j, karşılık gelen basamak ldöndürülür. Aksi takdirde, jsekanstaki mevcut değer giriş değerini aşarsa i, rakamı arttırır lve baştan başlar. Bağımsız değişken k, çarpma faktörünü artırmak için kullanılır.


1

JavaScript (ES6),  16  15 bayt

@Grimy'ye, önceki sürümde sahip olduğum 32 bit kısıtlamayı kaldırdığı için teşekkürler.

Grimy'nin büyülü büyüsünü kullanarak . Girişi dize olarak alır.

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

Çevrimiçi deneyin!


JavaScript (ES6), 53 bayt

Saf kaba kuvvet yaklaşımı.

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

Çevrimiçi deneyin!


-~n*9olabilir n*9+9, aynı bytecount ama doğru anlaşılırsa, 32-bit sınırlama kurtulmak gereken.
Grimmy

kaba kuvvet bir = = 10 gibi çalışır14808
Nahuel Fouilleul

1
@NahuelFouilleul> = 10 olarak düşünürsek, cevap artık benzersiz değildir (14808 ya a = 12'nin 4. terimi ya da a = 14808'in ilk terimi olabilir). Bunlardan herhangi birinin çıkışına izin verilirse, n=>ntüm girişler için çalışır.
Grimmy

1

Java 8, 23 bayt

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

Port of @Grimy 'nin 05AB1E yanıtı , bu yüzden onu oyladığınızdan emin olun!

Çevrimiçi deneyin.

Ama @cairdCoinheringaahing için kendimi kötü hissediyorum , burada biraz daha göze çarpan kaba kuvvet yaklaşımı ( 83 bayt ):

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;}

Çevrimiçi deneyin.

Açıklama:

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

Jöle , 8 bayt

RRḌ÷@fⱮ9

Çevrimiçi deneyin!

Bir tamsayı alan ve başlangıç ​​rakamını basan tam bir program. Grimy'nin akıllı yöntemini kullanmaz! Daha büyük giriş için son derece verimsiz. Aşağıdaki sürüm tüm test senaryolarını işler ancak bir bayt daha uzundur:

Jöle , 9 bayt

DJRḌ÷@fⱮ9

Çevrimiçi deneyin!



0

Fıçı -rr , 4 bayt

⑨9*÷

Çevrimiçi deneyin!

Tabii ki, 05AB1E cevabı ile aynı yaklaşımı kullanır. Ayrıca yeni -rr(ters ve baskı ham) bayrağını kullanır.

Aktarım yeri:

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)

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.