Expandir e contratar

19

Tome um número inteiro positivo k como entrada. Iniciar com n:=1 e repetidamente aumentar n pela maior potência inteira de dez i tal que in e i+nk .

Repita até n=k e retorne uma lista de todos os valores intermediários de n , incluindo o 1 inicial e o k final .

Durante esse processo, o crescimento será inicialmente limitado pela desigualdade anterior e somente depois pela última; o crescimento assumirá a forma de um período inicial de "expansão", durante o qual n é aumentado por potências cada vez maiores, seguido de um período de "contrato", durante o qual n é aumentado por potências cada vez menores para "aumentar o zoom" no número correto.

Casos de teste

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]

Isso é , então a resposta mais curta (em bytes) vence.

Esolanging Fruit
fonte
2
Podemos imprimir os números em vez de retornar uma lista?
Adám 03/04
@ Adám Sim, você pode.
Esolanging Fruit 03/04

Respostas:

8

Haskell , 72 68 64 63 bytes

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

Experimente online!

Obrigado Sriotchilism O'Zaic por -4 bytes!

Uso

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]

Explicação

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
Paul Mutser
fonte
4
Bem-vindo ao PPCG! Ótima primeira resposta.
Arnauld
2
Não conheço Haskell, mas talvez alguma dessas dicas possa ajudar: dicas para jogar golfe em Haskell e dicas para jogar golfe em <todos os idiomas> . Mas eu concordo, boa resposta. +1 de mim.
Kevin Cruijssen em
2
Bem vindo ao site! Como (^)é uma precedência mais alta do que (+)você não precisa de parênteses à volta da (^)expressão. O mesmo vale para (!)e(:)
Wheat Wizard
1
pred.length.show.min c$t-cpode ser reduzido para length(show.min c$t-c)-1. As funções anônimas são aceitáveis; portanto, você pode abandonar a liderança, f=conforme explicado em nosso guia sobre regras de golfe em Haskell .
Laikoni 04/04
1
Em vez de guardas, você pode usar apenas um caso e uma condicional: c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Isso permite aplicar esta dica para economizar mais alguns bytes: Experimente online!
Laikoni 04/04
6

JavaScript (ES6), 50 bytes

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

Experimente online!

Quão?

Teoria

As etapas a seguir são repetidas até n=0 :

  • kn
  • kn10
  • x=10kn

Implementação

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'

Arnauld
fonte
Nota engenhosa, você pode fazer a iteração "para trás", mantendo o controle de apenas uma variável! É um pouco confuso que você usa kpara algo completamente diferente do que na descrição do desafio (na verdade o seu né uma mistura de OP de ne ke a sua xé a sua i.)
Ørjan Johansen
2

Perl 6 , 48 41 bytes

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

Experimente online!

Explicação:

->\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
Brincadeira
fonte
2

APL (Dyalog Unicode) , SBCS de 30 bytes

Função de prefixo tácito anônimo. Imprime números em linhas separadas para stdout.

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

Experimente online!

{}∘1n

⍺=⍵kn

  k

  outro:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟log10

   andar aqueles

  ⌊/ mínimo daqueles

  10* dez elevado ao poder desse

  ⍵+n

  ⍺∇kn

Adão
fonte
2

05AB1E , 15 bytes

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

Porto da (primeira) resposta Haskell de @PaulMutser , por isso não deixe de votar nele !!

Experimente online ou verifique todos os casos de teste .

Emite os números delimitados por nova linha.
Se fosse uma lista, eu teria que adicionar 3 bytes:

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

Experimente online ou verifique todos os casos de teste .

Explicação:

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
Kevin Cruijssen
fonte
1

Lote, 131 bytes

@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

Recebe a entrada como um parâmetro da linha de comando e gera a lista de números para STDOUT. Explicação:

@set/an=i=1

Comece com n=1e i=1representando a potência de 10.

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

Multiplique ipor 10 se ntiver atingido a próxima potência de 10.

@echo %n%

Emita o valor atual de n.

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

Repita enquanto ipode ser adicionado nsem exceder a entrada.

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

Restaure o valor anterior ne divida ipor 10.

@if %i% neq 0 goto c

Se inão for zero, em seguida, tente adicionar ia nnovamente.

Neil
fonte
1

R , 67 65 bytes

-2 bytes graças a 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

Bem simples. É preciso um conjunto de potências de 10 além do que seria necessário em ordem inversa i.

(Eu preferiria usar em i=10^rev(0:log10(k))vez de, i=10^(k:0)pois o último é computacionalmente ineficiente, mas o golfe é o golfe!).

Então, em um loop while, aplica as condições ie pega o primeiro (ou seja, o maior); atualizações ne anexa à saída

Experimente online!

Aaron Hayman
fonte
1
Salve um byte usando em Tvez de n; deve ser 2, mas não acho que TRUEseja uma saída aceitável k=1, então definimos o=+T. Tente!
Giuseppe
2
Essa é uma codificação horrenda, eu gosto. aliás, eu posso definir o=1e obter esse segundo byte.
Aaron Hayman
1

Pip , 27 bytes

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

Experimente online!

No pseudocódigo:

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
}

Estou bastante satisfeito com os truques de golfe que pude aplicar para encurtar esse algoritmo. Ao inicializar, atualizar e imprimir itens no cabeçalho do loop, eu pude evitar a necessidade de chaves para o corpo do loop. Provavelmente existe um algoritmo de golfe.

DLosc
fonte
0

Japonês , 18 bytes

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

Tente

Æ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
Shaggy
fonte
0

Prolog (SWI) , 142 bytes

L-D-M:-append(L,[D],M).
N-L-C-X-R-I:-I=1,C is X*10,N-L-C-C-R-1;D is C+X,(D<N,L-D-M,N-M-D-X-R-I;D>N,N-L-C-(X/10)-R-0;L-D-R).
N-R:-N-[]-0-1-R-1.

Experimente online!

Explicação que vem amanhã ou algo assim

Somente ASCII
fonte