Rozwiń i zawrzyj


19

Jako wartość wejściową weź dodatnią liczbę całkowitą . Zacznij od i kilkakrotnie zwiększaj o największą moc całkowitą z dziesięciu tak, że i .kn:=1niini+nk

Powtarzaj do i zwróć listę wszystkich wartości pośrednich , w tym zarówno początkowego i końcowego .n=kn1k

Podczas tego procesu wzrost będzie początkowo ograniczany przez pierwszą nierówność, a dopiero później przez drugą; wzrost przybierze formę początkowego okresu „ekspansji”, podczas którego jest zwiększane o coraz większe moce, po czym następuje okres „kontraktu”, w którym jest zwiększany przez coraz mniejsze moce w celu „powiększenia” na prawidłowy numer.nn

Przypadki testowe

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]

To jest , więc wygrywa najkrótsza odpowiedź (w bajtach).


2
Czy możemy wydrukować liczby zamiast zwracać listę?
Adám

@ Adám Tak, możesz.
Esolanging Fruit

Odpowiedzi:


8

Haskell , 72 68 64 63 bajty

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

Wypróbuj online!

Dzięki Sriotchilism O'Zaic za -4 bajty!

Stosowanie

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]

Wyjaśnienie

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
Witamy w PPCG! Ładna pierwsza odpowiedź.
Arnauld

2
Nie znam Haskella, ale może jedna z tych wskazówek może pomóc: wskazówki dotyczące gry w golfa w Haskell i wskazówki dotyczące gry w golfa w <wszystkich językach> . Ale zgadzam się, miła odpowiedź. +1 ode mnie
Kevin Cruijssen

2
Witamy na stronie! Ponieważ (^)ma wyższy priorytet niż (+)nawiasy wokół (^)wyrażenia. To samo dotyczy (!)i(:)
Wheat Wizard

1
pred.length.show.min c$t-cmożna skrócić do length(show.min c$t-c)-1. Funkcje anonimowe są dopuszczalne, więc możesz zrezygnować z prowadzenia, f=jak wyjaśniono w naszym przewodniku po regułach gry w golfa w Haskell .
Laikoni

1
Zamiast strażników, można użyć tylko jeden przypadek i warunkowe: c!t=c: if t>c then (c+10^(length(show.min c$t-c)-1))!t else []. Pozwala to zastosować tę wskazówkę, aby zaoszczędzić jeszcze kilka bajtów: Wypróbuj online!
Laikoni

6

JavaScript (ES6), 50 bajtów

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

Wypróbuj online!

W jaki sposób?

Teoria

Następujące kroki są powtarzane, aż n=0 :

  • kn
  • kn10
  • x=10kn

Realizacja

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'


Pomysłowe, że możesz wykonać iterację „wstecz”, śledząc tylko jedną zmienną! Jest to trochę mylące, że używasz kczegoś zupełnie innego niż w opisie prowokacji (w istocie swojej njest mieszanką OP ni ki Twój xjest ich i.)
Ørjan Johansen


2

Perl 6 , 48 41 bajtów

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

Wypróbuj online!

Wyjaśnienie:

->\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 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. Drukuje liczby na osobnych liniach na standardowe wyjście.

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

Wypróbuj online!

{}∘1n

⍺=⍵kn

  k

  jeszcze:

  ⎕←⍵n

  ⍺-k

  ⍵,n

  10⍟log10

   piętro te

  ⌊/ minimum tych

  10* dziesięć podniesionych do potęgi tego

  ⍵+n

  ⍺∇kn


2

05AB1E , 15 bajtów

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

Port @PaulMutser „s (pierwszego) Haskell odpowiedź , więc upewnij się, aby go upvote !!

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Zwraca liczby rozdzielane znakiem nowej linii.
Jeśli to musi być lista, musiałbym dodać 3 bajty:

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Partia, 131 bajtów

@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

Pobiera dane wejściowe jako parametr wiersza polecenia i wysyła listę liczb do STDOUT. Wyjaśnienie:

@set/an=i=1

Zacznij od n=1i i=1reprezentujący siłę 10.

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

Pomnóż iprzez 10, jeśli nosiągnie następną potęgę 10.

@echo %n%

Podaj aktualną wartość n.

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

Powtórz, dopóki imożna go dodać nbez przekraczania wartości wejściowej.

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

Przywróć poprzednią wartość ni podziel iprzez 10.

@if %i% neq 0 goto c

Jeśli inie jest zerem wtedy spróbować dodać ido nponownie.


1

R , 67 65 bajtów

-2 bajty dzięki 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

Dość proste. Zabiera zestaw potęg 10 o wartości większej niż to, co byłoby potrzebne w odwrotnej kolejności i.

(Wolałbym używać i=10^rev(0:log10(k))zamiast tego, i=10^(k:0)ponieważ ten ostatni jest nieefektywny obliczeniowo, ale golf to golf!).

Następnie w pętli while stosuje warunki ii przyjmuje pierwszą (tj. Największą); aktualizuje ni dołącza do danych wyjściowych

Wypróbuj online!


1
Zapisz bajt używając Tzamiast n; powinno to być 2, ale nie sądzę, że TRUEjest to akceptowalne wyjście k=1, więc ustawiliśmy o=+T. Spróbuj!
Giuseppe

2
To straszne kodowanie, podoba mi się. nawiasem mówiąc, mogę ustawić o=1i uzyskać ten drugi bajt.
Aaron Hayman


1

Pip , 27 bajtów

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

Wypróbuj online!

W pseudokodzie:

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
}

Jestem bardzo zadowolony z trików golfowych, które mogłem zastosować, aby skrócić ten algorytm. Inicjując, aktualizując i drukując elementy w nagłówku pętli, uniknąłem konieczności używania nawiasów klamrowych dla korpusu pętli. Prawdopodobnie istnieje algorytm golfisty.


0

Japt , 18 bajtów

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

Spróbuj

Æ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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.