Inteiros de saída em ordem negativa, aumente o número máximo máximo toda vez


44

Tarefa principal

Sua tarefa é imprimir números inteiros em ordem decrescente, iniciando em 1 e aumentando à medida que você continua pressionando 1 novamente, até que a entrada fornecida seja alcançada; depois, imprima o restante até pressionar 1 novamente. Exemplo com entrada 6:

1
21
321
4321
54321
654321
Without newlines (valid output):
121321432154321654321
Nota lateral: este é A004736 no OEIS. Além disso, o primeiro exemplo (com novas linhas) é uma saída inválida, conforme especificado nas regras.

Entrada

Seu código pode receber qualquer tipo de entrada (gráfica, STDIN) na forma de um número inteiro ou número.

Resultado

Seu código deve gerar a sequência descrita acima, até o número de entrada ser atingido, e terminar a saída até atingir 1 novamente. A saída pode ser qualquer coisa, portanto, números, seqüências de caracteres, números inteiros ou saída gráfica. É necessário imprimir um único número (sem novas linhas, se for uma sequência). Sua saída pode ser ampliada e ampliada com quantos caracteres você precisar (por exemplo []).

Como houve algum mal-entendido, aqui está um padrão de regex em que você pode testar suas saídas.

^(\D*(\d)+\D*)$

Regras

  • A saída deve ser um número inteiro, não dividido por nada, nem mesmo novas linhas.
  • O algoritmo não deve verificar para o primeiro exemplo de N aparecendo em qualquer forma (por exemplo, o 21na 121321), mas sim para o primeiro exemplo de N como o número real.
  • Uma única nova linha à direita é permitida.
  • O tratamento para entrada negativa é totalmente sua escolha; números negativos não são casos que você deve testar.

Casos de teste

Input: 6
Output: 121321432154321654321

Input: 1 Output: 1

Input: 26 Output: 121321432154321654321765432187654321987654321109876543211110987654321121110987654321131211109876543211413121110987654321151413121110987654321161514131211109876543211716151413121110987654321181716151413121110987654321191817161514131211109876543212019181716151413121110987654321212019181716151413121110987654321222120191817161514131211109876543212322212019181716151413121110987654321242322212019181716151413121110987654321252423222120191817161514131211109876543212625242322212019181716151413121110987654321

Input: 0 Output: 0, Empty, or Error

Input: 21 Output: 121321432154321654321765432187654321987654321109876543211110987654321121110987654321131211109876543211413121110987654321151413121110987654321161514131211109876543211716151413121110987654321181716151413121110987654321191817161514131211109876543212019181716151413121110987654321212019181716151413121110987654321

Obrigado @Emigna, usei seu algoritmo para calcular esses casos de teste.

Vencedora

O vencedor foi escolhido! Foi a resposta de ErikGolfer com impressionantes 5 bytes! Parabéns!


The output must be a full number ...Você quer dizer a sequência inteira ou apenas as diferentes substrings (1, 2-1, 3-1 ...)? Seu primeiro exemplo não parece corresponder a esta declaração.
precisa

1
Se a saída tiver que ser um único número, como pode ser "matrizes"?
SMLS

Essa matriz seria aceitável como saída? [1, 21, 321, 4321, 54321, 654321] Que tal este? [1,2,1,3,2,1,4,3,2,1,5,4,3,2,1,6,5,4,3,2,1] Ou você está falando apenas de matrizes com um único elemento, como [121321432154321654321]?
SMLS

1
Estou confuso sobre o formato de saída. Você pode dar exemplos do que é aceitável? Matriz de números? String com números separados por espaços?
Luis Mendo

1
Seu regex permite a saída de mickey321211mouse. Realmente as \Dpartes não têm razão para estar lá
edc65

Respostas:


13

Geléia , 5 bytes

RRUVV

Experimente online!

Fórmula não minha.

Eu suspeito que há muita coisa acontecendo aqui ...

[RESPOSTA ACEITADA] Eu daria cerca de 5 representantes a Dennis, mas isso não é Reputation Exchange. Dennis me mostrou o VVcomportamento. Para minha surpresa, isso é menor que 05AB1E.


