Yazılı Rakam Dizisi


17

İşte Tamsayı Dizilerinin Çevrimiçi Ansiklopedisinde olmayan makul derecede önemsiz bir dizi .

Boş bir sekansla başlayın, ardından her terimi, dizideki tüm rakamları boşluk bırakmadan yazmak için gereken karakter sayısı olarak tanımlayın. *

Referans olarak, İngilizce (temel on) basamakların tümünün karakter sayısı:

zero   one    two    three  four   five   six    seven  eight  nine
4      3      3      5      4      4      3      5      5      4

(Her ikisi de başlangıcı hangisi A52360 ve A5589 .)

Bu , boş dizide sıfır basamak bulunduğundan ilk girişi a(0)=0 yapar .

Bu, şimdiye kadar var olan tek basamak olan "sıfır" yazmak için dört karakter gerektirdiğinden , ikinci girişi a(1)=4 yapar.

Bu, üçüncü girdiyi a(2)=8 yapar çünkü toplamda "dört" karakterin yazılması, sekiz kişinin toplam "sıfır dört" yazması gerekir.

Bu, dördüncü girişi a(3)=13 yapar çünkü toplam on üç için "sekiz" yazmak için beş karakter daha "sıfır dörtlü" yazmak.

Bu, beşinci girişi a(4)=21 yapar çünkü toplam yirmi bir kişinin "sıfır dörtlü" yazması için sekiz tane daha karakter yazması gerekir.

...ve bunun gibi. İşte ilk 100 giriş:

0, 4, 8, 13, 21, 27, 35, 44, 52, 59, 67, 75, 84, 93, 102, 112, 121, 130, 142, 152, 162, 171, 182, 193, 205, 216, 225, 235, 247, 259, 270, 282, 293, 305, 318, 331, 344, 357, 371, 384, 398, 412, 422, 432, 444, 456, 467, 479, 492, 503, 516, 526, 536, 548, 561, 571, 583, 597, 610, 620, 630, 642, 652, 662, 671, 682, 693, 705, 718, 731, 744, 757, 771, 784, 798, 812, 823, 836, 849, 862, 873, 888, 903, 916, 926, 936, 948, 961, 971, 983, 997, 1010, 1024, 1038, 1055, 1070, 1086, 1101, 1114, 1127

* Diğer diller ve / veya diğer üsler için veya elbette boşluklarla tanımlayabiliriz

Meydan okuma

n çıktısı verildiğinde , mümkün olduğunca az bayt kodda,

  • Dizinin ilk n terimi (negatif olmayan tamsayılar için çalışmalıdır)
  • a(n) değeri ( negatif olmayan tamsayılar için çalışmalıdır)
  • n inci dizisinin terimi (pozitif tamsayılar için çalışması gerekir - yani değeri a(n1) )

Bu bu nedenle baytlardaki en kısa cevap her dil için kazanır ve bayttaki en kısa cevap kazanır. Golf dillerinin pratik bir dil veya ezoterik bir dil olması nedeniyle favori dilinize girmenizi engellemesine izin vermeyin!


İlk seçenekle, 1) 1çıktı almalı [0]ve 0çıktı []veya 2) 0çıktı almalı mı [0](önceki cevabımda olduğu gibi)?
Outgolfer Erik

@EriktheOutgolfer İlk n terimini döndürmesi gerektiği için (1) demek istiyorum. Yani, seçenekler "sekansı a (n) 'ye kadar çıkarır," a çıkışı (n) çıkar "veya" a (n-1) çıkarır "dır.
Jonathan Allan

Yani, a (x) = a (x-1) + f (a (x-1)) burada f (x) x yazmak için gereken karakter miktarıdır?
FireCubez

@FireCubez evet, eğer bir (0) = 0 ve f (x) x'in rakamlarını yazmak için boşluk olmayan karakterler ise
Jonathan Allan

Yanıtlar:


12

Perl 6 , 45 bayt

{({[+] @_.join.uninames>>.comb X-6}...*)[$_]}

Çevrimiçi deneyin!

Rakamın adını doğrudan alabildiğiniz zaman fantezi modulolamaya gerek yok! Dizinin n'inci değerini döndüren anonim kod bloğu veya değerlerin listesini almak için bir aralıkta geçebilirsiniz

Açıklama:

{(                                     )[$_]}  # Index input into:
  {                               }...*        # An infinite sequence
                                               # Where each element is
   [+]   # The sum of
       @_.join  # All previous elements joined together
              .uninames  # The unicode names for each character
                         # These are names in the form "DIGIT ONE"
                       >>.comb  # Split each to lists of characters
                               X-6  # Subtract 6 from each

@JonathanAllan Ah, geri dönüş olarak sonsuz bir diziye izin verdiğini varsaymıştım, üzgünüm. Bunu düzeltirim
Jo King

Güzel, bu iyi :)
Jonathan Allan

