Développez un nombre

11

Développez un nombre

Votre tâche consiste à développer un entier supérieur à 0 de la manière suivante:

Divisez le nombre en chiffres décimaux et pour chaque chiffre, générez une liste selon ces règles:

  • si le chiffre est impair, la liste commence par le chiffre et descend à 1;
  • si le chiffre est pair, la liste commence par le chiffre et monte jusqu'à 9.
  • si le chiffre est 0, la liste est vide.

Notez les listes pour les nombres impairs sous les chiffres et au-dessus pour les nombres pairs. Ensuite, alignez les colonnes en haut et collectez les chiffres de chaque ligne pour créer des entiers. Comme dernière étape, additionnez les nombres pour trouver l'expansion du nombre.

Voici un exemple des règles ci-dessus appliquées au 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

Voici les cas de test:

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

C'est le , donc les réponses les plus courtes en octets dans chaque langue gagnent.

Galen Ivanov
la source
1
Pouvons-nous prendre l'entrée comme une chaîne? Ou comme un tableau de chiffres?
Arnauld
@Arnauld Ce doit être un entier, et le diviser en chiffres avec votre programme / fonction
Galen Ivanov
@GalenIvanov Mais si l'entrée provient de stdin, je suppose que c'est ok (même si techniquement une chaîne), non?
2017
@ Adám Oui, techniquement, c'est une chaîne, donc ça va.
Galen Ivanov
Et ici, je pensais que ce serait une expansion comme celle-ci .
Ingénieur Toast

Réponses:

8

Gelée , 13 octets

Dḟ0RrḂ?€9UZḌS

Un lien monadique prenant et retournant des entiers positifs.

Essayez-le en ligne! ou voir la suite de tests .

Comment?

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
la source
4

Perl 6 ,  68  66 octets

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

Essayez-le

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

Essayez-le

Étendu:

{  # 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
la source
3

APL (Dyalog) , 39 octets

Corps de programme complet. Demande l'entrée de STDIN. Imprime le résultat vers STDOUT.

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

Essayez-le en ligne!

Pour afficher le dernier cas de test correctement, ⎕FR( F loating point R ePresentation) a été réglé sur 128 bits décimal et ⎕PP( P Rint P recision) a été fixée à 34 chiffres.

 invite pour la saisie de texte de STDIN

⍎¨ exécuter chacun (obtient chaque chiffre sous forme de nombre)

{ Pour chaque élément, appliquez la fonction suivante où l'argument est représenté par :

2|⍵: s'il est impair (lit. "si" la division reste lorsqu'elle est divisée par 2), alors:

   sens inverse

   les ɩ ntegers de 1 à

   l'argument

 autre

×⍵: si l'argument est positif (lit. "if" signum), alors:

   sens inverse

   l'argument

  , suivi par

   argument

   éléments supprimés de

  ⍳9 les ɩ ntegers de 1 à 9

 autre

   liste vide

 mélanger (combiner) cette liste de listes en une seule matrice, avec des zéros à droite

 transposer

 diviser cette matrice en une liste de listes

0~⍨¨ supprimer tous les zéros de chaque liste

10⊥¨ convertir chacun de la base 10 en nombres normaux (cela recueille les chiffres)

+/ résumer les chiffres

Adam
la source
2
Merci pour ton explication. Juste pour vous faire savoir que j'ai découvert le golf de code après vous avoir regardé dans la vidéo de golf de code APL.
Galen Ivanov
3

JavaScript (ES6), 88 83 82 octets

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)

Remarque

9 - k < x || 9enregistre un octet 9 - k >= x && 9mais génère 1au lieu de 0si l'inégalité est vérifiée. Ce serait un problème s'il conduisait à 1 > k, déclenchant le mauvais chemin dans le ternaire externe. Mais cela signifierait cela k = 0et donc 9 - k = 9, nous ne pouvons donc pas avoir 9 - k < xen même temps.

Cas de test

NB: Suppression du dernier cas de test qui dépasse la précision du numéro JS.

Arnauld
la source
3

Java 11, 210 209 191 181 octets

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

D'accord, cela a pris un certain temps (principalement parce que j'ai fait une erreur au début, donc j'ai dû noter chaque étape pour mieux comprendre ce que j'ai fait de mal). Peut très probablement être joué au golf un peu plus.

-18 octets grâce à @ceilingcat .

Explication:

Essayez-le ici.

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
la source
2

Pip , 28 octets

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

Essayez-le en ligne!

Explication

                      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)

Comment les étapes se déroulent 34607comme argument:

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
la source
2

Pyth - 23 octets

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

Suite de tests .

Maltysen
la source
2

R , 153 146 octets

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

Essayez-le en ligne!

Parfois, je ne peux pas dire si je suis juste une poubelle au golf, ou si R est ... C'est certainement moi, j'ai économisé 7 octets grâce à user2390246, qui m'a rappelé une autre façon d'extraire les chiffres (que je me suis suggéré) .

Vous pouvez remplacer strtoipar as.doublepour obtenir 18406718084351604le dernier cas de test (ce qui est faux); R n'a que des entiers 32 bits.

Giuseppe
la source
Vous pouvez économiser un peu en prenant n comme un entier et en le convertissant en chiffres en utilisant l'une de vos astuces! 146 octets
user2390246
@ user2390246 vous savez, j'ai essayé cela, mais je pense que j'étais obsédé par l'utilisation de la conversion implicite character->intlorsque j'ai appelé :, puis utilisé strtoiquand même!
Giuseppe
1

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

$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

Essayez-le en ligne!

Xcali
la source
1

Python 2 , 131 octets

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

Essayez-le en ligne!

TFeld
la source
1

05AB1E , 16 octets

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

Essayez-le en ligne ou vérifiez tous les cas de test .

Ou bien:

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

Explication:

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
la source
1

Burlesque , 39 octets

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

Essayez-le en ligne!

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
la source