Parabéns, este código tem a menor quantidade de código!
devRicher

19

05AB1E , 6 bytes

L€LíJJ

Experimente online!

Explicação

Exemplo de entrada 4

L       # range [1 ... input]
        # STACK: [1,2,3,4]
 €L     # map: range
        # STACK: [[1],[1,2],[1,2,3],[1,2,3,4]]
   í    # reverse each
        # STACK: [[1],[2,1],[3,2,1],[4,3,2,1]]
    J   # join inner lists
        # STACK: ['1','21','321','4321']
     J  # join list
        # OUTPUT: 1213214321

13

JavaScript (ES6), 37 bytes

f=(n,k=1)=>k>n?n--?f(n):'':f(n,k+1)+k

Demo

Método alternativo para n <10, 34 bytes (não concorrente)

f=(n,s='1')=>--n?s+f(n,++s[0]+s):s

No JavaScript, as strings são imutáveis. Portanto, é impossível alterar o conteúdo do enésimo caractere de uma string satribuindo um novo valor a s[N].

No entanto, a expressão ++s[N]é válida e é avaliada como seria de esperar, mesmo que a sequência permaneça inalterada. Por exemplo:

++"1"[0] // equals 2

E por extensão:

s = "21"
++s[0] + s // equals "321"

Não parece funcionar para n> 9
edc65

@ edc65 Você está certo, é claro. Não sei por que pensei que era bom parar às
9h

12

V, 29 28 27 23 19 17 16 bytes

8 bytes salvos graças a @DJMcMayhem

3 bytes salvos graças a @ nmjcman101

"apÀ­ñÄòy$jpkgJ

Personagens ocultos:

"apÀ<C-x>ñÄ<C-x>òy$jpkgJ

C-x é Ctrl + x.

Experimente online! recebe entrada por meio de argumentos da linha de comando

Hexdump:

0000000: 2261 70c0 adf1 c418 f279 246a 706b 674a  "ap......y$jpkgJ

Explicação

"ap            Paste the argument
À<C-x>         Argument minus 1 times (so that we exclude the 0)
ñ ... ò        Loop (for some weird reason the ò closes the ñ)
Ä<C-x>         paste current line above and decrement it

Agora parece:

1
2
...
n

contínuo...

ò             recursively do (until a breaking error)
y$             yank this line
  jp           paste it down
    kgJ        go up and join
              implicit ò end

GIF (desatualizado)

(para arg 6)

gif


Eu tenho alguns, alterando o seu ciclo para a) final implícita e b) juntar-se as linhas de como ela vai (ao invés de no final)òy$jpkgJ
nmjcman101

@ nmjcman101 Obrigado por me ajudar a economizar 2 bytes!
Kritixi Lithos

Isso é muito bem jogado. Estou atormentando meu cérebro há 20 minutos e não consigo pensar em nada mais curto. :)
DJMcMayhem

@DJMcMayhem É porque eu tive algum grande ajuda :)
Kritixi Lithos

Eu fiz isso! Você pode descer para 16 bytes. Se você colar o arg e depois duplicar / diminuir para cima, poderá remover o H. Então, se você usar o operador de decremento no seu À, não terá o 0 na parte superior para remover o x. APARENTEMENTE a òfechará um ­ñpara que você possa remover o segundo ­ñ(que é o byte que você salva). Link porque isso não fazia sentido #
nmjcman101

11

C #, 72 69 65 bytes

n=>{for(int i=0,j;i<n;)for(j=++i;j>0;)System.Console.Write(j--);}

Se a saída puder ser retornada, em vez de ser gravada no console

C #, 71 68 64 bytes

n=>{var s="";for(int i=0,j;i<n;)for(j=++i;j>0;)s+=j--;return s;}

Agradecemos a @VisualMelon por salvar muitos bytes

Teste aqui (com humor, o compilador on-line quebra em qualquer número acima de 420)


Isso foi muito rápido.
precisa

