Intercalar números de 1 a n, com os mesmos números invertidos

34

Um simples:

Pegue um número inteiro positivo n menor que 1000 e produza os números inteiros de 1 para n intercalados com os números inteiros de n para 1 . Você deve concatenar os números para que eles apareçam sem delimitadores entre eles.

Casos de teste:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Esse é o modo que o menor envio em bytes em cada idioma vence. As explicações são incentivadas.

Stewie Griffin
fonte

Respostas:

16

JavaScript (ES6), 30 bytes

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

Quão?

Isso é bastante simples, mas vale a pena notar que a corda é construída da cauda à cabeça. Uma string vazia no início é anexada por último e permite que a coerção do resultado final a uma string aconteça.

Abaixo está o detalhe da recursão para f(4):

f(4) =                                            // initial call
f(4, 1) =                                         // applying the default value to k
f(3, 2) + 4 + 1 =                                 // recursive call #1
(f(2, 3) + 3 + 2) + 4 + 1 =                       // recursive call #2
((f(1, 4) + 2 + 3) + 3 + 2) + 4 + 1 =             // recursive call #3
(((f(0, 5) + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =   // recursive call #4
((('' + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =        // n = 0 --> end of recursion
'' + 1 + 4 + 2 + 3 + 3 + 2 + 4 + 1 =              // final sum
'14233241'                                        // final result

Casos de teste

Arnauld
fonte
10

Python 2 , 46 bytes

lambda n:''.join(`x+1`+`n-x`for x in range(n))

Graças a ovs por 4 bytes

Experimente online!

Explicação:

lambda n:''.join(`x+1`+`n-x`for x in range(n))
lambda n:                                      # anonymous lambda taking one parameter n
                 `x+1`+`n-x`                   # `x` is repr(x) which is equivalent to str(x) for integers less than INT_MAX
                            for x in range(n)  # integers x in [0, n)
Mego
fonte
1
Dois bytes a mais no Python 3:f'{x}{n-~-x}'
L3viathan
2
@ L3viathan Esse é um novo recurso adicionado no 3.6.
Mego
1
Python 3.6 não é Python 3?
L3viathan
6
lambda n:''.join('x+1'+'n-x'for x in range(n))para 46 bytes. (substitua a 'compreensão na lista por
reticulares
6
@ovs hey, você pode escapar do backtick -> `\`x+1\``renderiza para`x+1`
Rod
8

-5 graças a Ørjan Johansen

Haskell , 33 bytes

f n=do a<-[1..n];[a,n-a+1]>>=show

Experimente online!

bartavelle
fonte
3
(1) Uma doexpressão é mais curta que >>=mais uma lambda. (2) No entanto, os shows podem ser combinados usando >>=show.
Ørjan Johansen
7

Bash , 25 bytes

printf %s`seq $1 -1 1|nl`

Experimente online!

Imprime seqüência decrescente, linhas numéricas aumentam e printf une linhas

Espaço delimitado, 20 bytes: seq $ 1 -1 1 | nl | xargs

marcosm
fonte
se isso não é aceitável que eu posso mudá-lo para seq $1 -1 1|nl|tr -d ' \n\t'8 bytes mais
marcosm
1
O envio de 20 bytes é inválido. Meu voto positivo é para o envio de 25 bytes.
Digital Trauma
Como o Digital Trauma observou, a solução de 20 bytes é inválida.
Erik the Outgolfer
time printf %s'seq 1000000 -1 1|nl'; grep name /proc/cpuinfo real 0m7.985s user 0m6.092s sys 0m0.392s model name : Intel(R) Pentium(R) D CPU 3.00GHz model name : Intel(R) Pentium(R) D CPU 3.00GHz
marcosm
7

R, 35 bytes

n=scan();cat(rbind(1:n,n:1),sep="")

Experimente online

rbind(1:n,n:1)cria uma matriz de 2 linhas com 1 a n na primeira linha e n a 1 na segunda. A catfunção recolhe esta matriz, lendo cada coluna.

user2390246
fonte
1
Observe que isso funciona apenas no modo interativo e requer que o usuário entre nna linha de comando (em vez de passar via stdin).
Shadowtalker
@ssdecontrol Sim, acho que isso geralmente é permitido, mas sou bastante novo aqui, pode estar errado.
User2390246
Eu acho que é geralmente aceitável, mas NB, para executá-lo corretamente no TIO, você deve colocar as entradas no campo Rodapé (e sempre é bom incluir um link!) Tio.run/nexus/…
Giuseppe
6

05AB1E , 6 5 bytes

Salva um byte usando o novo interleave interno, como sugerido por rev

LÂ.ιJ

Experimente online!

Explicação

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join
Emigna
fonte
Um usuário com o nome de rev sugerido LÂ.ιJ.
Jonathan Frech 6/03
@ JonathanFrech: Eu sei que o consenso agora é que podemos usar recursos mais recentes que o desafio, mas geralmente hesito em editar respostas antigas, porque um novo built-in conclui melhor o desafio. Há tantas respostas em tudo o que poderia ser melhorado dessa maneira :)
Emigna
Bem, eu era apenas o mensageiro; possível @rev deve postar sua própria resposta.
Jonathan Frech
@ JonathanFrech: Eu não quis dizer isso como uma censura. Rev fez isso corretamente quando sugeriu a edição, pois é melhor editar uma resposta existente do que postar uma nova sempre que uma nova incorporação for feita. Eu realmente deveria melhorar a correção de respostas antigas, pelo menos quando sugestões são feitas.
Emigna 7/03
4

CJam , 10 bytes

ri,:)_W%]z

Experimente online!

Explicação

ri   e# Read input and convert to integer N.
,    e# Turn into range [0 1 ... N-1].
:)   e# Increment to get [1 2 ... N].
_W%  e# Duplicate and reverse the copy.
]    e# Wrap both in an array to get [[1 2 ... N] [N ... 2 1]]
z    e# Transpose to get [[1 N] [2 N-1] ... [N-1 2] [N 1]]
     e# This list is printed implicitly at the end of the program,
     e# but without any of the array structure (so it's essentially flattened,
     e# each number is converted to a string and then all the strings
     e# are joined together and printed).
Martin Ender
fonte
4

Ruby , 29 bytes

->n{n.times{|x|$><<x+1<<n-x}}

Explicação:

->n{n.times{|x|                # x in range [0..n-1]
               $><<            # output on console
                   x+1<<n-x}}  # x+1, then n-x

Experimente online!

GB
fonte
4

Espaço em branco , 71 bytes

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Experimente online!

Explicação

sssn  ; push 0 - seed the stack with 0 (this will be our 1->n counter, a)
sns   ; dup
tntt  ; getnum - read n (stored on the heap)
sns   ; dup
ttt   ; retr - pull n onto the stack (this will be our n->1 counter, b)
nssn  ; label 'loop'
snt   ; swap - bring a to the top
ssstn ; push 1
tsss  ; add - increment a
sns   ; dup
tnst  ; putnum - output a as a number
snt   ; swap - bring b to the top
sns   ; dup
tnst  ; putnum - output b as a number
ssstn ; push 1
tsst  ; sub - decrement b
sns   ; dup
ntstn ; jez 'exit' if b is 0
nsnn  ; jmp 'loop'

As duas primeiras instruções são necessárias para configurar a pilha corretamente, os comandos de entrada do Whitespace gravam na pilha, portanto, precisamos copiar b (o valor de entrada) de volta na pilha. Começamos com a = 0, pois é mais curto declarar 0 em vez de 1 (salva um byte) e precisamos apenas reordenar a instrução de incremento para lidar. Depois disso, fazemos um loop e incrementamos a, produzimos a, produzimos a, diminuímos b, até que b atinja 0 (verificado após o decremento).

Ephphatha
fonte
isso poderia ser muito mais golfed se você removeu tudo o que espaços em branco: P
gato
4

Haskell, 65 48 47 bytes

1 byte economizado graças a Laikoni:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..][n,n-1..1]

6 bytes salvos graças a nimi:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]

