Perluas nomor

11

Perluas nomor

Tugas Anda adalah memperluas bilangan bulat yang lebih besar dari 0 dengan cara berikut:

Membagi angka menjadi angka desimal dan untuk setiap digit menghasilkan daftar sesuai dengan aturan ini:

  • jika digitnya ganjil, daftar dimulai dengan digit dan turun ke 1;
  • jika digitnya genap, daftar dimulai dengan digit dan naik hingga 9.
  • jika digitnya 0, daftar kosong.

Tuliskan daftar untuk angka ganjil di bawah angka, dan di atas untuk angka genap. Kemudian luruskan kolom dan kumpulkan angka di setiap baris untuk membuat bilangan bulat. Sebagai langkah terakhir tambahkan angka untuk menemukan perluasan angka.

Berikut adalah contoh aturan di atas yang diterapkan ke 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

Berikut adalah contoh-contoh tesnya:

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

Ini adalah , jadi jawaban tersingkat dalam byte di setiap bahasa menang.

Galen Ivanov
sumber
1
Bisakah kita mengambil input sebagai string? Atau sebagai array angka?
Arnauld
@Arnauld Ini harus berupa bilangan bulat, dan untuk membaginya menjadi angka dengan program / fungsi Anda
Galen Ivanov
@ GalenIvanov Tetapi jika input dari stdin, saya kira itu ok (meskipun secara teknis sebuah string), kan?
Adem
@ Adám Ya, secara teknis ini adalah string, jadi tidak apa-apa.
Galen Ivanov
Dan di sini saya pikir ini akan menjadi ekspansi seperti ini .
Engineer Toast

Jawaban:

8

Jelly , 13 bytes

Dḟ0RrḂ?€9UZḌS

Tautan monadik yang mengambil dan mengembalikan bilangan bulat positif.

Cobalah online! atau lihat test-suite .

Bagaimana?

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
Jonathan Allan
sumber
4

Perl 6 ,  68  66 byte

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

Cobalah

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

Cobalah

Diperluas:

{  # 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
}
Brad Gilbert b2gills
sumber
3

APL (Dyalog) , 39 byte

Badan program penuh. Anjuran untuk input dari STDIN. Mencetak hasil ke STDOUT.

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

Cobalah online!

Untuk menampilkan kasus tes terakhir dengan benar, ⎕FR( F loating-titik R epresentation) telah ditetapkan untuk 128-bit Decimal dan ⎕PP( P etak P recision) telah ditetapkan untuk 34 digit.

 meminta input teks dari STDIN

⍎¨ jalankan masing-masing (dapatkan setiap digit sebagai angka)

{...  untuk setiap elemen, terapkan fungsi berikut di mana argumen diwakili oleh :

2|⍵: jika ganjil (lit. "jika" sisa pembagian bila dibagi 2), maka:

   membalikkan

   yang ɩ ntegers dari 1 sampai

   argumen

 lain

×⍵: jika argumennya positif (lit. "if" signum), maka:

   membalikkan

   argumen

  , diikuti oleh

   argumen

   elemen jatuh dari

  ⍳9 yang yang ɩ ntegers dari 1 sampai 9

 lain

   daftar kosong

 campur (gabungkan) daftar daftar ini ke dalam satu matriks, padding dengan nol di sebelah kanan

 mengubah urutan

 Bagi matriks ini menjadi daftar daftar

0~⍨¨ hapus semua nol dari setiap daftar

10⊥¨ konversi masing-masing dari basis-10 ke angka normal (ini mengumpulkan digit)

+/ jumlah angkanya

Adm
sumber
2
Terima kasih atas penjelasan Anda. Hanya untuk memberi tahu Anda bahwa saya menemukan kode golf setelah menonton Anda di video kode 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)

Catatan

9 - k < x || 9 menyimpan byte lebih dari 9 - k >= x && 9 tetapi menghasilkan 1alih-alih 0jika ketidaksetaraan diverifikasi. Ini akan menjadi masalah jika mengarah ke 1 > k, memicu jalur yang salah di terner luar. Tapi itu berarti itu k = 0dan karena itu 9 - k = 9, jadi kita tidak mungkin memiliki 9 - k < xpada saat yang sama.

Uji kasus

NB: Menghapus test case terakhir yang melebihi presisi nomor JS.

Arnauld
sumber
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, ini butuh waktu cukup lama (terutama karena saya membuat kesalahan pada awalnya, jadi harus menuliskan setiap langkah untuk lebih memahami apa yang saya lakukan salah). Kemungkinan besar bisa bermain golf lagi.

-18 byte terima kasih kepada @ceilingcat .

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
2

Pip , 28 byte

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

Cobalah online!

Penjelasan

                      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)

Bagaimana langkah-langkahnya 34607sebagai argumen:

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
DLosc
sumber
2

Pyth - 23 byte

siRT.Tm*!!d@,}9d}d1dsMz

Test Suite .

Maltysen
sumber
2

Haskell , 106 104 byte

import Data.List
f n=sum$map read$transpose$[reverse$[[c..'9'],['1'..c]]!!mod(read[c])2|c<-show n,c>'0']

Cobalah online!

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

Cobalah online!

Kadang-kadang, saya tidak tahu apakah saya hanya sampah di golf, atau jika R adalah .... Ini pasti saya, menyelamatkan 7 byte berkat pengguna2390246, yang mengingatkan saya pada cara lain untuk mengekstrak angka (yang saya sarankan sendiri) .

Anda dapat menggantinya strtoidengan as.doubleuntuk mendapatkan 18406718084351604test case terakhir (yang salah); R hanya memiliki bilangan bulat 32-bit.

Giuseppe
sumber
Anda dapat menghemat sedikit dengan mengambil n sebagai bilangan bulat dan mengonversi ke angka menggunakan salah satu trik Anda! 146 bytes
user2390246
@ user2390246, Anda tahu, saya mencobanya, tapi saya pikir saya terpaku pada penggunaan konversi implisit character->intketika saya menelepon :dan kemudian strtoitetap menggunakannya !
Giuseppe
1

Perl 5 , 120 + 1 ( -a) = 121 byte

$p=y/01357/ /r;$n=y/02468/ /r;map{$p=~s/9/ /g;$p=~s/\d/$&+1/ge;$n=~s/\d/$&-1/ge;$n=~s/0/ /g;@F=($p,@F,$n)}0..7;say for@F

Cobalah online!

Xcali
sumber
1

Python 2 , 131 byte

lambda n:sum(int(''.join(`n`for n in l if n))for l in map(None,*[range(n and(n%2*n or 9),(n%2<1)*~-n,-1)for n in map(int,`n*10`)]))

Cobalah online!

TFeld
sumber
1

05AB1E , 16 byte

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

Cobalah online atau verifikasi semua kasus uji .

Atau sebagai alternatif:

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

Penjelasan:

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)
Kevin Cruijssen
sumber
1

Burlesque , 39 byte

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

Cobalah online!

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
DeathIncarnate
sumber