@devRicher O que posso dizer, eu estava esperando que algo fosse publicado: P
Alfie Goodacre

2
Nunca há uma razão para usar um loop while no código C # golf, um loop for sempre terá um desempenho tão bom quanto não melhor. Nesse caso, você pode incluir a atribuição de j=1no loop for e salvar um ponto e vírgula. Você também pode declarar jjunto com i, para salvar o int. Também i++pode ser movido para a j=iatribuição, salvando um byte. Você também deve poder substituir o i<=ncom i<nse o fizer j=++ie começar iem 0.
VisualMelon

O @VisualMelon editou, salvou 3 bytes! Declarando os ints juntos realmente não fez diferença para a contagem de bytes, mas faz os loops olhar um mais agradável pouco
Alfie Goodacre

@AlfieGoodacre se você os declarar juntos no loop for, você salvará mais 2 bytes for(int i=0,j;i<n;);) Também não há necessidade do {}loop for interno.
VisualMelon

8

Pure bash, 34

eval eval printf %s \\{{1..$1}..1}

Dois níveis de expansão de braçadeira. Com a entrada 6, o primeiro nível se expande para {1..1} {2..1} {3..1} {4..1} {5..1} {6..1}. Isso então se expande para 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 6 5 4 3 2 1, que é esmagado em uma string com printf %s. evalsão necessários nos dois níveis de expansão - para o primeiro nível, para que o $1parâmetro seja expandido primeiro e para o segundo nível, para que se expanda após o primeiro nível.

Experimente online


8

Perl, 21 bytes

Usa -Esem custo extra.

say map$}=$_.$},1..<>

Uso

perl -E 'say map$}=$_.$},1..<>' <<< 6
121321432154321654321

7

Pitão, 7 bytes

jks}R1S

Um programa que recebe a entrada de um número inteiro e imprime o resultado.

Experimente Online!

Como funciona

jks}R1S   Program. Input: Q
jks}R1SQ  Implicit input fill
    R     Map
      SQ  over [1, 2, 3, 4, ..., Q] with i:
   } 1     Yield [i, i-1, i-2, i-3, ..., 1]
  s       Merge
jk        Join
          Implicitly print

Pessoalmente, estou muito decepcionado com o jk_hC.:Stempo, mas é um bom trabalho!
FryAmTheEggman

7

GeoGebra , 67 bytes

1
InputBox[a]
Sum[Join[Sequence[Sequence[Text[j],j,i,1,-1],i,1,a]]]

Cada linha é inserida separadamente na barra de entrada. A entrada é obtida de uma caixa de entrada.

Aqui está um gif da execução:

Execução do programa

Como funciona

Entrando 1implicitamente atribui aa 1, eo InputBoxcomando associa uma caixa de entrada com a. Então, para cada ino {1, 2, 3, ..., a}, a lista {i, i-1, i-2, ..., 1}é criado usando o Sequencecomando, e cada um jnessa lista é convertida para uma string usando Text. Por fim, Joinmescla todas as listas e Sumconcatena todos os elementos em um objeto de texto, que é exibido.


@devRicher Isso parece razoável. Obrigado!
TheBikingViking


7

Retina , 26 22 bytes

A contagem de bytes assume a codificação ISO 8859-1.

.+
$*

$`¶
1
$.%'
0?¶

Experimente online!

Explicação

.+
$*

Converter entrada para unário.


$`¶

Em cada posição, insira o prefixo até esse ponto, bem como um avanço de linha. Isto cria um intervalo unária a partir 2de n+1, um valor por linha.

1
$.%'

Substitua cada um 1pelo número de caracteres depois na mesma linha. Isso transforma algo como 11111em 43210.

0?¶

Remova todos os feeds de linha e os zeros que os precedem.


5

Linguagem GameMaker, 65 bytes

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(c--)}return b

5

APL, 10 bytes

∊⍕¨∘⌽∘⍳¨∘⍳

Por exemplo:

      (∊⍕¨∘⌽∘⍳¨∘⍳)6
121321432154321654321

