¡Cuente, reemplace, repita!


18

Definición

Definir el n º matriz de la secuencia de CURR como sigue.

  1. Comience con la matriz singleton A = [n] .

  2. Para cada número entero k en A , reemplace la entrada k con k números naturales, contando desde 1 hasta k .

  3. Repita el paso anterior n - 1 veces más.

Por ejemplo, si n = 3 , comenzamos con la matriz [3] .

Reemplazamos 3 con 1, 2, 3 , produciendo [1, 2, 3] .

Ahora reemplazamos 1 , 2 y 3 con 1 ; 1, 2 y 1, 2, 3 (resp.), Produciendo [1, 1, 2, 1, 2, 3] .

Finalmente, realizamos los mismos reemplazos que en el paso anterior para los seis enteros en la matriz, produciendo [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] . Esta es la tercera matriz CURR.

Tarea

Escribir un programa de una función que, dado un número entero estrictamente positivo n como entrada, calcula el n º array CURR.

El resultado debe ser una lista plana de algún tipo (y la matriz devuelta por una función, una representación de cadena de la sintaxis de la matriz de su idioma, separados por espacios en blanco, etc.).

Este es el . ¡Que gane el código más corto en bytes!

Casos de prueba

 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]

3
Relacionado: ¡ Cuenta, reemplaza, suma! ._.
Dennis

¿Podemos tomar la entrada como una matriz singleton (como [2]) en lugar de un entero?
Mego

@Mego Vamos a mantenerlo en enteros.
Dennis

Siento que debería haber una secuencia OEIS para esto.
DanTheMan

@DanTheMan No es realmente una secuencia de enteros en su forma actual, pero supongo que podría convertirse en una concatenando los resultados para todos los enteros positivos.
Dennis

Respuestas:


23

Jalea, 3 bytes

R¡F

Pruébalo en línea

Explicación

R¡F    Argument n

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

Eso es ... simplemente brillante ... comparado con mi respuesta de Jelly.
Leaky Nun

66
Gran primer post!
Azul

16

Python, 50 bytes

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

Abuso de alcance! Por ejemplo, para i=3, la cadena a evaluar se expande a.

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

De alguna manera, a pesar de usar la variable de entrada de función ipara todo, Python distingue cada índice de iteración como perteneciente a un ámbito separado como si la expresión fuera

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

con ila entrada a la función.


Este truco también funciona en Firefox 30+ y me ahorró 3 bytes, ¡gracias!
Neil

@DigitalTrauma Tanto Python como JavaScript tienen eval, obviamente, el código en sí mismo debe ser portado, pero pensé que podría suponer eso de todos modos.
Neil

@Neil Oh, ya veo - no entendí completamente :)
Trauma digital

12

05AB1E, 6 3 bytes

DFL

Explicado

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

Pruébalo en línea

Guardado 3 bytes gracias a @Adnan


DFLes 3 bytes más corto :)
Adnan

1
@Adnan: No sabía que L trabajaba así en las listas. Un poco sorprendente que se aplana automáticamente.
Emigna

3
En realidad es un error que nunca he solucionado: p.
Adnan

6

Retina , 33 bytes

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

Entrada y salida en unario.

Pruébalo en línea!

Aunque no utilicé el formulario cerrado para el desafío relacionado, adaptar esta respuesta fue sorprendentemente complicado.


