Conta, sostituisci, ripeti!


18

Definizione

Definire il n ° matrice della sequenza CURR come segue.

  1. Inizia con l'array singleton A = [n] .

  2. Per ogni intero k in A , sostituisci la voce k con k numeri naturali, contando da 1 a k .

  3. Ripetere il passaggio precedente n - 1 più volte.

Ad esempio, se n = 3 , iniziamo con l'array [3] .

Sostituiamo 3 con 1, 2, 3 , dando [1, 2, 3] .

Sostituiamo ora 1 , 2 e 3 con 1 ; 1, 2 e 1, 2, 3 (risp.), Dando [1, 1, 2, 1, 2, 3] .

Infine, eseguiamo le stesse sostituzioni del passaggio precedente per tutti e sei i numeri interi nell'array, producendo [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] . Questo è il terzo array CURR.

Compito

Scrivi un programma di una funzione che, dato un intero n strettamente positivo come input, calcola l' n- esimo array CURR.

L'uscita deve essere un piatto elenco di qualche tipo (e matrice restituita da una funzione, una rappresentazione di stringa di sintassi di matrice del linguaggio, separate da spazi, ecc).

Questo è . Che vinca il codice più breve in byte!

Casi test

 1 -> [1]
 2 -> [1, 1, 2]
 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]
 4 -> [1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
 5 -> [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]
 6 -> [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]


Possiamo prendere l'input come una matrice singleton (come [2]) piuttosto che un numero intero?
Mego,

@Mego Teniamolo a numeri interi.
Dennis,

Sento che dovrebbe esserci una sequenza OEIS per questo.
DanTheMan,

@DanTheMan Non è in realtà una sequenza di numeri interi nella sua forma attuale, ma suppongo che potrebbe essere trasformato in uno concatenando i risultati per tutti i numeri interi positivi.
Dennis,

Risposte:


23

Gelatina, 3 byte

R¡F

Provalo online

Spiegazione

R¡F    Argument n

R      Yield range [1..n]
 ¡     Repeat n times
  F    Flatten the result

Questo è ... semplicemente geniale ... rispetto alla mia risposta di Jelly.
Leaky Nun,

6
Ottimo primo post!
Blu,

16

Python, 50 byte

lambda i:eval("[i "+"for i in range(1,i+1)"*i+"]")

Abuso di portata! Ad esempio, per i=3, la stringa da valutare si espande.

[i for i in range(1,i+1)for i in range(1,i+1)for i in range(1,i+1)]

In qualche modo, nonostante utilizzi la variabile di input della funzione iper tutto, Python distingue ogni indice di iterazione come appartenente a un ambito separato come se l'espressione fosse

[l for j in range(1,i+1)for k in range(1,j+1)for l in range(1,k+1)]

con il'ingresso alla funzione.


Questo trucco funziona anche con Firefox 30+ e mi ha salvato 3 byte, grazie!
Neil,

@DigitalTrauma Sia python che JavaScript hanno eval, ovviamente il codice stesso deve essere portato, ma ho pensato che si potesse supporre che comunque.
Neil,

@Neil Oh, capisco - ho completamente frainteso :)
Digital Trauma il

12

05AB1E, 6 3 byte

DFL

spiegato

D     # duplicate input
 F    # input times do
  L   # range(1,N)

Provalo online

Salvato 3 byte grazie a @Adnan


DFLè più corto di 3 byte :)
Adnan il

1
@Adnan: Non sapevo che L avesse funzionato così negli elenchi. Un po 'sorprendente che si appiattisca automaticamente.
Emigna,

3
In realtà è un bug che non ho mai corretto: p.
Adnan,

6

Retina , 33 byte