Explicação:

  • : obtenha os números de 1 a N.
  • ⍳¨∘: para cada um deles, obtenha os números de 1 a N.
  • ⌽∘: reverter essa lista
  • ⍕¨∘: obtém a representação de caractere de cada item (para que ele não produza os números com espaços entre eles)
  • : achatar a matriz resultante

Então, está analisando o código de trás para frente?
precisa

é função composição, dei a explicação na ordem em que as funções são realmente avaliadas
marinus

1
Aqui está a árvore de análise, para os curiosos: tryapl.org/…
marinus

5

Python 2, 71 68 bytes

Aposto que uma solução recursiva poderia ser mais curta, mas estou tendo dificuldade em formular isso em um.

n=input()
i=0
o=""
while i<n:
    i+=1;j=i
    while j:o+=`j`;j-=1
print o

Experimente online


5

Atualmente 8 bytes

RR♂RΣRεj

Publicando pela primeira vez uma resposta em Na verdade, provavelmente ela poderá jogar golfe.

Como funciona

Program takes implicit input, implicit print at EOF
R           Takes the input and creates a range (1, input)   
                STACK = [1,2,..,n]
 R          Reverse the top stack item (our range)
                STACK = [n,..,2,1]
  ♂R        For each item in our range, create a range (1, rangeitem)
                STACK = [[1,2,..,n], .., [1,2], [1]]
    Σ       Stitch the items of the list together
                STACK = [n,..,1,2,3,1,2,1]
     R      Reverse the top stack item again (our answer)
                STACK = [1,2,1,3,2,1,..n]
      εj    Create an empty string and append each item from the list to it.
            (turns non string items into strings)

Experimente online!


1
Eu não tenho certeza de que não é uma solução mais curto, mas eu tenho provado a mim mesmo errado antes. De qualquer forma, aqui está um link do Try It Online para sua resposta.
Sherlock9

1
O código R♂R♂RΣεjtem o mesmo número de bytes, mas pode ser mais fácil escrever uma explicação para.
Sherlock9

@ Sherlock9 seu caminho é um pouco mais elegante, adicionei o link e uma explicação que esqueci de adicionar ontem para tentar explicar um pouco mais.
Teal pelican

4

Braquilog , 8 bytes

yb@[rcw\

Experimente online!

Explicação

yb         The list [1, ..., Input]
  @[       Take a prefix of that list
    rc     Reverse it and concatenate into an integer
      w    Write to STDOUT
       \   Backtrack: try another prefix

4

Perl 6 , 22 bytes

{[~] flat [\R,] 1..$_}

Um lambda que retorna uma string.

( Experimente online. )

Explicação:

  • 1..$_: Intervalo de números inteiros ... (1 2 3 4)
  • [,] 1..$_: Reduza ("dobre") o operador de vírgula ... (1 2 3 4)
  • [\,] 1..$_: Com resultados intermediários ( redução triangular ) ...((1) (1 2) (1 2 3) (1 2 3 4))
  • [\R,] 1..$_: Aplique o meta-operador de reversão à vírgula ...((1) (2 1) (3 2 1) (4 3 2 1))
  • [~] flat ...: Remova o aninhamento de lista e dobre o operador concat de cadeia ... 1213214321

4

Haskell, 35 bytes

f x=[1..x]>>= \y->[y,y-1..1]>>=show

Exemplo de uso: f 6-> "121321432154321654321".

Para todos os números xem 1 ... xfazer uma lista x,x-1, ... ,1, transforme os números em uma sequência e concatená-los em uma única sequência. Mais uma vez, concatene essas cadeias em uma única cadeia.


4

C89, 54 bytes

i,j;f(n){for(i=1;j<=n;j=i++)while(j)printf("%d",j--);}

56 -2 = 54 graças a ErikGolfer!


Eu acho que você pode fazer em (j=i++)vez de (j=i)remover o último i++(não testado).
Erik the Outgolfer

Aqui está uma versão recursiva mais curta: i,j;f(n){j=++i;while(j)printf("%d",j--);i-n?f(n):0;}(52 bytes)
Steadybox

@Steadybox Você pode adicionar isso como sua própria resposta, se quiser, mas obrigado!
cat

@cat Ok, obrigado, acabou de fazer. Não tinha certeza se deveria, pois apenas editei sua solução.
Steadybox

4

Python 3, 87 92 83 74 bytes

lambda n:"".join(["".join([str(i)for i in range(1,k)][::-1])for k in range(1,n+2)])

Resposta mais curta usando recursão:

f=lambda n:f(n-1)+"".join([str(i)for i in range(1,n+1)][::-1])if n>0else""

Talvez não seja o mais curto, mas é feito apenas com a compreensão da lista do Python!

(Editado para adicionar a função de impressão e remover o \ n)

(Editado para remover a função de impressão e altere n + 1, k + 1 para n, k + 2)


Funciona com k, n + 2, mas não com k + 2, n, graças embora para a ideia :)
Sygmei

O código que você está marcando deve ser o primeiro. Além disso, você deve usar o Python 2 e depois usar em `i`vez de str(i). E você pode usar em "".join(...)vez de "".join([...])e range(1,k,-1)remover o [...][::-1].
mbomb007

Além disso, n>0pode ser n. E eu quis dizer range(n,0,-1). E use n and f(n-1)+...)or"".
mbomb007