Güzel! »bir bayt, değil mi? Ayrıca, [+]ikili ops nasıl indirgeyici olabilir ama sumaynı zamanda üç bayt ve en kısa olmayabilir ama emin en zarif golf imo çözümün geri kalanı ile ilgili şirin ve ipucu olabilir .
raiph

@raiph »iki bayt olduğundan değiştirilebilir.
Jo King

Belki bu hile ama Rakudo Latin1 kaynak kodunu doğru işlemiyor? Öyleyse, say '»'.encode('latin1').bytes görüntülendiğine dikkat edin 1. :)
raiph

8

JavaScript (ES6), 69 68 61 58 bayt

a(n) değerini döndürür .

f=(n,s=0)=>n?f(n-1,[...s+''].map(d=>s+=(d+10)%23%3+3)|s):s

Çevrimiçi deneyin!

Nasıl?

Bir rakam d sayıda dönüştürülür n harflerin:

n=(((d×100+10)mod23)mod3)+3

 d | *100 | +10 | MOD 23 | MOD 3 | +3 | word
---+------+-----+--------+-------+----+-------
 0 |    0 |  10 |   10   |   1   |  4 | zero
 1 |  100 | 110 |   18   |   0   |  3 | one
 2 |  200 | 210 |    3   |   0   |  3 | two
 3 |  300 | 310 |   11   |   2   |  5 | three
 4 |  400 | 410 |   19   |   1   |  4 | four
 5 |  500 | 510 |    4   |   1   |  4 | five
 6 |  600 | 610 |   12   |   0   |  3 | six
 7 |  700 | 710 |   20   |   2   |  5 | seven
 8 |  800 | 810 |    5   |   2   |  5 | eight
 9 |  900 | 910 |   13   |   1   |  4 | nine

Sayı basamaklı karakterlere bölündüğünden, yalnızca 10 ekleyerek (dize birleştirme olarak) d×100+10 işleyebiliriz .10



5

Pip , 21 bayt

Lai+:$+4335443554@^Pi

nn

açıklama

Lai+:$+4335443554@^Pi
                       a is 1st cmdline arg; i is 0 (implicit)
La                     Loop (a) times:
                   Pi   Print i
                  ^     Split it into a list of characters (i.e. digits)
       4335443554@      Use each digit to index into this number, giving the length of the
                        name of the digit (0 -> 4, 1 -> 3, etc.)
     $+                 Sum the results
  i+:                   Increment i by that amount

2
Bunu okudum large constant to the power of pive anıtsal olarak etkilendim. (Hala etkileyici, ama benim ilk yorum sadece .. devamı)
Οurous

4

Wolfram Dili (Mathematica) , 57 bayt

Nest[#+Tr@StringLength@IntegerName@IntegerDigits@#&,0,#]&

Çevrimiçi deneyin!

Tr@StringLength@IntegerName@IntegerDigits@#&rakamlarını listeler, #her birini İngilizce bir isme dönüştürür, uzunluğu sayar ve sonuçları toplar. Birçok şey listeler üzerinde iplik, çok heyecan verici. Sonra tanımı tekrar tekrar uygularız.

TIO, İnternet bağlantısı olmadığından şikayet ediyor, ancak neden olduğundan emin değilim, çünkü yine de doğru cevabı buluyor. Belki de tamsayıların adlarında güncelleme olup olmadığını kontrol ediyor?

bir(n)bir(0),bir(1),...,bir(n)NestNestList



4

05AB1E , 15 14 bayt

ÎFD•16\|/•sSèOO

Çevrimiçi deneyin!

açıklama

Î                # initialize stack with 0 and input
 F               # input times do:
  D              # duplicate the current number
         sSè     # and use one copy to index into
   •Qb₁ñ•        # 433544355
            OO   # sum digits and sum the stack

4

APL (Dyalog Unicode) , 29 28 bayt

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}

Çevrimiçi deneyin!

Dfn. Baskılarf(bennput)

APL Orchard'a yardım eden çocuklar için teşekkürler:

2 byte için @ngn; @ H.PWiz için 3 4 bayt.

Şimdi @ recursive formülünü kullanıyor.

Nasıl:

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}  Main fn

 {                     }⍣⍵⊢0  Starting with 0, repeat (⍣) the inner fn input times
      3+3|⌊3÷⍨4-2×⍎¨⍕⍵       @recursive's formula
  ⍵++/                       ⍝ Sum with the input.

3

Python 2 , 61 bayt

n=0
exec"for c in`n`:n+=(4-2*int(c))/3%3+3\n"*input()
print n

Çevrimiçi deneyin!

Özyinelemeli basamak sayısı eşlemesini kullanır .


Python 2 , 63 bayt

f=lambda n:n and f(n-1)+sum((4-2*int(c))/3%3+3for c in`f(n-1)`)

Çevrimiçi deneyin!

