ขยายและทำสัญญา


19

ใช้จำนวนเต็มบวกเป็นอินพุต เริ่มต้นด้วยและซ้ำ ๆ เพิ่มโดยอำนาจเลขที่ใหญ่ที่สุดในสิบของเช่นที่และkkn:=1niini+nk

ทำซ้ำจนกว่าและกลับรายการค่ากลางทั้งหมดในรวมทั้งเริ่มต้นและสุดท้ายkn=kn1k

ในระหว่างขั้นตอนนี้การเติบโตจะถูก จำกัด โดยความไม่เท่าเทียมในอดีตและหลังจากนั้นเท่านั้น การเติบโตจะอยู่ในรูปของระยะเวลา "การขยายตัว" เริ่มต้นในระหว่างที่ถูกเพิ่มโดยพลังที่มีขนาดใหญ่กว่าเดิมตามด้วยระยะเวลา "สัญญา" ในระหว่างที่ถูกเพิ่มขึ้นด้วยพลังที่เล็กลงเพื่อ "ซูมเข้า" ในหมายเลขที่ถูกต้องnn

กรณีทดสอบ

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]

นี่คือดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ


2
เราจะพิมพ์ตัวเลขแทนการส่งคืนรายการได้ไหม
Adám

@ Adámใช่คุณอาจ
แยกผลไม้

คำตอบ:


8

Haskell , 72 68 64 63 ไบต์

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

ลองออนไลน์!

ขอบคุณ Sriotchilism O'Zaic สำหรับ -4 ไบต์!

การใช้

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]

คำอธิบาย

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
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี
Arnauld

2
ผมไม่ทราบว่า Haskell แต่บางทีใด ๆ ของเคล็ดลับเหล่านี้อาจช่วยให้: เคล็ดลับสำหรับการเล่นกอล์ฟใน Haskellและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา> แต่ฉันเห็นด้วยคำตอบที่ดี +1 จากฉัน
Kevin Cruijssen

2
ยินดีต้อนรับสู่เว็บไซต์! เนื่องจาก(^)มีความสำคัญสูงกว่า(+)คุณไม่ต้องการวงเล็บใน(^)นิพจน์ กันไป(!)แล้ว(:)
ข้าวสาลีตัวช่วยสร้าง

1
pred.length.show.min c$t-clength(show.min c$t-c)-1สามารถลงไป ฟังก์ชั่นที่ไม่ระบุชื่อเป็นที่ยอมรับเพื่อให้คุณสามารถเลื่อนชั้นนำf=ที่อธิบายไว้ในของเราแนวทางในการเล่นกอล์ฟกฎใน Haskell
Laikoni

1
c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []แทนที่จะยามคุณสามารถใช้เพียงหนึ่งกรณีและเงื่อนไข: วิธีนี้ช่วยให้ใช้เคล็ดลับนี้เพื่อประหยัดอีกสองสามไบต์: ลองออนไลน์!
Laikoni

6

JavaScript (ES6), 50 ไบต์

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

ลองออนไลน์!

อย่างไร?

ทฤษฎี

ขั้นตอนต่อไปนี้ซ้ำจนกระทั่งn=0 :

  • ค้นหาหมายเลขkของศูนย์ต่อท้ายในการแทนทศนิยมของn
  • การลดลงkถ้าnเป็นกำลังที่แน่นอนของ10
  • ลบx=10kจากn

การดำเนินงาน

ค่าของ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'


คุณสามารถทำการวนซ้ำไปข้างหน้าเพื่อติดตามตัวแปรเพียงตัวเดียว! มันเป็นบิตสับสนที่คุณใช้kสำหรับสิ่งที่แตกต่างอย่างสิ้นเชิงกว่าในคำอธิบายความท้าทาย (ในความเป็นจริงของคุณnเป็นส่วนผสมของ OP ของnและkของคุณและxเป็นของพวกเขาi.)
Orjan ฮันเซน


2

Perl 6 , 48 41 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

->\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 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ พิมพ์ตัวเลขบนบรรทัดที่แยกกันไปยัง stdout

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

ลองออนไลน์!

{}∘1n

⍺=⍵kn

  k

  อื่น:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟log10

   ชั้นเหล่านั้น

  ⌊/ ขั้นต่ำของเหล่านั้น

  10* สิบยกกำลังของที่

  ⍵+n

  ⍺∇kn


2

05AB1E , 15 ไบต์

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

พอร์ตของ@PaulMutser (แรก) ตอบ Haskellดังนั้นอย่าลืมโหวตให้เขา !!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

ส่งออกตัวเลขที่กำหนดขึ้นบรรทัดใหม่
หากต้องเป็นรายการฉันจะต้องเพิ่ม 3 ไบต์:

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

ลองมันออนไลน์ หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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

แบตช์ 131 ไบต์

@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

รับอินพุตเป็นพารามิเตอร์บรรทัดคำสั่งและแสดงรายการตัวเลขไปยัง STDOUT คำอธิบาย:

@set/an=i=1

เริ่มต้นด้วยn=1และi=1เป็นตัวแทนของพลังของ 10

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

คูณiด้วย 10 ถ้าnถึงกำลังต่อไปของ 10

@echo %n%

nการส่งออกมูลค่าปัจจุบันของ

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

ทำซ้ำในขณะที่iสามารถเพิ่มได้nโดยไม่เกินอินพุต

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

กู้คืนค่าก่อนหน้าของnและหารiด้วย 10

@if %i% neq 0 goto c

หากiไม่เป็นศูนย์แล้วลองเพิ่มiไปnอีกครั้ง


1

R , 67 65 ไบต์

-2 ไบต์ขอบคุณ 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

ค่อนข้างง่าย มันต้องใช้ชุดของพลังของ 10 นอกเหนือจากสิ่งที่จะต้องการในลำดับที่กลับiกัน

(ฉันต้องการที่จะใช้i=10^rev(0:log10(k))แทนi=10^(k:0)เนื่องจากหลังมีประสิทธิภาพการคำนวณ แต่กอล์ฟคือกอล์ฟ!)

จากนั้นในขณะที่ลูปใช้เงื่อนไขiและใช้ครั้งแรก (เช่นที่ใหญ่ที่สุด); อัพเดตnและผนวกเข้ากับเอาต์พุต

ลองออนไลน์!


1
บันทึกไบต์โดยใช้Tแทนn; มันควรจะเป็น 2 แต่ฉันไม่คิดว่าTRUEเป็นที่ยอมรับสำหรับการส่งออกดังนั้นเราจึงตั้งk=1 ลองมัน! o=+T
จูเซปเป้

2
นั่นคือการเขียนโค้ดที่น่ากลัวฉันชอบมัน บังเอิญฉันสามารถตั้งค่าo=1และรับไบต์ที่สอง
Aaron Hayman


1

Pip , 27 ไบต์

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

ลองออนไลน์!

ใน 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
}

ฉันพอใจกับเทคนิคการตีกอล์ฟที่ฉันสามารถนำไปใช้เพื่อย่นอัลกอริทึมนี้ให้สั้นลง ด้วยการเริ่มต้นอัปเดตและพิมพ์สิ่งต่าง ๆ ในส่วนหัวของลูปฉันสามารถหลีกเลี่ยงการต้องใช้เครื่องมือจัดฟันแบบโค้งสำหรับตัวลูป อาจมีอัลกอริทึม golfier แม้ว่า


0

Japt , 18 ไบต์

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

ลองมัน

Æ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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.