Resposta e explicação anteriores:

f n=concatMap show$concatMap(\(l,r)->[l,r])(zip[1..n][n,n-1..1])

Já existe uma resposta melhor de Haskell aqui, mas eu sou novo no Haskell e no código de golfe, por isso posso postá-lo :)

Esta função fecha a lista [1..n] com seu reverso, resultando em uma lista de tuplas.

[(1,n),(2,n-1),(3,n-2)..(n,1)]

Em seguida, ele usa concatMappara mapear um lambda para esta lista de tuplas que resulta em uma lista de listas ...

[[1,n],[2,n-1],[3,n-2]..[n,1]]

... e concatena.

[1,n,2,n-1,3,n-2..n,1]

Em seguida, um final concatMapmapeia showa lista e concatena-a em uma única sequência.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"

Dan Ambrogio
fonte
2
A função infixa =<<é a mesma (dentro da lista mônade) como concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi 30/05
1
1) Sua solução atual é de apenas 48 bytes. 2) Você pode soltar o nem [1..n]: Experimente online!
Laikoni 31/05
1) Dang erros off-by-one ... 2) Boa chamada!
Dan Ambrogio
3

Pitão, 7 bytes

jksC_BS

Experimente online: Demonstração

Explicação:

jksC_BSQ   implicit Q (=input number) at the end
      SQ   create the range [1, ..., Q]
    _B     bifurcate by inversion, this gives [[1, ..., Q], [Q, ..., 1]]
  sC       zip and flatten result
