Bir sayıyı genişletme


11

Bir sayıyı genişletme

Göreviniz 0'dan büyük bir tamsayıyı aşağıdaki şekilde genişletmektir:

Sayıyı ondalık basamaklara bölün ve her basamak için aşağıdaki kurallara göre bir liste oluşturun:

  • basamak tekse, liste basamakla başlar ve 1'e kadar iner;
  • basamak çiftse, liste basamakla başlar ve 9'a kadar çıkar.
  • basamak 0 ise liste boştur.

Rakamların altındaki tek sayılar ve çift olanlar için yukarıdaki tek sayılar için listeleri yazın. Daha sonra sütunları en üst düzeye getirin ve tamsayılar yapmak için her satırdaki rakamları toplayın. Son adım olarak, numaranın genişlemesini bulmak için sayıları toplayın.

34607 için uygulanan yukarıdaki kurallara bir örnek:

 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

İşte test senaryoları:

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

Bu , bu yüzden her dilde bayt en kısa cevaplar kazanır.


1
Girişi dize olarak alabilir miyiz? Veya bir rakam dizisi olarak mı?
Arnauld

@Arnauld Bir tamsayı olmalı ve bunu programınız / fonksiyonunuzla rakamlara bölmelisiniz
Galen Ivanov

@GalenIvanov Ama eğer girdi stdin'den geliyorsa, (teknik olarak bir dize olmasına rağmen) bunun iyi olduğunu düşünüyorum, değil mi?
Adám

@ Adám Evet, teknik olarak bir dize, bu yüzden sorun değil.
Galen Ivanov

Ben de burada böyle bir genişleme olacağını düşündük bu .
Mühendis Tost

Yanıtlar:


8

Jöle , 13 bayt

Dḟ0RrḂ?€9UZḌS

Pozitif tamsayıları alan ve döndüren monadik bir bağlantı.

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

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 bayt

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

Dene

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

Dene

Expanded:

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

Tam program gövdesi. STDIN'den giriş istenir. Sonucu STDOUT olarak yazdırır.

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

Çevrimiçi deneyin!

Son test durumunu doğru bir şekilde görüntülemek için, ⎕FR( F -noktası R eprestasyonu ) 128-bit Ondalık olarak ayarlanmış ve ⎕PP( P pint P recision) 34 haneye ayarlanmıştır.

 STDIN'den metin girişi istemi

⍎¨ her birini yürüt (her basamağı sayı olarak alır)

{ Her öğe için, bağımsız değişkenin temsil edildiği aşağıdaki işlevi uygulayın :

2|⍵: eğer tekse (yanıyorsa "eğer" bölünme 2'ye bölündüğünde kalır), o zaman:

   tersine çevirmek

  ɩ 1 ntegers kadar

   argüman

 Başka

×⍵: argüman pozitifse (lit. "if" signum), o zaman:

   tersine çevirmek

   argüman

  , bunu takiben

   tartışma

   öğeler düştü

  ⍳9ɩ ntegers 1'den 9 olana kadar

 Başka

   boş liste

 bu liste listesini sağda sıfırlarla doldurmak için tek bir matriste karıştırın (birleştirin)

 devrik

 bu matrisi bir liste listesine böl

0~⍨¨ her listeden tüm sıfırları kaldır

10⊥¨ her birini taban-10'dan normal sayılara dönüştürün (bu rakamları toplar)

+/ sayıları topla


2
Açıklamanız için teşekkürler. Sadece size APL kodu golf videosunda izledikten sonra kod golf keşfettiğimi bildirmek için.
Galen Ivanov

3

JavaScript (ES6), 88 83 82 bayt

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)

Not

9 - k < x || 9bir baytı fazla kaydeder 9 - k >= x && 9ancak eşitsizliğin doğrulanması 1yerine oluşturur 0. Eğer 1 > kdış üçlüde yanlış yolu tetiklemiş olsaydı bu bir problem olurdu . Ama bu demek olacak k = 0ve bu nedenle 9 - k = 9, 9 - k < xaynı zamanda sahip olamayız .

Test senaryoları

Not: JS numarası hassasiyetini aşan son test durumu kaldırıldı.



3

Java 11, 210 209 191 181 bayt

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

Tamam, bu oldukça uzun sürdü (ilk başta bir hata yaptım çünkü yanlış yaptığımı daha iyi anlamak için her adımı yazmak zorunda kaldım). Büyük olasılıkla biraz daha golf olabilir.

@Ceilingcat sayesinde -18 bayt .

Açıklama:

Burada deneyin.

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 bayt

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

Çevrimiçi deneyin!

açıklama

                      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)

Adımlar 34607argüman olarak nasıl ilerler :

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 , 153146 bayt

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

Çevrimiçi deneyin!

Bazen, golf sırasında sadece çöp olduğumu veya R olup olmadığını söyleyemem .... Kesinlikle ben, rakamları çıkarmanın başka bir yolunu hatırlatmış olan kullanıcı2390246 sayesinde 7 bayt kurtardı (kendimi önerdim) .

Son test senaryosunu almak için strtoiile değiştirebilirsiniz (bu yanlıştır); R yalnızca 32 bit tamsayılara sahiptir.as.double18406718084351604


N'yi bir tamsayı olarak alıp numaralarınızdan birini kullanarak rakamlara dönüştürerek biraz tasarruf edebilirsiniz! 146 bayt
user2390246

@ user2390246 biliyorsunuz, ben denedim, ama character->intben aradım :ve sonra strtoiyine de kullandığım zaman örtük dönüşüm kullanarak sabitlendi düşünüyorum !
Giuseppe

1

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

$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

Çevrimiçi deneyin!



1

05AB1E , 16 bayt

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Veya alternatif olarak:

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

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.