1
62 bytes . Na verdade, isso pode estar chegando muito perto dessa resposta .
mbomb007

Sim, isso está chegando bem perto, eu vi que, depois de fazer minha segunda versão :(
Sygmei

3

Pitão, 8 bytes

jks_M._S

Explicação

jks_M._SQ   Implicit input
       SQ   Get the range [1, 2, ..., N]
     ._     Get each prefix
   _M       Reverse each prefix
jks         Join everything as a string


3

Mathematica, 36 bytes

ToString/@(""<>Range[Range@#,1,-1])&

Lança um monte de avisos que podem ser ignorados com segurança.

Explicação

Usando a entrada 5como um exemplo:

Range@#

Cria um intervalo {1, 2, 3, 4, 5}.

Range[...,1,-1]

Rangeé listável, para que possamos fornecer uma lista para qualquer um de seus argumentos e ele automaticamente encadeará esse argumento. Portanto, isso nos fornece várias listas invertidas:

{{1}, {2, 1}, {3, 2, 1}, {4, 3, 2, 1}, {5, 4, 3, 2, 1}}

Próximo:

(""<>...)

Isso une a lista aninhada à sequência vazia. Como a lista aninhada não contém realmente nenhuma sequência, ela não pode realmente associar os valores (que é onde os avisos são gerados), mas ""<>tem o efeito colateral de achatar a lista. Então isso nos dá

1 <> 2 <> 1 <> 3 <> 2 <> 1 <> 4 <> 3 <> 2 <> 1 <> 5 <> 4 <> 3 <> 2 <> 1

Agora vem o belo recurso do Mathematica que Mapnão se importa com a estrutura que está mapeando. Você normalmente o aplica a uma lista, mas funciona com qualquer cabeçalho. f /@ h[a, b, c]simplesmente te dá h[f[a], f[b], f[c]]. No nosso caso, a cabeça é StringJoine os valores são os números inteiros.

ToString/@...

Então isso simplesmente transforma os números inteiros em strings. Nesse ponto, StringJoin[...]sabe o que fazer com eles e une todos eles em uma única sequência:

"121321432154321"

1
Isso é simplesmente desagradável. :)
Greg Martin

3

GolfScript , 14 bytes

~,{),{)}%-1%}%

Experimente online!

Método usual, é claro, mas este é o GolfScript.

Explicação para este trecho de código VAST :

~,{),{)}%-1%}% # Code
               # Initial stack.      ["n"]
~              # Eval ToS.           [n]
 ,             # ToS' lowered range. [[0..n)]
  {),{)}%-1%}  # Block. 1 argument.  [a]
   )           # Increment.          [a+1]
    ,          # Range.              [[0..a)]
     {)}       # Block. 1 argument.  [b]
      )        # Increment.          [b+1]
        %      # Map.                [[1..a]]
         -1    # Integer. -1         [[1..a] -1]
           %   # Each nth element.   [[a..1]]
             % # Map.                [[[1],[2,1],...,[n..1]]]
               # Implicit output.    121...n..1

