Espandi e contrai


19

Prendi un intero positivo k come input. Inizia con n:=1 e aumenta ripetutamente n della potenza intera più grande di dieci i tale che i≤n e i+n≤k .

Ripetere fino a n=k e restituire un elenco di tutti i valori intermedi di n , inclusi sia 1 iniziale che k finale .

Durante questo processo, la crescita sarà inizialmente limitata dalla prima disuguaglianza e solo successivamente dalla seconda; la crescita assumerà la forma di un periodo iniziale di "espansione", durante il quale n viene aumentato da potenze sempre più grandi, seguito da un periodo di "contratto", durante il quale n viene aumentato da poteri sempre più piccoli al fine di "ingrandire" sul numero corretto.

Casi 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]

Questo è , quindi vince la risposta più breve (in byte).


2
Possiamo stampare i numeri invece di restituire un elenco?
— Adám,

@ Adám Sì, puoi.
— Esolanging Fruit

Risposte:


8

Haskell , 72 68 64 63 byte

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

Provalo online!

Grazie Sriotchilism O'Zaic per -4 byte!

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]

Spiegazione

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
Benvenuti in PPCG! Bella prima risposta.
— Arnauld,

2
Non conosco Haskell, ma forse qualcuno di questi suggerimenti potrebbe essere d'aiuto: consigli per giocare a golf a Haskell e consigli per giocare a golf in <tutte le lingue> . Ma sono d'accordo, bella risposta. +1 da me.
— Kevin Cruijssen,

2
Benvenuti nel sito! Poiché ha (^)una precedenza più alta di quella (+)che non è necessaria la parentesi attorno (^)all'espressione. Lo stesso vale per (!)e(:)
— frumento Wizard

1
pred.length.show.min c$t-cpuò essere abbreviato in length(show.min c$t-c)-1. Le funzioni anonime sono accettabili, quindi puoi lasciare il comando f=come spiegato nella nostra guida alle regole del golf in Haskell .
— Laikoni

1
Invece di guardie, è possibile utilizzare solo un caso e un condizionale: c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Ciò consente di applicare questo suggerimento per salvare qualche byte in più: provalo online!
— Laikoni,

6

JavaScript (ES6), 50 byte

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

Provalo online!

Come?

Teoria

I seguenti passaggi si ripetono fino a n=0 :

  • cerca il numero k di zeri finali nella rappresentazione decimale di n
  • decrementa k se n è una potenza esatta di 10
  • sottrai x=10k da n

Implementazione

Il valore di x viene calcolato direttamente come una stringa con la seguente espressione:

+---- 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'

Nota : l'esclusione del comando principale '10'influisce solo sui poteri esatti di 10 (ad es. n=1000 ) ma non modifica il numero di zeri finali catturati per valori come n=102300 (a causa delle cifre intermedie aggiuntive diverse da zero, '10'è in realtà non corrisponde affatto in tali casi).


Nota ingegnosa è possibile eseguire l'iterazione "indietro" tenendo traccia di una sola variabile! E 'un po' di confusione che si utilizza kqualcosa di completamente diverso rispetto alla descrizione sfida (in effetti il vostro nè un mix di OP del ne ke il vostro xè il loro i.)
— Ørjan Johansen


2

Perl 6 , 48 41 byte

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

Provalo online!

Spiegazione:

->\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 byte SBCS

Funzione prefisso tacito anonimo. Stampa numeri su righe separate su stdout.

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

Provalo online!

{}∘1n :

 ⍺=⍵Kn sono uguali:

  ⍺k

 ⋄ altro:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟ log10 di quelli

  ⌊ piano quelli

  ⌊/ minimo di quelli

  10* dieci elevato al potere di quello

  ⍵+ n più quello

  ⍺∇kn

 


2

05AB1E , 15 byte

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

La risposta di Haskell a Port of @PaulMutser , quindi assicurati di votarlo !!

Provalo online o verifica tutti i casi di test .

Emette i numeri di nuova riga delimitati.
Se deve essere un elenco, dovrei aggiungere 3 byte:

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

Provalo online o verifica tutti i casi di test .

Spiegazione:

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

Lotto, 131 byte

@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

Accetta l'input come parametro della riga di comando e restituisce l'elenco di numeri a STDOUT. Spiegazione:

@set/an=i=1

Inizia con n=1e i=1rappresenta la potenza di 10.

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

Moltiplicare iper 10 se nha raggiunto la potenza successiva di 10.

@echo %n%

Emette il valore corrente di n.

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

Ripeti finché ipuò essere aggiunto nsenza superare l'input.

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

Ripristina il valore precedente di ne dividi iper 10.

@if %i% neq 0 goto c

Se inon è zero, prova ad aggiungere idi nnuovo.


1

R , 67 65 byte

-2 byte grazie 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

Abbastanza semplice. Prende un insieme di poteri di 10 oltre a quello che sarebbe necessario in ordine inverso i.

(Preferirei usare i=10^rev(0:log10(k))invece dii=10^(k:0) dal momento che quest'ultimo è inefficiente dal punto di vista computazionale, ma il golf è golf!).

Quindi, in un ciclo while, applica le condizioni ie prende il primo (ovvero il più grande); si aggiorna ne aggiunge all'output

Provalo online!


1
Salvare un byte usando Tinvece di n; dovrebbe essere 2 ma non penso che TRUEsia un output accettabile per k=1, quindi abbiamo impostato o=+T. Provalo!
— Giuseppe,

2
Questo è un codice orribile, mi piace. per inciso, posso impostare o=1e ottenere quel secondo byte.
— Aaron Hayman,


1

Pip , 27 byte

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

Provalo online!

In pseudocodice:

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
}

Sono abbastanza soddisfatto dei trucchi del golf che sono stato in grado di applicare per abbreviare questo algoritmo. Inizializzando, aggiornando e stampando le cose nell'intestazione del loop, sono stato in grado di evitare di aver bisogno di parentesi graffe per il corpo del loop. Tuttavia, probabilmente esiste un algoritmo più golfista.


0

Japt , 18 byte

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

Provalo

Æ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


0

Prolog (SWI) , 142 byte

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.

Provalo online!

Spiegazione in arrivo domani o qualcosa del genere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.