Mở rộng và ký hợp đồng


19

Lấy một số nguyên dương k làm đầu vào. Bắt đầu với n: =1 và liên tục tăng n theo công suất nguyên lớn nhất của mười sao cho và .tôitôintôi+nk

Lặp lại cho đến khi và trả về danh sách tất cả các giá trị trung gian của , bao gồm cả ban đầu và cuối cùng .n= =kn1k

Trong quá trình này, ban đầu sự tăng trưởng sẽ bị giới hạn bởi sự bất bình đẳng trước đây và chỉ sau đó bởi sự bất bình đẳng trước đó; sự tăng trưởng sẽ ở dạng thời kỳ "mở rộng" ban đầu, trong đó được tăng thêm bởi các cường quốc ngày càng lớn hơn, sau đó là giai đoạn "hợp đồng", trong đó được tăng lên bởi các quyền lực nhỏ hơn để "phóng to" vào đúng sốnn

Các trường hợp thử nghiệm

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]

Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.


2
Chúng tôi có thể in các số thay vì trả về một danh sách?
Adám

@ Adám Có, bạn có thể.
Esolanging Fruit

Câu trả lời:


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

Hãy thử trực tuyến!

Cảm ơn Sriotchilism O'Z cổ cho -4 byte!

Sử dụng

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]

Giải trình

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
Chào mừng đến với PPCG! Câu trả lời đầu tiên tốt đẹp.
Arnauld

2
Tôi không biết Haskell, nhưng có lẽ bất kỳ lời khuyên nào trong số những lời khuyên này có thể giúp ích: mẹo chơi golf ở Haskellmẹo chơi golf bằng <tất cả các ngôn ngữ> . Nhưng tôi đồng ý, câu trả lời tốt đẹp. +1 từ tôi.
Kevin Cruijssen

2
Chào mừng đến với trang web! Vì (^)ưu tiên cao hơn (+)bạn không cần dấu ngoặc đơn xung quanh (^)biểu thức. Tương tự như vậy (!)(:)
Wheat Wizard

1
pred.length.show.min c$t-ccó thể rút ngắn thành length(show.min c$t-c)-1. Các chức năng ẩn danh có thể được chấp nhận, vì vậy bạn có thể bỏ vị trí hàng đầu f=như được giải thích trong hướng dẫn của chúng tôi về quy tắc chơi gôn trong Haskell .
Laikoni

1
Thay vì bảo vệ, bạn chỉ có thể sử dụng một trường hợp và một điều kiện : c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Điều này cho phép áp dụng mẹo này để tiết kiệm thêm một vài byte: Hãy thử trực tuyến!
Laikoni

6

JavaScript (ES6), 50 byte

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

Hãy thử trực tuyến!

Làm sao?

Học thuyết

Các bước sau được lặp lại cho đến khi n=0 :

  • tìm số k của các số 0 ở cuối biểu thị thập phân của n
  • giảm k nếu n là lũy thừa chính xác 10
  • trừ x=10k từ n

Thực hiện

Giá trị của x được tính trực tiếp dưới dạng một chuỗi với biểu thức sau:

+---- 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'

Lưu ý : Loại trừ hàng đầu '10'chỉ ảnh hưởng đến quyền hạn chính xác là 10 (ví dụ n=1000 ) nhưng không thay đổi số lượng các số 0 ở cuối được ghi cho các giá trị như n=102300 ( '10'thực tế là có thêm các chữ số khác không hoàn toàn không phù hợp trong những trường hợp như vậy).


Chú ý khéo léo bạn có thể thực hiện việc lặp lại "theo dõi" theo dõi chỉ một biến! Đó là một chút bối rối mà bạn sử dụng kcho một cái gì đó hoàn toàn khác nhau hơn trong mô tả thách thức (trong thực tế bạn nlà một kết hợp của của OP nkvà bạn xlà của họ i.)
Ørjan Johansen


2

Perl 6 , 48 41 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Chức năng tiền tố ẩn danh. In số trên các dòng riêng biệt để xuất bản.

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

Hãy thử trực tuyến!

{}∘1n

⍺=⍵kn

  k

  khác:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟đăng nhập10

   sàn những

  ⌊/ tối thiểu trong số đó

  10* mười tăng lên sức mạnh của điều đó

  ⍵+n

  ⍺∇kn


2

05AB1E , 15 byte

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

Câu trả lời của Haskell của @PaulMutser (đầu tiên) , vì vậy hãy đảm bảo nâng cao anh ấy !!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Xuất ra các dòng số giới hạn.
Nếu nó phải là một danh sách, tôi phải thêm 3 byte:

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

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Mẻ, 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

Đưa đầu vào dưới dạng tham số dòng lệnh và xuất danh sách các số thành STDOUT. Giải trình:

@set/an=i=1

Bắt đầu với n=1i=1đại diện cho sức mạnh của 10.

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

Nhân ivới 10 nếu nđã đạt đến sức mạnh tiếp theo là 10.

@echo %n%

Xuất giá trị hiện tại của n.

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

Lặp lại trong khi icó thể được thêm vào nmà không vượt quá đầu vào.

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

Khôi phục giá trị trước đó nvà chia icho 10.

@if %i% neq 0 goto c

Nếu ikhông bằng 0 thì thử thêm ivào nmột lần nữa.


1

R , 67 65 byte

-2 byte nhờ 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

Khá đơn giản. Nó cần một bộ sức mạnh 10 vượt quá những gì cần thiết theo thứ tự ngược lại i.

(Tôi thích sử dụng i=10^rev(0:log10(k)) thay vì i=10^(k:0)sau này là không hiệu quả về mặt tính toán, nhưng golf là golf!).

Sau đó, trong một vòng lặp while, áp dụng các điều kiện cho ivà lấy đầu tiên (nghĩa là lớn nhất); cập nhậtn và thêm vào đầu ra

Hãy thử trực tuyến!


1
Lưu một byte bằng cách sử dụng Tthay vì n; nó phải là 2 nhưng tôi không nghĩ đó TRUElà đầu ra chấp nhận được k=1, vì vậy chúng tôi đã đặt o=+T. Thử nó!
Giuseppe

2
Đó là mã hóa khủng khiếp, tôi thích nó. ngẫu nhiên, tôi có thể thiết lập o=1và lấy byte thứ hai.
Aaron Hayman


1

Pip , 27 byte

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

Hãy thử trực tuyến!

Trong mã giả:

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
}

Tôi khá hài lòng với các thủ thuật chơi gôn mà tôi có thể áp dụng để rút ngắn thuật toán này. Bằng cách khởi tạo, cập nhật và in các thứ trong tiêu đề vòng lặp, tôi có thể tránh được việc cần niềng răng xoăn cho thân vòng lặp. Có lẽ có một thuật toán golfier.


0

Japt , 18 byte

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

Thử nó

Æ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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.