Expandir un número

11

Expandir un número

Su tarea es expandir un número entero mayor que 0 de la siguiente manera:

Divida el número en dígitos decimales y para cada dígito genere una lista de acuerdo con estas reglas:

  • si el dígito es impar, la lista comienza con el dígito y baja a 1;
  • si el dígito es par, la lista comienza con el dígito y sube a 9.
  • Si el dígito es 0, la lista está vacía.

Escriba las listas para los números impares debajo de los dígitos y arriba para los pares. Luego alinee las columnas y junte los dígitos en cada fila para formar enteros. Como paso final, sume los números para encontrar la expansión del número.

Aquí hay un ejemplo de las reglas anteriores aplicadas a 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

Aquí están los casos de prueba:

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

Este es el , por lo que ganan las respuestas más cortas en bytes en cada idioma.

Galen Ivanov
fuente
1
¿Podemos tomar la entrada como una cadena? ¿O como un conjunto de dígitos?
Arnauld
@Arnauld Debe ser un número entero y dividirlo en dígitos con su programa / función
Galen Ivanov
@GalenIvanov Pero si la entrada es de stdin, supongo que está bien (aunque técnicamente es una cadena), ¿verdad?
Adám
@ Adám Sí, técnicamente es una cadena, así que está bien.
Galen Ivanov el
Y aquí pensé que sería una expansión como esta .
Ingeniero Toast

Respuestas:

8

Jalea , 13 bytes

Dḟ0RrḂ?€9UZḌS

Un enlace monádico que toma y devuelve enteros positivos.

Pruébalo en línea! o ver el conjunto de pruebas .

¿Cómo?

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
fuente
4

Perl 6 ,  68  66 bytes

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

Intentalo

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

Intentalo

Expandido:

{  # 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
fuente
3

APL (Dyalog) , 39 bytes

Programa completo del cuerpo. Solicita la entrada de STDIN. Imprime el resultado en STDOUT.

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

Pruébalo en línea!

Para mostrar el último caso de prueba correctamente, ⎕FR( F loating punto R ePresentation) se ha establecido en 128 bits decimal y ⎕PP( P rint P recision) ha sido ajustada a 34 dígitos.

 solicitud de ingreso de texto desde STDIN

⍎¨ ejecutar cada uno (obtiene cada dígito como un número)

{ Para cada elemento, aplique la siguiente función donde el argumento está representado por :

2|⍵: si es impar (iluminado "resto" de división si se divide entre 2), entonces:

   marcha atrás

   los dedos desde 1 hasta

   el argumento

 más

×⍵: si el argumento es positivo (literalmente, "if" signum), entonces:

   marcha atrás

   el argumento

  , seguido por

   argumento

   elementos caídos de

  ⍳9 los los Ɩ ntegers desde 1 hasta 9

 más

   lista vacía

 mezclar (combinar) esta lista de listas en una única matriz, rellenando con ceros a la derecha

 transponer

 dividir esta matriz en una lista de listas

0~⍨¨ eliminar todos los ceros de cada lista

10⊥¨ Convierta cada uno de base-10 a números normales (esto recoge los dígitos)

+/ suma los números

Adán
fuente
2
Gracias por su explicación. Solo para hacerle saber que descubrí el código de golf después de verlo en el video de código de golf APL.
Galen Ivanov el
3

JavaScript (ES6), 88 83 82 bytes

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)

Nota

9 - k < x || 9guarda un byte encima 9 - k >= x && 9pero genera en 1lugar de 0si se verifica la desigualdad. Sería un problema si condujera a 1 > k, desencadenando el camino equivocado en el ternario externo. Pero significaría eso k = 0y 9 - k = 9, por lo tanto , no podemos tenerlo 9 - k < xal mismo tiempo.

Casos de prueba

Nota: Se eliminó el último caso de prueba que excede la precisión del número JS.

Arnauld
fuente
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, esto tomó bastante tiempo (principalmente porque cometí un error al principio, así que tuve que escribir cada paso para comprender mejor lo que hice mal). Lo más probable es que se pueda jugar más al golf.

-18 bytes gracias a @ceilingcat .

Explicación:

Pruébalo aquí.

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
fuente
2

Pip , 28 bytes

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

Pruébalo en línea!

Explicación

                      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)

Cómo proceden los pasos 34607como argumento:

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
fuente
2

Haskell , 106104 bytes

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

Pruébalo en línea!

Laikoni
fuente
2

R , 153146 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="")))

Pruébalo en línea!

A veces, no puedo decir si solo soy basura en el golf, o si R es ... Definitivamente soy yo, ahorré 7 bytes gracias al usuario2390246, quien me recordó otra forma de extraer dígitos (que me sugerí) .

Puede reemplazar strtoicon as.doublepara obtener 18406718084351604el último caso de prueba (que está mal); R solo tiene enteros de 32 bits.

Giuseppe
fuente
¡Puedes ahorrar un poco tomando n como un número entero y convirtiéndolo en dígitos usando uno de tus trucos! 146 bytes
usuario2390246
@ user2390246 ya sabes, lo intenté, pero creo que estaba obsesionado con el uso de la conversión implícita character->intcuando llamé :y luego lo usé de strtoitodos modos.
Giuseppe
1

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

$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

Pruébalo en línea!

Xcali
fuente
1

Python 2 , 131 bytes

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`)]))

Pruébalo en línea!

TFeld
fuente
1

05AB1E , 16 bytes

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

Pruébelo en línea o verifique todos los casos de prueba .

O alternativamente:

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

Explicación:

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
fuente
1

Burlesque , 39 bytes

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

Pruébalo en línea!

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
Muerteencarnado
fuente