Entrelacer des nombres de 1 à n, avec les mêmes numéros inversés

34

Un simple:

Prendre un entier positif n inférieur à 1000 et sortir les entiers de 1 à n entrelacés avec les entiers de n à 1 . Vous devez concaténer les nombres afin qu’ils apparaissent sans aucun séparateur entre eux.

Cas de test:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

C’est du donc la soumission la plus courte en octets dans chaque langue est gagnante. Les explications sont encouragées.

Stewie Griffin
la source

Réponses:

16

JavaScript (ES6), 30 octets

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

Comment?

C'est assez simple, mais il convient de noter que la chaîne est construite de la queue à la tête. Une chaîne vide au début est ajoutée en dernier et permet la coercition du résultat final sur une chaîne.

Ci-dessous le détail de la récursivité pour 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

Cas de test

Arnauld
la source
10

Python 2 , 46 octets

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

Merci aux ovs pour 4 octets

Essayez-le en ligne!

Explication:

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
la source
1
Deux octets de plus en Python 3:f'{x}{n-~-x}'
L3viathan
2
@ L3viathan C'est une nouvelle fonctionnalité ajoutée en 3.6.
Mego
1
Python 3.6 n'est pas Python 3?
L3viathan
6
lambda n:''.join('x+1'+'n-x'for x in range(n))pour 46 octets (remplace le 'dans la compréhension de la liste par des backticks)
ovs
6
@ovs hé, vous pouvez échapper au backtick -> `\`x+1\``rend à`x+1`
Rod
8

-5 grâce à Ørjan Johansen

Haskell , 33 octets

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

Essayez-le en ligne!

Bartavelle
la source
3
(1) Une doexpression est plus courte que >>=plus un lambda. (2) Cependant, les shows peuvent être combinés en utilisant >>=show.
Ørjan Johansen
7

Bash , 25 octets

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

Essayez-le en ligne!

Imprime une séquence décroissante, augmente le nombre de lignes et printf joint les lignes

Espace délimité, 20 octets: seq $ 1 -1 1 | nl | xargs

marcosme
la source
si ce n'est pas acceptable, je peux le changer pour seq $1 -1 1|nl|tr -d ' \n\t'8 octets de plus
Marcosm
1
La soumission de 20 octets est invalide. Mon vote positif concerne la soumission de 25 octets.
Trauma numérique
Comme l'a noté Digital Trauma, la solution à 20 octets est invalide.
Erik l'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 octets

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

Essayez-le en ligne

rbind(1:n,n:1)crée une matrice à 2 lignes avec 1 à n dans la première ligne et n à 1 dans la seconde. La catfonction réduit cette matrice en lisant chaque colonne.

utilisateur2390246
la source
1
Notez que cela ne fonctionne qu'en mode interactif, et oblige l'utilisateur à entrer nsur la ligne de commande (au lieu de passer par stdin).
shadowtalker
@ssdecontrol Oui, je pense que c'est généralement autorisé, mais je suis assez nouveau ici, je peux me tromper.
user2390246
Je pense que c'est généralement acceptable, mais NB, pour le faire fonctionner correctement dans TIO, vous devez mettre les entrées dans le champ Pied de page (et il est toujours bon d'inclure un lien!) Tio.run/nexus/…
Giuseppe
6

05AB1E , 6 5 octets

Enregistré un octet en utilisant le nouvel entrelacement intégré comme suggéré par rev

LÂ.ιJ

Essayez-le en ligne!

Explication

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join
Emigna
la source
Un utilisateur du nom de rev suggéré LÂ.ιJ.
Jonathan Frech
@ JonathanFrech: Je sais que le consensus à présent est que nous pouvons utiliser des fonctionnalités plus récentes que le défi, mais j'hésite généralement à modifier les anciennes réponses, car une nouvelle fonction intégrée complète mieux le défi. Il y a tellement de réponses dans tout ce qui pourrait être amélioré de cette façon :)
Emigna
Eh bien, je n'étais que le messager; possible @rev devrait poster sa propre réponse.
Jonathan Frech
@ JonathanFrech: Je ne le pensais pas comme un reproche. Rev l'a fait correctement quand il a suggéré l'édition, car il est préférable d'éditer une réponse existante plutôt que d'en publier une nouvelle à chaque nouvelle création intégrée. Je devrais vraiment mieux résoudre les anciennes réponses, du moins lorsque des suggestions sont faites.
Emigna
4

CJam , 10 octets

ri,:)_W%]z

Essayez-le en ligne!

Explication

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
la source
4

Ruby , 29 octets

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

Explication:

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

Essayez-le en ligne!

GB
la source
4

Espaces blancs , 71 octets

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Essayez-le en ligne!

Explication

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'

Les deux premières instructions sont nécessaires pour configurer correctement la pile, les commandes d'entrée de Whitespace écrivant dans le tas, nous devons donc copier b (la valeur d'entrée) dans la pile. Nous commençons avec a = 0 car il est plus court de déclarer 0 au lieu de 1 (enregistre un octet) et il suffit de réordonner l'instruction d'incrémentation pour y faire face. Après cela, on boucle et incrémente a, sortie a, sortie b, décrémente b, jusqu'à ce que b atteigne 0 (vérifié après le décrément).

