Erweitern Sie eine Nummer


11

Erweitern Sie eine Nummer

Ihre Aufgabe ist es, eine Ganzzahl größer als 0 folgendermaßen zu erweitern:

Teilen Sie die Zahl in Dezimalstellen auf und erstellen Sie für jede Ziffer eine Liste nach folgenden Regeln:

  • Wenn die Ziffer ungerade ist, beginnt die Liste mit der Ziffer und geht auf 1 zurück.
  • Wenn die Ziffer gerade ist, beginnt die Liste mit der Ziffer und geht bis zu 9.
  • Wenn die Ziffer 0 ist, ist die Liste leer.

Notieren Sie die Listen für die ungeraden Zahlen unter den Ziffern und über den geraden. Richten Sie dann die Spalten oben aus und sammeln Sie die Ziffern in jeder Zeile, um Ganzzahlen zu bilden. Addieren Sie als letzten Schritt die Zahlen, um die Erweiterung der Zahl zu ermitteln.

Hier ist ein Beispiel für die oben genannten Regeln, die auf 34607 angewendet werden:

 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

Hier sind die Testfälle:

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

Dies ist , also gewinnen die kürzesten Antworten in Bytes in jeder Sprache.


1
Können wir Eingaben als Zeichenfolge verwenden? Oder als eine Reihe von Ziffern?
Arnauld

@Arnauld Es muss eine ganze Zahl sein, und um es mit Ihrem Programm / Ihrer Funktion in Ziffern aufzuteilen
Galen Ivanov

@GalenIvanov Aber wenn die Eingabe von stdin stammt, ist das wohl in Ordnung (obwohl technisch gesehen eine Zeichenfolge), oder?
Adám

@ Adám Ja, technisch gesehen ist es eine Zeichenfolge, also ist das in Ordnung.
Galen Ivanov

Und hier dachte ich, es wäre eine Erweiterung wie diese .
Ingenieur Toast

Antworten:


8

Gelee , 13 Bytes

Dḟ0RrḂ?€9UZḌS

Eine monadische Verbindung, die positive ganze Zahlen nimmt und zurückgibt.

Probieren Sie es online aus! oder sehen Sie sich die Testsuite an .

Wie?

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 Bytes

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

Versuch es

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

Versuch es

Erweitert:

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

Vollständiger Programmkörper. Fordert zur Eingabe von STDIN auf. Druckt das Ergebnis in STDOUT.

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

Probieren Sie es online aus!

Um den letzten Testfall korrekt anzuzeigen, wurde ⎕FR( F loating-point R- Darstellung) auf 128-Bit-Dezimal und ⎕PP( P rint P- Genauigkeit) auf 34 Stellen eingestellt.

 Eingabeaufforderung zur Texteingabe von STDIN

⍎¨ führe jede aus (erhält jede Ziffer als Zahl)

{… Wenden Sie  für jedes Element die folgende Funktion an, bei der das Argument dargestellt wird durch :

2|⍵: wenn ungerade (wörtlich "wenn" Teilungsrest, wenn durch 2 geteilt), dann:

   umkehren

   die ɩ ntegers von 1 bis

   das Argument

 sonst

×⍵: Wenn das Argument positiv ist (wörtlich "if" signum), dann:

   umkehren

   das Argument

  , gefolgt von

   Streit

   Elemente fallen aus

  ⍳9 die die ɩ ntegers von 1 bis 9

 sonst

   leere Liste

 Mischen (kombinieren) Sie diese Liste von Listen zu einer einzigen Matrix, wobei Sie rechts mit Nullen auffüllen

 transponieren

 Teilen Sie diese Matrix in eine Liste von Listen auf

0~⍨¨ Entfernen Sie alle Nullen aus jeder Liste

10⊥¨ konvertieren Sie jede von Basis-10 in normale Zahlen (dies sammelt die Ziffern)

+/ summiere die Zahlen


2
Ich danke Ihnen für Ihre Erklärung. Nur um Sie wissen zu lassen, dass ich Code Golf entdeckt habe, nachdem ich Sie im APL Code Golf Video gesehen habe.
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)

Hinweis

9 - k < x || 9spart ein Byte über 9 - k >= x && 9, generiert aber 1statt, 0wenn die Ungleichung überprüft wird. Es wäre ein Problem, wenn es dazu führen würde 1 > k, den falschen Pfad im äußeren Ternär auszulösen. Aber es würde das bedeuten k = 0und deshalb 9 - k = 9können wir unmöglich 9 - k < xgleichzeitig haben.

Testfälle

NB: Der letzte Testfall, der die Genauigkeit der JS-Nummer überschreitet, wurde entfernt.



3

Java 11, 210 209 191 181 Bytes

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, das hat eine ganze Weile gedauert (hauptsächlich, weil ich zuerst einen Fehler gemacht habe und jeden Schritt aufschreiben musste, um besser zu verstehen, was ich falsch gemacht habe). Kann höchstwahrscheinlich noch mehr Golf gespielt werden.

-18 Bytes dank @ceilingcat .

Erläuterung:

Probieren Sie es hier aus.

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 Bytes

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

Probieren Sie es online aus!

Erläuterung

                      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)

Wie die Schritte 34607als Argument ablaufen :

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 Bytes

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

Probieren Sie es online aus!

Manchmal kann ich nicht sagen, ob ich beim Golfen nur Müll bin oder ob R ... Ich bin es definitiv, der dank user2390246 7 Bytes gespart hat und mich an eine andere Möglichkeit erinnert hat, Ziffern zu extrahieren (die ich selbst vorgeschlagen habe). .

Sie können ersetzen strtoimit as.doublebekommen 18406718084351604für den letzten Testfall (was falsch ist ); R hat nur 32-Bit-Ganzzahlen.


Sie können ein wenig sparen, indem Sie n als Ganzzahl nehmen und mit einem Ihrer Tricks in Ziffern konvertieren! 146 Bytes
user2390246

@ user2390246 Sie wissen, ich habe das versucht, aber ich glaube, ich war darauf fixiert, die implizite Konvertierung zu verwenden, character->intals ich anrief :und dann strtoitrotzdem verwendete!
Giuseppe



1

05AB1E , 16 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Oder alternativ:

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

Erläuterung:

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

Burleske , 39 Bytes

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

Probieren Sie es online aus!

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.