Agrandir et contracter


19

Prenez un entier positif k en entrée. Commencez avec n:=1 et augmentez à plusieurs reprises n par la plus grande puissance entière de dix i telle que in et i+nk .

Répétez jusqu'à n=k et retournez une liste de toutes les valeurs intermédiaires de n , y compris le 1 initial et le k final .

Au cours de ce processus, la croissance sera initialement limitée par les premières inégalités, puis seulement par les secondes; la croissance prendra la forme d'une période initiale "d'expansion", pendant laquelle n est augmenté de puissances toujours plus grandes, suivie d'une période "contractuelle", pendant laquelle n est augmentée de puissances toujours plus petites afin de "zoomer" sur le bon numéro.

Cas de test

1 => [1]
10 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321 => [1,  2,  3,  4,  5,  6,  7,  8,  9,
        10, 20, 30, 40, 50, 60, 70, 80, 90,
        100, 200, 300, 310, 320, 321]
1002 => [1,   2,   3,   4,   5,   6,   7,   8,   9,
         10,  20,  30,  40,  50,  60,  70,  80,  90,
         100, 200, 300, 400, 500, 600, 700, 800, 900,
         1000, 1001, 1002]

Il s'agit de , donc la réponse la plus courte (en octets) l'emporte.


2
Pouvons-nous imprimer les chiffres au lieu de renvoyer une liste?
Adám

@ Adám Oui, vous le pouvez.
Esolanging Fruit

Réponses:


8

Haskell , 72 68 64 63 octets

f=(1!)
c!t|t==c=[c]|t>c=c:(c+10^(pred.length.show.min c$t-c))!t

Essayez-le en ligne!

Merci Sriotchilism O'Zaic pour -4 octets!

Usage

f 321
[1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,310,320,321]

Explication

c!t         -- c=current number, t=target number
 |t==c=[c]  -- Target is reached, return last number
 |t>c=c:(c+10^(pred.length.show.min c$t-c))!t
      c:                                        -- Add current number to list
                                min c$t-c       -- The minimum of the current number, and the difference between the current number and the target
                    length.show.                -- The length of this number
               pred.                            -- Minus 1
           10^(                          )      -- Raise 10 to this power
         c+                                     -- Add that to the current number
        (                                 )!t   -- Recursion

4
Bienvenue chez PPCG! Belle première réponse.
Arnauld

2
Je ne connais pas Haskell, mais peut-être que ces conseils pourraient vous aider: des conseils pour jouer au golf à Haskell et des conseils pour jouer au golf dans <toutes les langues> . Mais je suis d'accord, belle réponse. +1 de moi.
Kevin Cruijssen

2
Bienvenue sur le site! Étant donné (^)que la priorité est plus élevée que (+)vous n'avez pas besoin de parenthèses autour de l' (^)expression. Même chose pour (!)et(:)
Assistant du

1
pred.length.show.min c$t-cpeut être raccourci length(show.min c$t-c)-1. Les fonctions anonymes sont acceptables, vous pouvez donc supprimer le leader f=comme expliqué dans notre guide des règles de golf à Haskell .
Laikoni

1
Au lieu de gardes, vous pouvez utiliser un seul cas et sous condition: c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Cela permet d'appliquer cette astuce pour économiser quelques octets de plus: Essayez-le en ligne!
Laikoni

6

JavaScript (ES6), 50 octets

f=n=>n?[...f(n-(1+/(^10)?(0*$)/.exec(n)[2])),n]:[]

Essayez-le en ligne!

Comment?

Théorie

Les étapes suivantes sont répétées jusqu'à n=0 :

  • kn
  • kn10
  • x=10kn

la mise en oeuvre

x

+---- leading '1'
|
1 + /(^10)?(0*$)/.exec(n)[2]
     \____/\___/
        |    |
        |    +---- trailing zeros (the capturing group that is appended to the leading '1')
        +--------- discard one zero if n starts with '10'

'10'10n=1000n=102300'10'


Notez que vous pouvez faire l'itération "à l'envers" en gardant une seule variable! C'est un peu déroutant que vous utilisiez kpour quelque chose de complètement différent de la description du défi (en fait, vous êtes nun mélange d'OP net ket votre xest le leur i.)
Ørjan Johansen


2

Perl 6 , 48 41 octets

->\k{1,{$_+10**min($_,k-$_).comb/10}...k}

Essayez-le en ligne!

Explication:

->\k{                                   }  # Anonymous code block taking k
     1,                             ...k   # Start a sequence from 1 to k
       {                           }       # Where each element is
        $_+          # The previous element plus
           10**      # 10 to the power of
                           .comb     # The length of
               min($_,k-$_)          # The min of the current count and the remainder
                                /10  # Minus one

2

APL (Dyalog Unicode) , 30 octets SBCS