jk         join to a string
Jakube
fonte
3

Oitava, 29 bytes

@(n)printf("%d",[1:n;n:-1:1])

Experimente online!

rahnema1
fonte
1
Minha implementação foi tão, muito mais longa! Agradável! =)
Stewie Griffin
3

Perl 6 , 20 bytes

{[~] 1..*Z~($_...1)}

Teste-o

Com uma entrada de 100000, isso leva aproximadamente 10 segundos, incluindo a compilação e a impressão da saída.

Expandido:

{                # bare block lambda with implicit parameter 「$_」

  [~]            # reduce using concatenation operator 「&infix:«~»」
                 # (shorter than 「join '',」)

    1 .. *       # Range from 1 to infinity

    Z~           # zip using concatenation operator

    ( $_ ... 1 ) # deduced sequence starting at the input
                 # going down to 1
}

As Z~necessidades são ~porque, caso contrário, gera uma lista de listas que serão stringify com espaços.

There is no need to limit the Range starting at 1, because Z stops when any of the input lists run out.
This saves two bytes (a space would be needed after $_)

Brad Gilbert b2gills
fonte
3

Java 61 bytes

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}
cheemcheem
fonte
2
Also, welcome to PPCG! :)
Stewie Griffin
We allow anonymous functions, so (int n)->{//for loop} should work here.
Nathan Merrill
Isto é melhor?
Cheemcheem # 30/17
2
Sim! Você pode colocar o seu System.out.print()na última instrução do loop for, mas fica complicado porque você está usando iduas vezes (e precisa incrementá-lo na expressão).
Nathan Merrill
Eu coloquei a impressão dentro do loop e incrementado i no último lugar possível então verificado com os casos de teste para se certificar de que funcionou, graças @NathanMerrill
cheemcheem
3

Gelatina , 5 bytes

RṚĖVV

Experimente online!

Como funciona

RṚĖVV  Main link. Argument: n

R      Range; yield [1, ..., n].
 Ṛ     Reverse; yield [n, ..., 1].
  Ė    Enumerate; yield [[1, n], ..., [n, 1]].
   V   Eval; convert each flat array to a string, interpret it as a Jelly program,
       and yield the output. This concatenates the integers in each pair, yielding
       a flat array of integers
    V  Repeat the previous step, concatenating the intgegers from before.
Dennis
fonte
3

Röda, 21 19 bytes

{seq 1,_<>seq _1,1}

Try it online!

This is an anonymous function that takes input from the stream.

Explanation

{seq 1,_<>seq _1,1}               Anonymous function, takes integer n from the stream
        <>                        Interleave
 seq 1,_                            the range 1 .. n with
          seq _1,1                  the range n .. 1
Kritixi Lithos
fonte
2

Clojure, 61 bytes

#(let[a(range 1(+ 1 %))](apply str(interleave a(reverse a))))

Literally does what is asked. I believe it can be outgolfed by a less trivial solution.

See it online

cliffroot
fonte
2

Aceto, 25 22 bytes

)&
pX`=
(pl0
id@z
r}Z)

Explanation:

We read an integer and put it on two stacks.

id
r}

On one, we call range_up (Z), on the other range_down (z), then we set a catch mark to be able to return to this place later:

  @z
  Z)

We then check if the current stack is empty and exit if so:

 X`=
  l0