Özyinelemeli işlev sürümü. İki yinelemeli çağrısı olduğu için çalışması üstel zaman alıyor f(n-1).


Güzel! Daha önce bahsettiğiniz ifade bulma komut dosyasının bu ifadeyi bulup bulamayacağını merak ediyorum (ya da belki daha kısa olanı?)
Lynn

@Lynn Senaryoyu çalıştırdım ama daha iyisini bulamadım. 13 karakter tam bir arama için çok fazla ve en fazla 9 karakter uzunluğunda bir şey bulamadı. Ben kesip +3ve aritmetik işleçleri (bitsel yok) ve sayıları <= 4 ile sınırlı zaman, ben bu çözümü buldum ama eşdeğerler dışında daha kısa, hatta aynı uzunlukta hiçbir şey.
xnor

3

Python 2 , 71 bayt

f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or k

Çevrimiçi deneyin!


f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kaynı sayıdır, ancak bir ek listenin çıktısını almaktan kaçınır.
Jonathan Allan

Özyinelemenin algoritması staxx cevabından 2 bayt tasarruf gibi görünüyor. Bunu sevdim!
Jonathan Allan

3

MathGolf , 17 bayt

0\{_▒♀*♂+L%3%3+Σ+

Çevrimiçi deneyin!

Bu Arnauld'un yöntemini kullanır . Dizinin n'inci elemanı Çıkışlar .. boş dize için tamam değilse a(0), o zaman kaldırmak olabilir 0\başında.

Açıklama:

0\                 Setup 0 as the counter
  {                Loop input times
   _▒              Duplicate counter and split to list of digits
     ♀*            Multiply each element by 100
       ♂+          Add 10
         L%        Modulo by 23
           3%      Modulo by 3
             3+    Add 3
               Σ   Sum list
                +  And add to counter

3

Pyth , 21 bayt

u+Gs@L+L3jC\᯻3jGTQ0

Burada çevrimiçi deneyin .

u+Gs@L+L3jC\᯻3jGTQ0   Implicit: Q=eval(input()), T=10

u                Q0   Starting at 0, repeat the following Q times, with current value as G:
          C\᯻           Get character code 7163
         j   3          Convert the above to base 3, yields [1, 0, 0, 2, 1, 1, 0, 2, 2]
      +L3               Add 3 to each to generate digit length dictionary
              jGT       Get digits of G (convert to base 10)
    @L                  Lookup each value in the above in the dictionary, modular indexing
   s                    Take the sum
 +G                     Add G to the above

büyük olasılıkla Pyth'in kod sayfasında tek bir bayt değildir. (Buna 3 byte, ve bu durumda, UTF-8 kullanır düşünüyorum j7163 3aynı uzunluğa sahiptir; ama tio.run Pyth bir SBCS söylüyor Gizemli.!)
Lynn

@Lynn Kesinlikle haklısın, bayt sayısını unuturdum, kötüyüm. Şimdilik olduğu gibi kodu bırakacağım ve bayt sayısını güncelleyeceğim
Sok






1

J , 37 bayt

(+1#.|(3+3|23|10+100*]),.&.":)@]^:[&0

Çevrimiçi deneyin!

Arnauld'un yöntemini kullanır

Açıklama:

Argüman n

                                 ^:    - apply the verb on the left hand site
                                   [   - n times
                                    &0 - to a starting value 0
 (                             )@]     - calculate for the current value of the argument
                         ,.&.":        - convert to string and then each char to digit
        (3+3|23|10+100*])              - map each digit to its word length
       |                               - a filler for the fork
    1#.                                - sum the lengths 
   +                                   - add them to the current value

1

İlk yorumdan sonra düzenlendi.

Tüm terimleri yazdırır

Scala, 76 bayt

def^(n:Int)=(1 to n).scanLeft(0)((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Çevrimiçi deneyin!

Baskılar n inci dönem

Scala, 72 bayt

def^(n:Int)=Stream.iterate(0)(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)(n)

Scala, 69 bayt

def^(n:Int)=(0/:(1 to n))((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 bayt

def s(b:Int):Stream[Int]=b#::s(b+(b+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 bayt

val s:Stream[Int]=0#::s.map(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)

Çevrimiçi deneyin!


1
Scala'yı bilmiyorum, ama bunun ne bir program ne de fonksiyon olduğunu, daha ziyade bir pasaj olduğunu düşünüyorum (yani bir kez ntanımlandığında REPL üzerinde çalışıyor ). Scala'yı biliyorsanız muhtemelen düzeltmesi kolaydır. Ayrıca Scala sorusunda golf için yardımcı olabilecek bir ipucu olduğunu unutmayın . Son olarak bu bir online tercüman bir bağlantı sonrası güzel TIO Scala vardır ve PPCG üyelerinin bir çok tarafından kullanılır.
Jonathan Allan

1
@JonathanAllan, teşekkür ederim, çok yardımcı oldu.
Dr Y Wit
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.