Fonction de préfixe tacite anonyme. Imprime les numéros sur des lignes distinctes vers la sortie standard.

{⍺=⍵:⍺⋄⍺∇⍵+10*⌊/⌊10⍟⍵,⍺-⎕←⍵}∘1

Essayez-le en ligne!

{}∘1n

⍺=⍵kn

  k

  autre:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟log10

   plancher ceux

  ⌊/ minimum de ceux

  10* dix élevé à la puissance de cette

  ⍵+n

  ⍺∇kn


2

05AB1E , 15 octets

1[=ÐIαD_#‚ßg<°+

Port de @PaulMutser 's (first) Haskell answer , so make to upvote it !!

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

Sort les nombres délimités par la nouvelle ligne.
S'il doit s'agir d'une liste, je devrais ajouter 3 octets:

X[DˆÐIαD_#‚ßg<°+}¯

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

Explication:

1             # Push a 1 to the stack
 [            # Start an infinite loop
  =           #  Print the current number with trailing newline (without popping it)
  Ð           #  Triplicate the current number
   Iα         #  Get the absolute difference with the input
     D        #  Duplicate that absolute difference
      _       #  If this difference is 0:
       #      #   Stop the infinite loop
      ‚ß      #  Pair it with the current number, and pop and push the minimum
        g   #  Calculate 10 to the power of the length of the minimum minus 1
           +  #  And add it to the current number



1

Lot, 131 octets

@set/an=i=1
:e
@if %n%==%i%0 set i=%i%0
@echo %n%
:c
@set/an+=i
@if %n% leq %1 goto e
@set/an-=i,i/=10
@if %i% neq 0 goto c

Prend l'entrée en tant que paramètre de ligne de commande et sort la liste des nombres vers STDOUT. Explication:

@set/an=i=1

Commencez par n=1et i=1représentant la puissance de 10.

:e
@if %n%==%i%0 set i=%i%0

Multipliez ipar 10 si na atteint la prochaine puissance de 10.

@echo %n%

Affiche la valeur actuelle de n.

:c
@set/an+=i
@if %n% leq %1 goto e

Répéter tout ipeut être ajouté nsans qu'il dépasse l'entrée.

@set/an-=i,i/=10

Restaurez la valeur précédente de net divisez ipar 10.

@if %i% neq 0 goto c

Si ce in'est pas zéro, essayez d'ajouter ià nnouveau.


1

R , 67 65 octets

-2 octets grâce à Giuseppe

k=scan();o=1;i=10^(k:0);while(T<k)o=c(o,T<-T+i[i<=T&i+T<=k][1]);o

Assez simple. Il faut un ensemble de pouvoirs de 10 au-delà de ce qui serait nécessaire dans l'ordre inverse i.

(Je préférerais utiliser i=10^rev(0:log10(k))plutôt que i=10^(k:0)puisque ce dernier est inefficace sur le plan des calculs, mais le golf c'est le golf!).

Ensuite, dans une boucle while, applique les conditions à iet prend la première (c'est-à-dire la plus grande); met à jour net ajoute à la sortie

Essayez-le en ligne!


1
Enregistrez un octet en utilisant Tau lieu de n; il devrait être de 2, mais je ne pense pas que ce TRUEsoit une sortie acceptable pour k=1, nous avons donc réglé o=+T. Essayez!
Giuseppe

2
C'est un horrible codage, j'aime ça. d'ailleurs, je peux définir o=1, et obtenir ce deuxième octet.
Aaron Hayman


1

Pip , 27 octets

Wa>Po+:y/t*Y1Ty>o|o+y>ay*:t

Essayez-le en ligne!

En pseudocode:

a = args[0]
o = 1
print o
while a > o {
  y = 1
  till y > o || o + y > a
    y *= 10
  o += y / 10
  print o
}

Je suis assez satisfait des astuces de golf que j'ai pu appliquer pour raccourcir cet algorithme. En initialisant, mettant à jour et imprimant des éléments dans l'en-tête de boucle, j'ai pu éviter d'avoir besoin d'accolades pour le corps de la boucle. Il y a probablement un algorithme de golfeur, cependant.


0

Japt , 18 octets

ÆT±ApTmTnU)sÊÉÃf§U

Essayez-le

ÆT±ApTmTnU)sÊÉÃf§U     :Implicit input of integer U
Æ                      :Map the range [0,U)
 T±                    :  Increment T (initially 0) by
   A                   :  10
    p                  :  Raised to the power of
     Tm                :    The minimum of T and
       TnU             :      T subtracted from U
          )            :    End minimum
           s           :    Convert to string
            Ê          :    Length
             É         :    Subtract 1
              Ã        :End map
               f       :Filter
                §U     :  Less than or equal to U


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.