Interlaccia i numeri da 1 a n, con gli stessi numeri invertiti


34

Semplice:

Prendi un numero intero positivo n inferiore a 1000 e genera gli interi da 1 a n interlacciati con gli interi da n a 1 . È necessario concatenare i numeri in modo che appaiano senza delimitatori tra di loro.

Casi test:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Questo è quindi vince l'invio più breve in byte in ogni lingua. Le spiegazioni sono incoraggiate.

Risposte:


16

JavaScript (ES6), 30 byte

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

Come?

Questo è piuttosto semplice ma vale la pena notare che la corda è costruita dalla coda alla testa. Una stringa vuota all'inizio viene aggiunta per ultima e consente la coercizione del risultato finale a una stringa.

Di seguito è riportato il dettaglio della ricorsione per 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

Casi test


10

Python 2 , 46 byte

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

Grazie a ovs per 4 byte

Provalo online!

Spiegazione:

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
Altri due byte in Python 3:f'{x}{n-~-x}'
L3viathan,

2
@ L3viathan Questa è una nuova funzionalità aggiunta in 3.6.
Mego

1
Python 3.6 non è Python 3?
L3viathan,

6
lambda n:''.join('x+1'+'n-x'for x in range(n))per 46 byte. (sostituisci la 'comprensione nell'elenco con i backtick)
ovs

6
@ovs hey, puoi scappare dal backtick -> `\`x+1\``rende a`x+1`
Rod


7

Bash , 25 byte

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

Provalo online!

Stampa la sequenza decrescente, le linee numeriche aumentano e printf unisce le linee

Spazio delimitato, 20 byte: seq $ 1 -1 1 | nl | xargs


se ciò non è accettabile, posso cambiarlo per altri seq $1 -1 1|nl|tr -d ' \n\t'8 byte
marcosm,

1
L'invio a 20 byte non è valido. Il mio voto è per l'invio di 25 byte.
Digital Trauma,

Come notato da Digital Trauma, la soluzione a 20 byte non è valida.
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 byte

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

Provalo online

rbind(1:n,n:1)crea una matrice di 2 righe con 1 a n nella prima riga e n a 1 nella seconda. La catfunzione comprime questa matrice, leggendo ogni colonna.


1
Nota che funziona solo in modalità interattiva e richiede all'utente di accedere nalla riga di comando (invece di passare tramite stdin).
Shadowtalker,

@ssdecontrol Sì, penso che di solito sia permesso, ma sono abbastanza nuovo qui, potrebbe essere sbagliato.
user2390246

Penso che sia generalmente accettabile, ma NB, per eseguirlo correttamente in TIO devi inserire gli input nel campo Piè di pagina (ed è sempre bene includere un link!) Tio.run/nexus/…
Giuseppe,

6

05AB1E , 6 5 byte

Salvato un byte usando il nuovo interleave incorporato come suggerito da rev

LÂ.ιJ

Provalo online!

Spiegazione

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join

Un utente di nome rev suggerito LÂ.ιJ.
Jonathan Frech,

@JonathanFrech: ora so che il consenso è che possiamo usare funzionalità più recenti della sfida, ma di solito esito a modificare vecchie risposte perché un nuovo built-in completa la sfida meglio. Ci sono così tante risposte in tutto che potrebbero essere migliorate in questo modo :)
Emigna

Bene, ero solo il messaggero; possibile @rev dovrebbe pubblicare la propria risposta.
Jonathan Frech

@JonathanFrech: non intendevo questo rimprovero. Rev ha fatto correttamente quando ha suggerito la modifica in quanto è meglio modificare una risposta esistente piuttosto che pubblicarne una nuova ogni volta che viene creato un nuovo built-in. Dovrei davvero migliorare nel risolvere vecchie risposte, almeno quando vengono proposti dei suggerimenti.
Emigna,

4

CJam , 10 byte

ri,:)_W%]z

Provalo online!

Spiegazione

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

Rubino , 29 byte

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

Spiegazione:

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

Provalo online!


4

Spazio bianco , 71 byte

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Provalo online!

Spiegazione

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'

Le prime due istruzioni sono necessarie per impostare correttamente lo stack, i comandi di input di Whitespace scrivono nell'heap quindi dobbiamo copiare b (il valore di input) nuovamente nello stack. Iniziamo con a = 0 poiché è più breve dichiarare 0 invece di 1 (salva un byte) e dobbiamo solo riordinare l'istruzione di incremento per farcela. Dopodiché eseguiamo semplicemente il loop e l'incremento a, output a, output b, decremento b, fino a quando b raggiunge 0 (controllato dopo il decremento).


questo potrebbe essere molto più complicato se rimuovessi tutto quello spazio bianco finale: P
cat

4

Haskell, 65 48 47 byte

1 byte salvato grazie a Laikoni:

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

6 byte salvati grazie a nimi:

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

Risposta e spiegazione precedenti:

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