+%(M!&es la etiqueta más larga que jamás vería.
Leaky Nun

6

Python 2, 82 bytes

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

Esta no es la solución más corta, pero ilustra un método interesante:

  • Escribe los primeros 2^(2*n-1)números en binario
  • Mantener los que tienen exactamente nlas
  • Para cada número, cuente el número de ceros finales y agregue 1.

4

En realidad, 9 bytes

;#@`♂RΣ`n

Pruébalo en línea!

Explicación:

;#@`♂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

Gracias a Leaky Nun por un byte e inspiración para otros 2 bytes.


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

@LeakyNun Buena captura: ¡ ;#@`♂R♂i`nguarda otra!
Mego

Estaba a punto de intentar la suma, jajaja.
Leaky Nun

Creo que 9 será la solución óptima aquí
Mego

Su enlace aún está desactualizado.
Leaky Nun

4

C #, 128 bytes

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, puedes hacer esto: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 bytes

{∊⍳¨∘∊⍣⍵+⍵}

Prueba:

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

Explicación:

  • +⍵: comenzando con ,
  • ⍣⍵: hacer los siguientes horarios:
    • ⍳¨∘∊: aplanar la entrada y luego generar una lista [1..N] para cada N en la entrada
  • : aplanar el resultado de eso

2
Más simple:{(∊⍳¨)⍣⍵⊢⍵}
Adám

@ Adám: Ah, sí, los trenes funcionan de manera diferente a J. Comencé {(∊∘(⍳¨))⍣⍵+⍵}y luego pensé, ¿cómo puedo deshacerme de esos aparatos?
marinus

2

CJam, 14 bytes

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

Pruébalo aquí.

Explicación

_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 bytes

1 byte guardado con algo de inspiración de la respuesta de Essari.

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

Bastante sencillo: para la entrada xpartimos {x}y luego aplicar el Rangea ella xveces ( Rangees Listablelo que significa que se aplica automáticamente a los números enteros dentro enumera arbitrariamente anidados). Al final Flattenel resultado.


2

Clojure, 59 bytes

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

Explicación:

Manera realmente directa para resolver el problema. Trabajando de adentro hacia afuera:

(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 bytes

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

Esta es solo una traducción directa de la descripción del problema al código.

Editar: guardado un byte gracias a @Dennis.


Tu printpuedes salir del exec.
xnor

Sí, eso era lo que tenía al principio, pero simplemente se imprime [k]por alguna razón. Dejé de tratar de averiguar si era un problema de alcance o algo más.
Andrew Epstein

Sí, parece un problema de alcance . Funciona bien en Python 2.
xnor

2

R, 60 49 bytes

Uso bastante directo de unlisty sapply.

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

Gracias a @MickyT por guardar 11 bytes


@MickyT gracias por la propina, puedo usar seqpara reducir el recuento de bytes
bouncyball

Lo siento
leí

2

php 121

Realmente no hay muchos trucos detrás de este. Acoplar una matriz en php no es corta, por lo que es necesario construirla plana en primer lugar

<?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 plano es una buena idea. Pero las funciones de devolución de llamada tampoco son cortas. Batirlo por 15 bytes. Puede guardar 4 bytes con la etiqueta corta <?o 6 bytes con -ry sin etiqueta.
Titus

2

Haskell, 33 bytes

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

Gracias a nimi por guardar un byte.

Una versión sin puntos es más larga (35 bytes):

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

iterate(>>= \a->[1..a])por un byte menos.
nimi

2

JavaScript (Firefox 30-57), 63 60 bytes

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

Puerto de la respuesta Python de @ xnor.


Intenté esto con Firefox 42 ( SyntaxError: missing : in conditional expression) y Babel ( Unexpected token (1:21)). ¿Qué estoy haciendo mal?
Dennis

@ Dennis Lo siento, pero no tengo idea; De hecho, tengo Firefox 42 en una de mis máquinas por alguna razón y verifiqué dos veces y funcionó bien allí. (También revisé Firefox 37 y 47 solo para asegurarme).
Neil

Eh, la página no se actualizó y probé tu versión anterior. El nuevo funciona bien.
Dennis

@ Dennis Ah, de )alguna manera parece que un parásito se deslizó en esa versión.
Neil

1

J, 18 bytes

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

Enfoque directo basado en el proceso descrito en el desafío.

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

Explicación

([:;<@(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 bytes

usSMGQ]Q

Pruébalo en línea!

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

Jalea, 7 bytes

Rápido, antes de que Dennis responda (jk)

WR€F$³¡

Pruébalo en línea!

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 bytes

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

Devuelve una función anónima que toma n como entrada.

Reemplaza cada entrada k en A con [1..k], repite el proceso n veces, comenzando con A = [n].


1

Swift 3, 58 Bytes

Destinado a correr directamente en el patio de recreo, con n configurado en la entrada:

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

Sin golf, con la mayoría de las anotaciones de manos cortas revertidas:

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 bytes

Procedimiento

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;}

Salida de muestra:

[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 bytes

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

Editar: Guardado 1 byte gracias a @xnor. Guardado 2 bytes gracias a @ Dennis ♦.


Puede eliminar los parens alrededor exec. En Python 2, es una palabra clave, no una función. Cuento 68 bytes por cierto.
Dennis

@ Dennis Ah, eso significa que conté mal y originalmente era de 69 bytes ...
Neil

1

Bash + utilidades GNU, 49

  • 1 byte guardado gracias a @Dennis.

Funciones recursivas canalizadas FTW!

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

nse pasa en la línea de comandos. La salida está separada por una nueva línea.

El uso de ddestadísticas de causas se enviará a STDERR. Creo que esto está bien, pero si no, ddse puede reemplazar con catun costo de 1 byte adicional.


1
La salida extraña a STDERR está permitida por defecto. Puede reemplazar {...;}con (...)para guardar un byte.
Dennis

@ Dennis sí, por supuesto! Aparentemente recibiste este consejo mío :)
Digital Trauma

0

Perl 5, 53 bytes

Una subrutina:

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

Véalo en acción como

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


0

PHP, 100 98 bytes

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

En cada iteración, cree una copia temporal en bucle desde 1 .. (primer valor eliminado) hasta $a esté vacío.


Estos dos están quietos y probablemente permanecerán en 100 bytes:

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

En cada iteración, haga un bucle hacia atrás a través de la matriz reemplazando cada número con un rango.

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

En cada ciclo de iteración a través de la matriz, aumentar el índice por número anterior y reemplazar cada elemento indexado con un rango

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.