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.

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


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)

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


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


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.


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

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).

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!


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).


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"


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


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 $_)


3

Java 61 bytes

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}

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.

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

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


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

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.


+1, nice use of pryr
shadowtalker

@ssdecontrol its pretty much staple replacement of function(x) :)
JAD


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

@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.


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))

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

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.



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

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

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

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.