Perluas dan Kontrak


19

Ambil bilangan bulat positif sebagai input. Mulailah dengan dan berulang kali tingkatkan oleh kekuatan bilangan bulat terbesar dari sepuluh sedemikian rupa sehingga dan .kn:=1niini+nk

Ulangi sampai dan kembalikan daftar semua nilai antara , termasuk awal dan akhir .n=kn1k

Selama proses ini, pertumbuhan pada awalnya akan dibatasi oleh ketidaksetaraan sebelumnya, dan hanya setelah itu oleh yang terakhir; pertumbuhan akan mengambil bentuk periode "ekspansi" awal, di mana ditingkatkan oleh kekuatan yang semakin besar, diikuti oleh periode "kontrak", di mana meningkat oleh kekuatan yang semakin kecil untuk "memperbesar" pada nomor yang benar.nn

Uji Kasus

1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1,  2,  3,  4,  5,  6,  7,  8,  9,
        10, 20, 30, 40, 50, 60, 70, 80, 90,
        100, 200, 300, 310, 320, 321]
1002 => [1,   2,   3,   4,   5,   6,   7,   8,   9,
         10,  20,  30,  40,  50,  60,  70,  80,  90,
         100, 200, 300, 400, 500, 600, 700, 800, 900,
         1000, 1001, 1002]

Ini adalah , jadi jawaban tersingkat (dalam byte) menang.


2
Bisakah kita mencetak angka alih-alih mengembalikan daftar?
Adám

@ Adám Ya, Anda bisa.
Buah Esolanging

Jawaban:


8

Haskell , 72 68 64 63 byte

f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t

Cobalah online!

Terima kasih Sriotchilism O'Zaic untuk -4 byte!

Pemakaian

f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]

Penjelasan

c!t         -- c=current number, t=target number
 |t==c=[c]  -- Target is reached, return last number
 |t>c=c:(c+10^(pred.length.show.min c$t-c))!t
      c:                                        -- Add current number to list
                                min c$t-c       -- The minimum of the current number, and the difference between the current number and the target
                    length.show.                -- The length of this number
               pred.                            -- Minus 1
           10^(                          )      -- Raise 10 to this power
         c+                                     -- Add that to the current number
        (                                 )!t   -- Recursion

4
Selamat datang di PPCG! Jawaban pertama yang bagus.
Arnauld

2
Saya tidak tahu Haskell, tapi mungkin tips ini mungkin membantu: tips untuk bermain golf di Haskell dan tips untuk bermain golf di <semua bahasa> . Tapi saya setuju, jawaban yang bagus. +1 dari saya.
Kevin Cruijssen

2
Selamat datang di situs ini! Karena (^)lebih diutamakan daripada (+)Anda tidak perlu tanda kurung di sekitar (^)ekspresi. Sama berlaku untuk (!)dan(:)
Wisaya Gandum

1
pred.length.show.min c$t-cdapat disingkat menjadi length(show.min c$t-c)-1. Fungsi anonim dapat diterima, sehingga Anda dapat melepaskan yang terdepan f=seperti dijelaskan dalam panduan kami tentang aturan golf di Haskell .
Laikoni

1
Alih-alih penjaga, Anda dapat menggunakan hanya satu kasus dan kondisional: c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Ini memungkinkan untuk menerapkan tip ini untuk menghemat beberapa byte lagi: Cobalah online!
Laikoni

6

JavaScript (ES6), 50 byte

f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:[]

Cobalah online!

Bagaimana?

Teori

Langkah-langkah berikut diulangi sampai :n=0

  • mencari angka dari trailing nol dalam representasi desimalkn
  • kn10
  • x=10kn

Penerapan

x

+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
     \____/\___/
        |    |
        |    +---- trailing zeros (the capturing group that is appended to the leading '1')
        +--------- discard one zero if n starts with '10'

'10'10n=1000n=102300'10'


Ingenious mencatat Anda dapat melakukan iterasi "mundur" melacak hanya satu variabel! Ini sedikit membingungkan yang Anda gunakan kuntuk sesuatu yang sama sekali berbeda dari dalam deskripsi tantangan (pada kenyataannya Anda nadalah campuran dari OP ndan kdan Anda xadalah mereka i.)
Ørjan Johansen


2

Perl 6 , 48 41 byte

->\k{1,{$_+10**min($_,k-$_).comb/10}...k}

Cobalah online!

Penjelasan:

->\k{                                   }  # Anonymous code block taking k
     1,                             ...k   # Start a sequence from 1 to k
       {                           }       # Where each element is
        $_+          # The previous element plus
           10**      # 10 to the power of
                           .comb     # The length of
               min($_,k-$_)          # The min of the current count and the remainder
                                /10  # Minus one