Otherwise, we print from both stacks and jump back to the catch mark:

)&
p
(p
L3viathan
fonte
2

R, 41 bytes

pryr::f(for(i in 1:x){cat(i);cat(x-i+1)})

pryr::f() creates a function that takes one input. Loops over 1:x and prints each element of 1:x along with each element of x:1. Prints to STDOUT.

JAD
fonte
+1, nice use of pryr
shadowtalker
@ssdecontrol its pretty much staple replacement of function(x) :)
JAD
2

Brachylog, 10 9 bytes

⟦₁g↔ᶻczcc

Try it online!

Explanation

⟦₁           [1, …, Input]
  g↔ᶻc       [[1, …, Input],[Input, …, 1]]
      z      Zip
       cc    Concatenate twice
Fatalize
fonte
2

MATL, 13 11 9 bytes

2 bytes saved thanks to @Luis

:tPv1eVXz

Try it at MATL Online

Explanation

        % Implicitly grab input as a number, N
:       % Create an array from 1..N
tP      % Create a reversed copy
v       % Vertically concatenate the two
1e      % Reshape it into a row vector
V       % Convert to a string
Xz      % Remove whitespace and implicitly display
Suever
fonte
@LuisMendo Ah! I thought there was a function that removed whitespace but couldn't find it. Thanks!
Suever
2

PHP, 36 35 29 bytes

for(;$argn;)echo++$i,$argn--;

Saved one byte thanks to Jörg Hülsermann.
Saved six bytes thanks to Christoph.

user63956
fonte
3
Uhm... for(;$argn;)echo++$i,$argn--; ?
Christoph
2

Scala, 43 bytes

It's not the best but it's my first code golf.

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))
Phoenix
fonte
2

V, 20 bytes

ywo1@"­ñykPjñkògJ

Try it online!

Explain:

yw                    ' Copy the input number (for looping later)
  o1                 ' Insert a 1 under the input (on a newline)
     @"               ' [Copy register] number of times
       ­ñ      ñ       ' Do the thing inside of this loop
        ykP           ' Copy the current line and line above it, and paste above both
           j        ' decrement the current (top) number, and increment the one below
               k      ' Go to the top line
                ògJ   ' recursively join all of the lines
nmjcman101
fonte
2

Cubix, 17 bytes

....1I>sO)su.@?(O

Try it online!

cubified:

    . .
    . .
1 I > s O ) s u
. @ ? ( O . . .
    . .
    . .

Pushes 1, reads in the input (I), then enters the loop which swaps the top of the stack, outputs it, increments, swaps, outputs the top of the stack, decrements, and stops if the top of the stack is 0.

Giuseppe
fonte
2

MathGolf, 5 bytes

{îkï-

Try it online!

Explanation:

{      Run a for loop over implicit input
 î     Push 1 based index of loop
  k    Push inputted number
   ï-  Subtract 0 based index of loop
       Implicitly output all this joined together
Jo King
fonte
1
I've been able to find 13 programs of length 5 which yield the same result: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. However, I have not been able to find any program of length 4 or less. I haven't done a full search, but it is very probable that 5 bytes is optimal for MathGolf.
maxb
2

Common Lisp, 63 54 bytes

(lambda(n)(dotimes(i n)(format t"~a~a"(1+ i)(- n i))))

Try it online!

Renzo
fonte
2

Mouse-2002, 32 30 bytes

-2 moved conditional to start of loop (z.^ ... ) instead of (... z.0>^)

?n:n.z:(z.^a.1+a:a.!z.!z.1-z:)

Try it online!

Explanation:

?n:                                 ~ get input and store in n
   n.z:                             ~ copy n into z
       (z.^                         ~ stop if z equals 0
           a.1+a:                   ~ add 1 to a
                 a.!                ~ print a
                    z.!             ~ print z
                       z.1-z:)      ~ substract 1 from z
MooseOnTheRocks
fonte