Mở rộng số


11

Mở rộng số

Nhiệm vụ của bạn là mở rộng một số nguyên lớn hơn 0 theo cách sau:

Chia số thành các chữ số thập phân và cho mỗi chữ số tạo ra một danh sách theo các quy tắc sau:

  • nếu chữ số là số lẻ, danh sách bắt đầu bằng chữ số và giảm xuống 1;
  • nếu chữ số chẵn, danh sách bắt đầu bằng chữ số và tăng lên 9.
  • nếu chữ số là 0, danh sách trống.

Viết danh sách cho các số lẻ bên dưới các chữ số và ở trên cho các số chẵn. Sau đó, căn chỉnh hàng đầu các cột và thu thập các chữ số trong mỗi hàng để tạo số nguyên. Bước cuối cùng cộng các số để tìm sự mở rộng của số.

Dưới đây là ví dụ về các quy tắc trên được áp dụng cho 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

Dưới đây là các trường hợp thử nghiệm:

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

Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte trong mỗi ngôn ngữ sẽ giành chiến thắng.


1
Chúng ta có thể lấy đầu vào như một chuỗi? Hay như một mảng các chữ số?
Arnauld

@Arnauld Nó phải là một số nguyên và để chia nó thành các chữ số với chương trình / hàm của bạn
Galen Ivanov

@GalenIvanov Nhưng nếu đầu vào là từ stdin, tôi cho rằng điều đó ổn (mặc dù về mặt kỹ thuật là một chuỗi), phải không?
Adám

@ Adám Vâng, về mặt kỹ thuật đó là một chuỗi, vì vậy nó ổn.
Galen Ivanov

Và ở đây tôi nghĩ nó sẽ là một bản mở rộng như thế này .
Kỹ sư Toast

Câu trả lời:


8

Thạch , 13 byte

Dḟ0RrḂ?€9UZḌS

Một liên kết đơn lấy và trả về số nguyên dương.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

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 byte

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

Thử nó

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

Thử nó

Mở rộng:

{  # 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 byte

Toàn thân chương trình. Nhắc nhở cho đầu vào từ STDIN. In kết quả sang STDOUT.

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

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

Để hiển thị các trường hợp thử nghiệm cuối cùng một cách chính xác, ⎕FR( F loating điểm R epresentation) đã được thiết lập đến 128-bit Decimal và ⎕PP( P rint P recision) đã được thiết lập đến 34 chữ số.

 lời nhắc nhập văn bản từ STDIN

⍎¨ thực hiện từng (lấy mỗi chữ số là một số)

{...  cho mỗi yếu tố, áp dụng các chức năng sau đây đối số được đại diện bởi :

2|⍵: if lẻ (lit. "if" chia phần còn lại khi chia cho 2), thì:

   đảo ngược

   các ɩ ntegers từ 1 cho đến khi

   tranh luận

 khác

×⍵: nếu đối số là dương (nghĩa là "nếu" có nghĩa), thì:

   đảo ngược

   tranh luận

  , theo dõi bởi

   tranh luận

   các yếu tố giảm từ

  ⍳9 các sự ɩ ntegers từ 1 đến 9

 khác

   danh sách trống

 trộn (kết hợp) danh sách các danh sách này thành một ma trận đơn, đệm với các số không ở bên phải

 hoán vị

 chia ma trận này thành một danh sách các danh sách

0~⍨¨ xóa tất cả các số không trong mỗi danh sách

10⊥¨ chuyển đổi từng số từ số 10 thành số bình thường (số này thu thập các chữ số)

+/ tổng hợp các số


2
Cảm ơn bạn đã giải thích của bạn. Chỉ để cho bạn biết rằng tôi đã phát hiện ra mã golf sau khi xem bạn trong video golf mã APL.
Galen Ivanov

3

JavaScript (ES6), 88 83 82 byte

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)

Ghi chú

9 - k < x || 9lưu một byte qua 9 - k >= x && 9nhưng tạo ra 1thay vì 0nếu bất bình đẳng được xác minh. Nó sẽ là một vấn đề nếu nó dẫn đến 1 > k, gây ra con đường sai trong ternary bên ngoài. Nhưng nó có nghĩa là k = 0và do đó 9 - k = 9, vì vậy chúng ta không thể có 9 - k < xcùng một lúc.

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

NB: Đã xóa trường hợp kiểm tra cuối cùng vượt quá độ chính xác của số JS.



3

Java 11, 210 209 191 181 byte

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;}

Ok, điều này mất khá nhiều thời gian (chủ yếu là do tôi đã mắc lỗi lúc đầu, vì vậy phải viết ra từng bước để hiểu rõ hơn những gì tôi đã làm sai). Nhiều khả năng có thể được chơi golf nhiều hơn.

-18 byte nhờ @ceilingcat .

Giải trình:

Hãy thử nó ở đây.

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 byte

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

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

Giải trình

                      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)

Làm thế nào các bước tiến hành 34607như là đối số:

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 byte

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="")))

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

Đôi khi, tôi không thể biết mình chỉ là rác khi chơi golf, hay nếu R là .... Đó chắc chắn là tôi, đã lưu 7 byte nhờ người dùng2390246, người đã nhắc nhở tôi về một cách khác để trích xuất các chữ số (mà tôi tự đề xuất) .

Bạn có thể thay thế strtoibằng as.doubleđể lấy 18406718084351604cho trường hợp thử nghiệm cuối cùng (đó là sai); R chỉ có số nguyên 32 bit.


Bạn có thể tiết kiệm một chút bằng cách lấy n làm số nguyên và chuyển đổi thành chữ số bằng một trong những thủ thuật của mình! 146 byte
user2390246

@ user2390246 bạn biết đấy, tôi đã thử nó, nhưng tôi nghĩ rằng tôi đã được sửa bằng cách sử dụng chuyển đổi ngầm định character->intkhi tôi gọi :và sau đó sử dụng strtoi!
Giuseppe



1

05AB1E , 16 byte

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

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

Hay cách khác:

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

Giải trình:

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)

1

Burlesque , 39 byte

riXX:nz{J2dv{{9r@}{ro}}che!<-}m[tp)im++

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

ri      #Read as int
XX      #Return list of digits
:nz     #Filter for non-zero
{
 J2dv   #Divisible by 2?
 {
  {9r@} #Range a, 9
  {ro}  #Range 1, a
 }che!  #Run based on if divisible
 <-     #Reverse the range
}m[     #Apply to each digit
tp      #Transpose digits
)im     #Join each list into single int
++      #Sum each int
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.