ขยายจำนวน


11

ขยายจำนวน

งานของคุณคือการขยายจำนวนเต็มมากกว่า 0 ในลักษณะดังต่อไปนี้:

แบ่งตัวเลขออกเป็นทศนิยมและสำหรับแต่ละหลักสร้างรายการตามกฎเหล่านี้:

  • หากตัวเลขเป็นเลขคี่รายการจะเริ่มต้นด้วยตัวเลขและลดลงเหลือ 1
  • หากตัวเลขเป็นเลขคู่รายการจะเริ่มต้นด้วยหลักและสูงถึง 9
  • ถ้าตัวเลขเป็น 0 รายการนั้นจะว่างเปล่า

เขียนรายการสำหรับเลขคี่ด้านล่างตัวเลขและด้านบนสำหรับเลขคู่ จากนั้นจัดเรียงคอลัมน์ด้านบนและรวบรวมตัวเลขในแต่ละแถวเพื่อสร้างจำนวนเต็ม ในขั้นตอนสุดท้ายจะเพิ่มตัวเลขเพื่อค้นหาการขยายตัวของตัวเลข

นี่คือตัวอย่างของกฎข้างต้นที่ใช้กับ 34607:

 9          
 8          
 79         
 68         
 57         
346 7 ->  399 7 -> 3997 -> 9418
2   6     288 6    2886
1   5     177 5    1775
    4      66 4     664
    3      5  3      53
    2      4  2      42 
    1         1       1

นี่คือกรณีทดสอบ:

1: 1
2: 44
3: 6
44: 429
217: 1270
911: 947
2345: 26114
20067: 3450
34875632: 70664504
9348765347634763: 18406119382875401

นี่คือดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาที่ชนะ


1
เราสามารถรับอินพุตเป็นสตริงได้หรือไม่? หรือเป็นอาร์เรย์ของตัวเลข?
Arnauld

@Arnauld ต้องเป็นจำนวนเต็มและแยกเป็นตัวเลขด้วยโปรแกรม / ฟังก์ชั่นของคุณ
Galen Ivanov

@ GalenIvanov แต่ถ้าข้อมูลมาจาก stdin ฉันคิดว่ามันโอเค (แม้ว่าในทางเทคนิคแล้วจะเป็นสตริง) ใช่ไหม?
Adám

@ Adámใช่เทคนิคมันเป็นสตริงดังนั้นก็ตกลง
Galen Ivanov

และที่นี่ฉันคิดว่ามันจะขยายตัวเช่นนี้
Engineer Toast

คำตอบ:


8

เยลลี่ 13 ไบต์

Dḟ0RrḂ?€9UZḌS

ลิงก์ monadic ที่รับและส่งคืนจำนวนเต็มบวก

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

Dḟ0RrḂ?€9UZḌS - Link: positive integer           e.g. 702
D             - cast to a decimal list                [7,0,2]
  0           - literal zero                          0
 ḟ            - filter discard                        [7,2]
        9     - literal nine
       €      - for each:
      ?       -   if:
     Ḃ        -   ...condition: bit (modulo by 2)      1              ,0
   R          -   ...then: range ([1,...n])            [1,2,3,4,5,6,7],n/a
    r         -   ...else: inclusive range ([n,...9])  n/a            ,[2,3,4,5,6,7,8,9]
         U    - upend                                 [[7,6,5,4,3,2,1],[9,8,7,6,5,4,3,2]]
          Z   - transpose                             [[7,9],[6,8],[5,7],[4,6],[3,5],[2,4],[1,3],2]
           Ḍ  - cast from decimal lists               [79,68,57,46,35,24,13,2]
            S - sum                                   324

4

Perl 6 ,  68  66 ไบต์

{sum roundrobin(.comb».&{$_%2??($_...1)!!(9...+$_) if +$_})».join}

ลองมัน

{sum roundrobin(.comb».&{[R,] $_%2??1..$_!!$_..9 if +$_})».join}

ลองมัน

ขยาย:

{  # bare block lambda with implicit parameter 「$_」

  sum

    roundrobin( # grab from the sub lists in a round robin fashion

      .comb\             # split the input into digits
      ».&{               # for each digit do this

        [R,]             # reduce with reversed &infix:«,» (shorter than reverse)

              $_ % 2     # is the digit not divisible by 2?
          ??  1  .. $_   # from 1 to the digit
          !!  $_ ..  9   # from the digit to 9

        if +$_           # only do the above if the current digit isn't 0
                         # (has the effect of removing 0 from the list)
     }

    )».join     # join each of the sub-lists from roundrobin
}

3