Ephphatha
la source
cela pourrait être beaucoup plus golfé si vous supprimiez tout ce qui traîne l'espace: P
cat
4

Haskell, 65 48 47 octets

1 octet économisé grâce à Laikoni:

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

6 octets sauvés grâce à nimi:

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

Réponse précédente et explication:

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

Il y a déjà une meilleure réponse Haskell ici, mais je suis novice en Haskell et en code-golf, alors je peux aussi bien le poster :)

Cette fonction ferme la liste [1..n] avec son verso, ce qui donne une liste de n-uplets.

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

Ensuite, il utilise concatMappour mapper un lambda à cette liste de tuples qui résulte en une liste de listes ...

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

... et le concatène.

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

Ensuite, une dernière concatMapcarte mappe showà la liste et la concatène en une seule chaîne.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"

Dan Ambrogio
la source
2
La fonction infixe =<<est le même (dans la liste monade) que concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi
1
1) Votre solution actuelle n’est que de 48 octets. 2) Vous pouvez déposer le ndans [1..n]: Essayez-le en ligne!
Laikoni
1) Dang off-by-one erreurs ... 2) Bon appel!
Dan Ambrogio,
3

Pyth, 7 octets

jksC_BS

Essayez-le en ligne: démonstration

Explication:

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
la source
3

Octave, 29 octets

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

Essayez-le en ligne!

rahnema1
la source
1
Ma mise en œuvre était tellement, tellement plus longue! Agréable! =)
Stewie Griffin
3

Perl 6 , 20 octets

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

Essaye-le

Avec une entrée de 100 000, cela prend environ 10 secondes, compilation et impression de la sortie comprises.

Étendu:

{                # 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
}

le Z~ nécessite le ~parce que sinon, il génère une liste de listes qui seront stigmatisées avec des espaces.

Il n'est pas nécessaire de limiter la plage à partir de 1, car Zs'arrête lorsque l'une des listes d'entrées est vide.
Cela économise deux octets (un espace sera nécessaire après $_)

Brad Gilbert b2gills
la source
3

Java 61 octets

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}
cheemcheem
la source
2
Aussi, bienvenue à PPCG! :)
Stewie Griffin
Nous autorisons les fonctions anonymes, alors vous (int n)->{//for loop}devriez travailler ici.
Nathan Merrill
Est-ce mieux?
cheemcheem
2
Oui! Vous pouvez potentiellement mettre votre System.out.print()dans la dernière déclaration de la boucle for, mais cela se complique parce que vous utilisez ideux fois (et vous devez l'incrémenter dans l'expression).
Nathan Merrill
J'ai mis l'impression dans la boucle et incrémenté i à la dernière place possible, puis vérifié avec les cas de test pour s'assurer que cela fonctionnait, merci @NathanMerrill
cheemcheem
3

Gelée , 5 octets

RṚĖVV

Essayez-le en ligne!

Comment ça marche

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
la source
3

Röda , 21 19 octets

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

Essayez-le en ligne!

C'est une fonction anonyme qui prend une entrée du flux.

Explication

{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
la source
2

Clojure, 61 octets

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

Fait littéralement ce qui est demandé. Je crois que cela peut être évité par une solution moins triviale.

Voir en ligne

cliffroot
la source
2

Aceto , 25 22 octets

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

Explication:

Nous lisons un entier et le mettons sur deux piles.

id
r}

Sur l'un, nous appelons range_up ( Z), sur l'autre, range_down ( z), puis nous définissons un repère pour pouvoir revenir à cet endroit plus tard:

  @z
  Z)

Nous vérifions ensuite si la pile actuelle est vide et quittons si c'est le cas:

 X`=
  l0

Sinon, nous imprimons à partir des deux piles et retournons à la cible:

)&
p
(p
L3viathan
la source
2

R, 41 octets

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

pryr::f()crée une fonction qui prend une entrée. Boucle dessus 1:xet imprime chaque élément de 1:xavec chaque élément de x:1. Imprime sur STDOUT.

JAD
la source
+1, bonne utilisation depryr
shadowtalker
@ssdecontrol son remplacement de base assez de function(x):)
JAD
2

Brachylog , 10 à 9 octets

⟦₁g↔ᶻczcc

Essayez-le en ligne!

Explication

⟦₁           [1, …, Input]
  g↔ᶻc       [[1, …, Input],[Input, …, 1]]
      z      Zip
       cc    Concatenate twice
Fataliser
la source
2

MATL, 13 11 9 octets

2 octets sauvegardés grâce à @Luis

:tPv1eVXz

Essayez-le sur MATL Online

Explication

        % 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
la source
@LuisMendo Ah! Je pensais qu'il y avait une fonction qui supprimait les espaces, mais je ne pouvais pas le trouver. Merci!
Suever
2

PHP, 36 35 29 octets

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

Un octet enregistré grâce à Jörg Hülsermann.
Sauvé six octets grâce à Christoph.

utilisateur63956
la source
3
Euh ... for(;$argn;)echo++$i,$argn--;?
Christoph
2

Scala, 43 octets

Ce n'est pas le meilleur mais c'est mon premier code golf.

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))
Phénix
la source
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
la source
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
la source
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
la source
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
MooseOnTheRocks
la source