C'è già una risposta migliore di Haskell qui, ma sono nuovo sia per Haskell che per giocare a golf, quindi posso anche pubblicarlo :)

Questa funzione consente di comprimere l'elenco [1..n] con il suo contrario, risultando in un elenco di tuple.

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

Quindi utilizza concatMapper mappare un lambda a questo elenco di tuple che risulta in un elenco di elenchi ...

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

... e lo concatena.

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

Quindi un finale viene concatMapmappato showall'elenco e lo concatena in una singola stringa.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"


2
La funzione infisso =<<è la stessa (all'interno della lista Monade) come concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi,

1
1) La tua soluzione attuale è di soli 48 byte. 2) È possibile eliminare l' nin [1..n]: Provalo in rete!
Laikoni,

1) Dang off-by-one errori ... 2) Buona chiamata!
Dan Ambrogio,

3

Pyth, 7 byte

jksC_BS

Provalo online: dimostrazione

Spiegazione:

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 byte

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

Provalo

Con un input di 100000 sono necessari circa 10 secondi, inclusa la compilazione e la stampa dell'output.

Allargato:

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

Il Z~bisogno è ~perché altrimenti genera un elenco di liste che si stringerà con spazi.

Non è necessario limitare l'intervallo a partire da 1, poiché si Zinterrompe quando si esauriscono gli elenchi di input.
Ciò consente di risparmiare due byte (dopo sarebbe necessario uno spazio $_)


3

Java 61 byte

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

2
Inoltre, benvenuto in PPCG! :)
Stewie Griffin,

Consentiamo funzioni anonime, quindi (int n)->{//for loop}dovrebbe funzionare qui.
Nathan Merrill,

Va meglio?
cheemcheem,

2
Sì! Puoi potenzialmente inserire il tuo System.out.print()nell'ultima istruzione del ciclo for, ma diventa complicato perché lo stai usando idue volte (e devi incrementarlo nell'espressione).
Nathan Merrill,

Ho inserito la stampa all'interno del loop e ho incrementato i nell'ultima posizione possibile, quindi l'ho controllata con i casi di test per assicurarmi che funzionasse, grazie @NathanMerrill
cheemcheem,

3

Gelatina , 5 byte

RṚĖVV

Provalo online!

Come funziona

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 byte

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

Provalo online!

Questa è una funzione anonima che accetta input dallo stream.

Spiegazione

{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 byte

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

Fa letteralmente ciò che viene chiesto. Credo che possa essere superato da una soluzione meno banale.

Guardalo online


2

Aceto , 25 22 byte

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

Spiegazione:

Leggiamo un numero intero e lo mettiamo su due pile.

id
r}

Su uno, chiamiamo range_up ( Z), sull'altro range_down ( z), quindi impostiamo un contrassegno di cattura per poter tornare in questo luogo in seguito:

  @z
  Z)

Quindi controlliamo se lo stack corrente è vuoto e in tal caso uscire:

 X`=
  l0

Altrimenti, stampiamo da entrambe le pile e torniamo indietro al segno di cattura:

)&
p
(p

2

R, 41 byte

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

pryr::f()crea una funzione che accetta un input. Passa sopra 1:xe stampa ogni elemento di 1:xinsieme a ciascun elemento di x:1. Stampa su STDOUT.


+1, buon uso dipryr
shadowtalker,

@ssdecontrol è praticamente la sostituzione di base di function(x):)
JAD


2

MATL, 13 11 9 byte

2 byte salvati grazie a @Luis

:tPv1eVXz

Provalo su MATL Online

Spiegazione

        % 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! Ho pensato che ci fosse una funzione che ha rimosso gli spazi bianchi ma non sono riuscito a trovarlo. Grazie!
Suever,

2

PHP, 36 35 29 byte

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

Salvataggio di un byte grazie a Jörg Hülsermann.
Hai salvato sei byte grazie a Christoph.


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

2

Scala, 43 byte

Non è il migliore ma è il mio primo codice golf.

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

2

V , 20 byte

ywo1@"­ñykPjñkògJ

Provalo online!

Spiegare:

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 byte

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

Provalo online!

cubified:

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

Spinge 1, legge nell'input ( I), quindi entra nel loop che scambia la parte superiore dello stack, lo emette, incrementa, scambia, emette la parte superiore dello stack, diminuisce e si arresta se la parte superiore dello stack è 0.



2

MathGolf , 5 byte

{îkï-

Provalo online!

Spiegazione:

{      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
Sono stato in grado di trovare 13 programmi di lunghezza 5 che producono lo stesso risultato: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. Tuttavia, non sono stato in grado di trovare alcun programma di lunghezza 4 o inferiore. Non ho fatto una ricerca completa, ma è molto probabile che 5 byte sia ottimale per MathGolf.
max


2

Mouse-2002 , 32 30 byte

-2 è stato spostato a condizione che inizi il ciclo (z.^ ... )anziché(... z.0>^)

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

Provalo online!

Spiegazione:

?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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.