2

APL (Dyalog Unicode) , 30 byte SBCS

Fungsi awalan diam-diam anonim. Mencetak angka pada baris terpisah ke stdout.

{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1

Cobalah online!

{}∘1n

⍺=⍵kn

  k

  lain:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟log10

   lantai itu

  ⌊/ minimal itu

  10* sepuluh diangkat ke kekuatan itu

  ⍵+n

  ⍺∇kn


2

05AB1E , 15 byte

1[=ÐIαD_#‚ßg<°+

Port dari jawaban Haskell dari @PaulMutser (pertama) , jadi pastikan untuk membatalkannya !!

Cobalah secara online atau verifikasi semua kasus uji .

Output angka-angka baris baru dibatasi.
Jika harus daftar, saya harus menambahkan 3 byte:

X[DˆÐIαD_#‚ßg<°+}¯

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

1             # Push a 1 to the stack
 [            # Start an infinite loop
  =           #  Print the current number with trailing newline (without popping it)
  Ð           #  Triplicate the current number
   Iα         #  Get the absolute difference with the input
     D        #  Duplicate that absolute difference
      _       #  If this difference is 0:
       #      #   Stop the infinite loop
      ‚ß      #  Pair it with the current number, and pop and push the minimum
        g   #  Calculate 10 to the power of the length of the minimum minus 1
           +  #  And add it to the current number



1

Batch, 131 byte

@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c

Mengambil input sebagai parameter baris perintah dan menampilkan daftar angka ke STDOUT. Penjelasan:

@set/an=i=1

Mulailah dengan n=1dan i=1mewakili kekuatan 10.

:e
@if %n%==%i%0 set i=%i%0

Kalikan idengan 10 jika ntelah mencapai kekuatan 10 berikutnya.

@echo %n%

Keluarkan nilai saat ini dari n.

:c
@set/an+=i
@if %n% leq %1 goto e

Ulangi saat idapat ditambahkan ntanpa melebihi input.

@set/an-=i,i/=10

Kembalikan nilai sebelumnya ndan bagi idengan 10.

@if %i% neq 0 goto c

Jika itidak nol maka cobalah menambahkan iuntuk nlagi.


1

R , 67 65 byte

-2 byte terima kasih kepada Giuseppe

k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o

Cukup mudah. Dibutuhkan seperangkat kekuatan 10 di luar apa yang akan dibutuhkan dalam urutan terbalik i.

(Saya lebih suka menggunakan i=10^rev(0:log10(k))daripada i=10^(k:0)yang terakhir tidak efisien secara komputasi, tetapi golf adalah golf!).

Kemudian dalam loop sementara, menerapkan kondisi ke idan mengambil yang pertama (yaitu terbesar); pembaruan n, dan menambahkan ke keluaran

Cobalah online!


1
Simpan byte menggunakan Tbukan n; seharusnya 2 tetapi saya tidak berpikir itu TRUEadalah output yang dapat diterima k=1, jadi kami atur o=+T. Cobalah!
Giuseppe

2
Itu adalah coding yang menghebohkan, saya menyukainya. kebetulan, saya bisa mengatur o=1, dan mendapatkan byte kedua itu.
Aaron Hayman


1

Pip , 27 byte

Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t

Cobalah online!

Dalam pseudocode:

a = args[0]
o = 1
print o
while a > o {
  y = 1
  till y > o || o + y > a
    y *= 10
  o += y / 10
  print o
}

Saya cukup senang dengan trik golf yang saya bisa terapkan untuk mempersingkat algoritma ini. Dengan menginisialisasi, memperbarui, dan mencetak hal-hal di header loop, saya dapat menghindari membutuhkan kurung kurawal untuk badan loop. Mungkin ada algoritma pegolf.


0

Japt , 18 byte

ÆT±ApTmTnU)sÊÉÃf§U

Cobalah

ÆT±ApTmTnU)sÊÉÃf§U     :Implicit input of integer U
Æ                      :Map the range [0,U)
 T±                    :  Increment T (initially 0) by
   A                   :  10
    p                  :  Raised to the power of
     Tm                :    The minimum of T and
       TnU             :      T subtracted from U
          )            :    End minimum
           s           :    Convert to string
            Ê          :    Length
             É         :    Subtract 1
              Ã        :End map
               f       :Filter
                §U     :  Less than or equal to U


0

Prolog (SWI) , 142 byte

L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N-[]-0-1-R-1.

Cobalah online!

Penjelasan datang besok atau sesuatu

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.