$
$.`$*0
+%(M!&`1.*(?=0)|^.+
O`.+

Input e output in unario.

Provalo online!

Anche se non ho usato il modulo chiuso per la relativa sfida, l'adattamento di questa risposta è stato sorprendentemente complicato.


+%(M!&è il tag più lungo che io abbia mai visto.
Leaky Nun,

6

Python 2, 82 byte

lambda n:[1+bin(i)[::-1].find('1')for i in range(1<<2*n-1)if bin(i).count('1')==n]

Questa non è la soluzione più breve, ma illustra un metodo interessante:

  • Scrivi il primo 2^(2*n-1) numeri in binario
  • Mantieni quelli con esattamente n quelli
  • Per ogni numero, contare il numero di zero finali e aggiungere 1.

4

In realtà, 9 byte

;#@`♂RΣ`n

Provalo online!

Spiegazione:

;#@`♂RΣ`n
;#@        dupe n, make a singleton list, swap with n
   `♂RΣ`n  call the following function n times:
    ♂R       range(1, k+1) for k in list
      Σ      concatenate the ranges

Grazie a Leaky Nun per un byte e ispirazione per altri 2 byte.


;#@"♂R♂i"*ƒsalva un byte
Leaky Nun,

@LeakyNun Buona cattura - ne ;#@`♂R♂i`nsalva un'altra!
Mego,

Stavo per provare la sommatoria, lol.
Leaky Nun,

Penso che 9 sarà la soluzione ottimale qui
Mego

Il tuo link è ancora obsoleto.
Leaky Nun,

4

C #, 128 byte

List<int>j(int n){var l=new List<int>(){n};for(;n>0;n--)l=l.Select(p=>Enumerable.Range(1,p)).SelectMany(m=>m).ToList();return l;

Con using static System.Linq.Enumerable, puoi farlo:int[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
die maus,

4

APL, 11 byte

{∊⍳¨∘∊⍣⍵+⍵}

Test:

      {∊⍳¨∘∊⍣⍵+⍵} 3
1 1 1 2 1 1 2 1 2 3

Spiegazione:

  • +⍵: a partire da ,
  • ⍣⍵: eseguire le seguenti volte:
    • ⍳¨∘∊: appiattisce l'input, quindi genera un elenco [1..N] per ogni N nell'input
  • : appiattire il risultato di quello

2
{(∊⍳¨)⍣⍵⊢⍵}
Più

@Adám: Ah, sì, i treni funzionano in modo diverso da J. Avevo iniziato {(∊∘(⍳¨))⍣⍵+⍵}e poi ho
Marin il

2

CJam, 14 byte

{_a\{:,:~:)}*}

Provalo qui.

Spiegazione

_a   e# Duplicate N and wrap it in an array.
\    e# Swap with other copy of N.
{    e# Do this N times...
  :, e#   Turn each x into [0 1 ... x-1].
  :~ e#   Unwrap each of those arrays.
  :) e#   Increment each element.
}*

2

Mathematica, 27 26 byte

1 byte salvato con un po 'di ispirazione dalla risposta di Essari.

Flatten@Nest[Range,{#},#]&

Abbastanza semplice: per l'input xiniziamo con {x}e poi applichiamo i tempi Rangead esso x( Rangeè il Listableche significa che si applica automaticamente agli interi all'interno di elenchi arbitrariamente nidificati). Alla fine Flattenil risultato.


2

Clojure, 59 byte

(fn[n](nth(iterate #(mapcat(fn[x](range 1(inc x)))%)[n])n))

Spiegazione:

Modo davvero diretto per risolvere il problema. Lavorando da dentro e fuori:

(1) (fn[x](range 1(inc x))) ;; return a list from 1 to x
(2) #(mapcat (1) %)         ;; map (1) over each item in list and flatten result
(3) (iterate (2) [n])       ;; call (2) repeatedly e.g. (f (f (f [n])))
(4) (nth (3) n))            ;; return the nth value of the iteration

2

Python 3, 75 74 byte

def f(k):N=[k];exec('A=N;N=[]\nfor i in A:N+=range(1,i+1)\n'*k+'print(N)')

Questa è solo una traduzione semplice della descrizione del problema in codice.

Modifica: salvato un byte grazie a @Dennis.


Il tuo printpuò andare al di fuori del exec.
xnor

Sì, questo è quello che avevo all'inizio, ma stampa semplicemente [k]per qualche motivo. Ho rinunciato a cercare di capire se si trattava di un problema di portata o qualcos'altro.
Andrew Epstein,

Sì, sembra un problema di portata . Funziona bene in Python 2.
xnor

2

R, 60 49 byte

Uso abbastanza semplice di unliste sapply.

y=x=scan();for(i in 1:x)y=unlist(sapply(y,seq));y

Grazie a @MickyT per aver salvato 11 byte


@MickyT grazie per il suggerimento, posso usare seqper abbassare il conteggio dei byte
bouncyball

Mi dispiace di aver letto male la domanda
MickyT

2

php 121

Non molto in termini di trucchi dietro questo. L'appiattimento di un array in php non è breve, quindi è necessario costruirlo piatto in primo luogo

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);

Mantenerlo piatto è una buona idea. Ma neanche le funzioni di callback sono brevi. Beat di 15 byte. È possibile salvare 4 byte con il tag breve <?o 6 byte con -re senza tag.
Tito

2

Haskell, 33 byte

f n=iterate(>>= \a->[1..a])[n]!!n

Grazie a nimi per aver salvato un byte.

Una versione senza punti è più lunga (35 byte):

(!!)=<<iterate(>>= \a->[1..a]).pure

iterate(>>= \a->[1..a])per un byte in meno.
nimi,

2

JavaScript (Firefox 30-57), 63 60 byte

f=n=>eval(`[${`for(n of Array(n+1).keys())`.repeat(n--)}n+1]`)

Port of @ xnor's Python answer.


Ho provato questo con Firefox 42 ( SyntaxError: missing : in conditional expression) e Babel ( Unexpected token (1:21)). Che cosa sto facendo di sbagliato?
Dennis,

@Dennis Scusa, ma non ne ho idea; In effetti ho Firefox 42 su una delle mie macchine per qualche motivo e ho ricontrollato e ha funzionato bene lì. (Ho anche controllato Firefox 37 e 47 solo per essere sicuro.)
Neil,

La pagina non si aggiorna e ho testato la tua vecchia versione. Il nuovo funziona perfettamente.
Dennis,

@Dennis Ah, sembra )che in qualche modo si sia insinuato in quella versione.
Neil,

1

J, 18 byte

([:;<@(1+i.)"0)^:]

Approccio diretto basato sul processo descritto nella sfida.

uso

   f =: ([:;<@(1+i.)"0)^:]
   f 1
1
   f 2
1 1 2
   f 3
1 1 1 2 1 1 2 1 2 3
   f 4
1 1 1 1 2 1 1 1 2 1 1 2 1 2 3 1 1 1 2 1 1 2 1 2 3 1 1 2 1 2 3 1 2 3 4

Spiegazione

([:;<@(1+i.)"0)^:]  Input: n
                 ]  Identity function, gets the value n
(     ...     )^:   Repeat the following n times with an initial value [n]
      (    )"0        Means rank 0, or to operate on each atom in the list
         i.           Create a range from 0 to that value, exclusive
       1+             Add 1 to each to make the range from 1 to that value
    <@                Box the value
 [:;                  Combine the boxes and unbox them to make a list and return
                    Return the final result after n iterations

1

Pyth, 8 byte

usSMGQ]Q

Provalo online!

usSMGQ]Q   input as Q

u    Q     repeat for Q times,
      ]Q   starting as [Q]:

  SMG          convert each number in the array to its range
 s             flatten

           then implicitly prints the result.

1

Gelatina, 7 byte

Presto, prima che Dennis risponda (jk)

WR€F$³¡

Provalo online!

WR€F$³¡  Main monadic chain. Argument: z

W        Yield [z].
     ³¡  Repeat the following z times:
 R€          Convert each number in the array to the corresponding range.
   F         Flatten the array.

1

F #, 63 byte

fun n->Seq.fold(fun A _->List.collect(fun k->[1..k])A)[n]{1..n}

Restituisce una funzione anonima che accetta n come input.

Sostituisce ogni voce k in A con [1..k], ripete il processo n volte, iniziando con A = [n].


1

Swift 3, 58 byte

Avrebbe funzionato direttamente nel parco giochi, con n impostato sull'input:

var x=[n];for i in 0..<n{x=x.reduce([]){$0+[Int](1...$1)}}

Ungolfed, con la notazione più breve ripristinata:

let n = 3 //input

var x: Array<Int> = [n]
for i in 0..<n {
    x = x.reduce(Array<Int>[], combine: { accumulator, element in
        accumulator + Array<Int>(1...element)
    })
}

1

Java, 159 byte

Procedura

int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

uso

public static void main(String[] args){String out = "["; int [] b = q(6);for(int c:b)out+=c+", ";System.out.println(out+"]");}

public static int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

Uscita campione:

[1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ]

1

Python 2, 69 68 66 byte

def f(n):a=[n];exec'a=sum([range(1,i+1)for i in a],[]);'*n;print a

Modifica: salvato 1 byte grazie a @xnor. Salvato 2 byte grazie a @ Dennis ♦.


È possibile rimuovere le parentesi in giro exec. In Python 2, è una parola chiave, non una funzione. Conto 68 byte a proposito.
Dennis,

@Dennis Ah, questo significa che ho contato male ed era originariamente 69 byte ...
Neil,

1

Utilità Bash + GNU, 49

  • 1 byte salvato grazie a @Dennis.

Funzioni ricorsive convogliate FTW!

f()((($1))&&xargs -l seq|f $[$1-1]||dd)
f $1<<<$1

nviene passato dalla riga di comando. L'output è separato da una nuova riga.

L'uso delle ddstatistiche causa l'invio a STDERR. Penso che sia OK, ma in caso contrario, ddpuò essere sostituito con catun costo di 1 byte extra.


1
L'output esterno su STDERR è consentito per impostazione predefinita. È possibile sostituire {...;}con (...)per salvare un byte.
Dennis,

@Dennis sì, certo! Apparentemente mi hai dato questo consiglio :)
Digital Trauma,

0

Perl 5, 53 byte

Una subroutine:

{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}

Guardalo in azione come

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'


0

PHP, 100 98 byte

Corri con php -r '<code>' <n>.

for($a=[$n=$argv[1]];$n--;$a=$b)for($b=[],$k=0;$c=$a[$k++];)for($i=0;$i++<$c;)$b[]=$i;print_r($a);

In ogni iterazione creare un ciclo temporaneo di copia da 1 .. (primo valore rimosso) fino a quando non $aè vuoto.


Questi due sono ancora e probabilmente rimarranno a 100 byte:

for($a=[$n=$argv[1]];$n--;)for($i=count($a);$i--;)array_splice($a,$i,1,range(1,$a[$i]));print_r($a);

In ogni ciclo di iterazione all'indietro attraverso l'array sostituisce ogni numero con un intervallo.

for($a=[$n=$argv[1]];$n--;)for($i=$c=0;$c=$a[$i+=$c];)array_splice($a,$i,1,range(1,$c));print_r($a);

In ogni ciclo di iterazione attraverso l'array aumenta l'indice del numero precedente e sostituisce ogni elemento indicizzato con un intervallo

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.