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.