APL (Dyalog) 39 ไบต์

โปรแกรมร่างกายเต็ม พร้อมต์สำหรับอินพุตจาก STDIN พิมพ์ผลลัพธ์ไปที่ STDOUT

+/10⊥¨0~⍨¨↓⍉↑{2|⍵:⌽⍳⍵⋄×⍵:⌽⍵,⍵↓⍳9⋄⍬}¨⍎¨⍞

ลองออนไลน์!

ในการแสดงกรณีทดสอบที่ผ่านมาได้อย่างถูกต้อง⎕FR( Fกระแสน้ำจุดR epresentation) ได้รับชุด 128 บิตทศนิยมและ⎕PP( P rint P recision) ได้รับการตั้งถึง 34 หลัก

 พรอมต์สำหรับการป้อนข้อความจาก STDIN

⍎¨ ดำเนินการแต่ละคน (รับแต่ละหลักเป็นตัวเลข)

{ สำหรับแต่ละองค์ประกอบให้ใช้ฟังก์ชั่นต่อไปนี้ที่มีการโต้แย้งโดย:

2|⍵: ถ้าคี่ (จุดนี้ "ถ้า" ส่วนที่เหลือจะหารเมื่อหารด้วย 2) ดังนั้น:

   ถอยหลัง

  ɩ ntegers ตั้งแต่วันที่ 1 จนกว่า

   อาร์กิวเมนต์

 อื่น

×⍵: หากอาร์กิวเมนต์เป็นค่าบวก (lit. "if" signum) ดังนั้น:

   ถอยหลัง

   อาร์กิวเมนต์

  , ติดตามโดย

   ข้อโต้แย้ง

   องค์ประกอบลดลงจาก

  ⍳9 ที่ɩ ntegers ตั้งแต่วันที่ 1 ถึงวันที่ 9

 อื่น

   รายการว่างเปล่า

 มิกซ์ (รวม) รายการของรายการนี้ในเมทริกซ์เดียวโดยเติมด้วยศูนย์ทางด้านขวา

 transpose

 แยกเมทริกซ์นี้เป็นรายการ

0~⍨¨ ลบศูนย์ทั้งหมดออกจากแต่ละรายการ

10⊥¨ แปลงจากเบส -10 เป็นตัวเลขปกติ (ซึ่งจะรวบรวมตัวเลข)

+/ รวมตัวเลข


2
ขอบคุณสำหรับคำอธิบายของคุณ เพียงเพื่อให้คุณรู้ว่าฉันค้นพบ code golf หลังจากดูคุณในวิดีโอ code APL golf
Galen Ivanov

3

JavaScript (ES6), 88 83 82 ไบต์

f=(n,k=0)=>k<9&&+[...n+''].map(x=>+x&&(x=x&1?x:9-k<x||9)>k?x-k:'').join``+f(n,k+1)

บันทึก

9 - k < x || 9บันทึกเป็นไบต์9 - k >= x && 9แต่สร้าง1แทนที่จะเป็น0ถ้าตรวจสอบความไม่เท่าเทียมกัน มันจะเป็นปัญหาถ้ามันนำไปสู่การ1 > kก่อให้เกิดเส้นทางที่ไม่ถูกต้องในด้านนอกประกอบไปด้วย แต่มันหมายถึงว่าk = 0ดังนั้น9 - k = 9เราจึงไม่สามารถมีได้9 - k < xในเวลาเดียวกัน

กรณีทดสอบ

NB: ลบกรณีทดสอบล่าสุดซึ่งเกินความแม่นยำของหมายเลข JS



3

Java 11, 210 209 191 181 ไบต์

n->{long r=0;var a="0".repeat(9).split("");for(int d:(n+"").getBytes())for(int k=0,x=d-48,y=9;x>0&(k<1||(d%2<1?y-->x:x-->1));a[k++]+=d%2<1?y:x);for(var q:a)r+=new Long(q);return r;}

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

-18 ไบต์ขอบคุณที่@ceilingcat

คำอธิบาย:

ลองที่นี่

n->{                             // Method with long as both parameter and return-type
  long r=0;                      //  Result-long `r`, starting at 0
  var a="0".repeat(9).split(""); //  String array `a`, filled with nine String zeroes
  for(int d:(n+"").getBytes())   //  Cast the input to a String,
                                 //   and loop over its codepoints as integers:
    for(int k=0,                 //   Row-index `k`, starting at
        x=d-48,                  //   Temp integer `x`, set to the current digit
        y=9                      //   Temp integer `y`, set to 9
        ;                        //   Inner loop, if:
         x>0                     //     The current digit is not a 0,
          &(k<1                  //     and if this is the first iteration,
             ||(d%2<1?           //     or if the digit is even:
                 y-->x           //      And `y` is larger than the digit
                                 //      (and afterwards decrease `y` by 1 with `y--`)
                :                //     or if the digit is odd:
                 x-->1));        //      And `x` is larger than 1
                                 //      (and afterwards decrease `x` by 1 with `x--`)
      a[k++]+=                   //    Append the current row with:
                                 //    (and afterwards increase `k` by 1 with `k++`)
       d%2<1?                    //     If the digit is even:
        y                        //      Append the row with `y`
       :                         //     Else (the digit is odd):
        x);                      //      Append the row with `x`
  for(var q:a)                   //  Loop over the String rows in the array:
    r+=new Long(q);              //   Convert it to a long, and add it to the result-sum
  return r;}                     //  Return the result

2

Pip , 28 ไบต์

J_MS(RV{a?a%2?\,aa,tl}Ma)ZDx

ลองออนไลน์!

คำอธิบาย

                      Ma      Map this function to the digits of the 1st cmdline arg:
        a?                     If digit != 0:
          a%2?                  If digit is odd:
              \,a                Inclusive-range(digit)
                 a,t            Else (digit is even), range from digit to 10 (exclusive)
                    l          Else (digit is 0), empty list
     RV{             }         Apply reverse to the result before returning it
                              This gives us a list of lists like [9 8 7 6] or [3 2 1]
    (                   )ZDx  Zip, with a default value of empty string
J_MS                          Use map-sum to join each sublist and sum the results
                              Autoprint (implicit)

วิธีดำเนินการตามขั้นตอน34607เป็นอาร์กิวเมนต์:

34607
[[1 2 3] [4 5 6 7 8 9] [6 7 8 9] [] [1 2 3 4 5 6 7]]
[[3 2 1] [9 8 7 6 5 4] [9 8 7 6] [] [7 6 5 4 3 2 1]]
[[3 9 9 "" 7] [2 8 8 "" 6] [1 7 7 "" 5] ["" 6 6 "" 4] ["" 5 "" "" 3] ["" 4 "" "" 2] ["" "" "" "" 1]]
[3997 2886 1775 664 53 42 1]
9418



2

R , 153 146 ไบต์

function(n,m=n%/%10^(nchar(n):0)%%10)sum(strtoi(apply(sapply(m[m>0],function(x)c(r<-"if"(x%%2,x:1,9:x),rep("",9-sum(r|1)))),1,paste,collapse="")))

ลองออนไลน์!

บางครั้งฉันไม่สามารถบอกได้ว่าฉันเป็นเพียงแค่ขยะที่สนามกอล์ฟหรือถ้า R คือ ....มันแน่นอนฉันบันทึก 7 ไบต์ขอบคุณผู้ใช้ 2390246 ผู้เตือนฉันถึงวิธีอื่นในการแยกตัวเลข (ที่ฉันแนะนำตัวเอง) .

คุณสามารถแทนที่strtoiด้วยas.doubleเพื่อรับ18406718084351604กรณีทดสอบครั้งล่าสุด (ซึ่งผิด); R มีจำนวนเต็ม 32 บิตเท่านั้น


คุณสามารถบันทึกได้นิดหน่อยโดยใช้ n เป็นจำนวนเต็มและแปลงเป็นตัวเลขโดยใช้หนึ่งในเทคนิคของคุณ! 146 bytes
user2390246

@ user2390246 คุณรู้ว่าฉันพยายาม แต่ฉันคิดว่าฉันได้รับการแก้ไขโดยใช้การแปลงโดยปริยาย character->intเมื่อฉันโทร:แล้วใช้strtoiแล้ว!
จูเซปเป้



1

05AB1E , 16 ไบต์

0KεDÈi9ŸëL]íõζJO

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

หรืออีกทางหนึ่ง:

0KεDÈ8*>Ÿ{R}õζJO
0Kε9Ÿ¬L‚yèR}õζJO

คำอธิบาย:

0K        # Remove all 0s from the (implicit) input-integer
  ε       #  Map each digit to:
   D      #   Duplicate the digit
    Èi    #   If it's even:
      9Ÿ  #    Pop and push a list in the range [digit, 9]
     ë    #   Else (the digit is odd):
      L   #    Pop and push a list in the range [1, digit]
  ]       # Close both the if-else statement and map
   í      # Reverse each inner ranged list
     ζ    # Zip/transpose, swapping rows and columns,
    õ     # with an empty string as filler
      J   # Join each inner list together
       O  # And sum that list
          # (after which the result is output implicitly)

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