Observe que a saída é como um número único. À direita \n.


3

R, 38 33 44 bytes

if((n=scan())>0)for(i in 1:n)cat(i:1,sep="")

Leva entrada para STDIN e faz um loop de 1 a n, criando a sequência de 1 a 1 para cada etapa e imprimindo-a.

Editar: substituído seq(i,1)por i:1salvar 5 bytes e mostrar por que não devo jogar golfe durante as reuniões.


Isso produz 101se a entrada é 0. if((n=scan())>0)for(i in 1:n)cat(i:1,sep="")faz o truque.
Frédéric

Droga, entrada assumida diferente de zero :(
JAD

if(n<-scan())deve ser suficiente.
9788 Giuseppe

3

MATL , 14 11 bytes

:"@:P]v!VXz

Experimente online!

Explicação

:      % Input N implicitly. Push range [1 2 ...N]
"      % For each k in [1 2 ...N]
  @:   %   Push range [1 2 ... k]
  P    %   Reverse
]      % End
v!     % Concatenate all arrays horizontally
V      % Convert to string
Xz     % Remove spaces. Display implicitly

not split up by anything, não pense que o segundo é permitido.
19416 JAD

2
@JarkoDubbeldam eu vou excluir esse até o OP esclarecer #
Luis Mendo

1
@Jarko O OP esclareceu. A solução atual está em conformidade com as especificações
Luis Mendo

3

brainfuck, 17 bytes

>,[>[+.>]+.[<]>-]

Explicação

>           keep the first cell at 0
 ,          input of the decimal number into the cell
  [>        start a conditionnal loop and go to the next cell
   [+.>]    while it don't find 0, increment each cells and output the value
    +.      increment the new cell and output
     [<]    go to the first cell
      >-]   decrement the second cell and restart

Experimente online!


Bem-vindo ao PPCG! Você já leu a página da turnê e as meta-perguntas mais quentes ainda? Eu aconselho você, eles são úteis! Além disso, envolva seu código na formatação de código! Você leu a ajuda da formatação? Você também deve explicar como seu código funciona, se puder!
precisa saber é o seguinte

@muddyfish I acabou de adicionar a explicação
Milihhard

Eu usei um aplicativo móvel. Você pode ver a tela do resultado.
Milihhard

Não, está bem. Mas no link, a saída é em ASCII e não em decimal, então você realmente não vê a saída
Milihhard

@muddyfish Seu link permanente é um pouco confuso. Há um 0x06 invisível na entrada, seguido pelo dígito decimal 6 .
Dennis

3

Python , 63 57 59 bytes

Uma solução recursiva que funciona tanto em Python 2 quanto em 3. Isso provavelmente pode ser ainda mais complicado. Sugestões de golfe são bem-vindas! Experimente online!

Edit: -6 bytes graças a Jonathan Allan. +2 bytes com agradecimentos a mbomb007 por apontar um problema com minha resposta.

f=lambda n:n and f(n-1)+"".join(map(str,range(n,0,-1)))or""

Ungolfing

def f(n):
    s = ""
    for i in range(n+1):
        m = map(str, range(n, 0, -1))
        s += "".join(m)
    return s

2
Use a mappara salvar 6 bytes:lambda n:n and f(n-1)+"".join(map(str,range(n,0,-1)))or""
Jonathan Allan

2

PHP, 35 34 33 bytes

Salvei um byte porque eu desconectei, obrigado Titus! E outro!

while($i++<$argv[1])echo$s=$i.$s;

Execute da linha de comando com -r.

Resposta bastante simples, passa de 1 a nossa entrada n, alinhando o número no início da string e imprimindo-o.


Conto 34. Um byte mais curto com pós-incremento.
Titus

33 bytes:while($i++<$argv[1])echo$s=$i.$s;
aross

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.