Comptez, remplacez, répétez!

18

Définition

Définissez le n ème tableau de la séquence CURR comme suit.

  1. Commencez par le tableau singleton A = [n] .

  2. Pour chaque entier k dans A , remplacez l'entrée k par k nombres naturels, en comptant de 1 à k .

  3. Répétez l'étape précédente n - 1 fois de plus.

Par exemple, si n = 3 , nous commençons par le tableau [3] .

Nous remplaçons 3 par 1, 2, 3 , ce qui donne [1, 2, 3] .

Nous remplaçons maintenant 1 , 2 et 3 par 1 ; 1, 2 et 1, 2, 3 (resp.), Donnant [1, 1, 2, 1, 2, 3] .

Enfin, nous effectuons les mêmes remplacements que dans l'étape précédente pour les six entiers du tableau, ce qui donne [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] . Il s'agit du troisième tableau CURR.

Tâche

Écrivez un programme d'une fonction qui, étant donné un entier strictement positif n en entrée, calcule le n ème tableau CURR.

La sortie doit être une sorte de liste plate (et un tableau renvoyé par une fonction, une représentation sous forme de chaîne de la syntaxe du tableau de votre langue, séparée par des espaces, etc.).

C'est du . Que le code le plus court en octets gagne!

Cas de 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]
Dennis
la source
3
Connexes: compter, remplacer, additionner! ._.
Dennis
Pouvons-nous prendre l'entrée comme un tableau singleton (comme [2]) plutôt que comme un entier?
Mego
@Mego Gardons-le à des nombres entiers.
Dennis
Je pense qu'il devrait y avoir une séquence OEIS pour cela.
DanTheMan
@DanTheMan Ce n'est pas vraiment une séquence entière dans sa forme actuelle, mais je suppose qu'elle pourrait être transformée en une seule en concaténant les résultats pour tous les nombres entiers positifs.
Dennis

Réponses:

23

Gelée, 3 octets

R¡F

Essayez-le en ligne

Explication

R¡F    Argument n

R      Yield range [1..n]
 ¡     Repeat n times
  F    Flatten the result
Essari
la source
C'est ... tout simplement génial ... par rapport à ma réponse Jelly.
Leaky Nun
6
Excellent premier post!
Blue
16

Python, 50 octets

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

Abus de portée! Par exemple, pouri=3 , la chaîne à évaluer se développe.

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

D'une certaine manière, malgré l'utilisation de la variable d'entrée de fonction i pour tout, Python distingue chaque index d'itération comme appartenant à une portée distincte comme si l'expression était

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

avec il'entrée de la fonction.

xnor
la source
Cette astuce fonctionne également dans Firefox 30+ et m'a sauvé 3 octets, merci!
Neil
@DigitalTrauma Les deux python et JavaScript ont eval, évidemment, le code lui-même doit être porté, mais je pensais que vous pouviez supposer que de toute façon.
Neil
@Neil Oh, je vois - j'ai complètement mal compris :)
Digital Trauma
12

05AB1E, 6 3 octets

DFL

Expliqué

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

Essayez-le en ligne

Sauvegardé 3 octets grâce à @Adnan

Emigna
la source
DFLest 3 octets plus court :)
Adnan
1
@Adnan: Je ne savais pas que L fonctionnait comme ça sur les listes. Un peu surprenant qu'il s'aplatisse automatiquement.
Emigna
3
C'est en fait un bug que je n'ai jamais corrigé: p.
Adnan
6

Rétine , 33 octets

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

Entrée et sortie unaires.

Essayez-le en ligne!

Même si je n'ai pas utilisé le formulaire fermé pour le défi associé, l'adaptation de cette réponse a été étonnamment délicate.

Martin Ender
la source
+%(M!&est la plus longue balise que j'aurais jamais vue.
Leaky Nun
6

Python 2, 82 octets

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

Ce n'est pas la solution la plus courte, mais elle illustre une méthode intéressante:

  • Notez les premiers 2^(2*n-1)nombres en binaire
  • Gardez ceux avec exactement nceux
  • Pour chaque nombre, comptez le nombre de zéros à la fin et ajoutez 1.
xnor
la source
4

En fait, 9 octets

;#@`♂RΣ`n

Essayez-le en ligne!

Explication:

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

Merci à Leaky Nun pour un octet et inspiration pour 2 autres octets.

Mego
la source
;#@"♂R♂i"*ƒenregistre un octet
Leaky Nun
@LeakyNun Bonne prise - ;#@`♂R♂i`nsauve un autre!
Mego
J'étais sur le point d'essayer la sommation, lol.
Leaky Nun
Je pense que 9 va être la solution optimale ici
Mego
Votre lien est toujours obsolète.
Leaky Nun
4

C #, 128 octets

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;
ScifiDeath
la source
Avec using static System.Linq.Enumerable, vous pouvez le faire: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 octets

{∊⍳¨∘∊⍣⍵+⍵}

Tester:

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

Explication:

  • +⍵: en commençant par ,
  • ⍣⍵: procédez comme suit :
    • ⍳¨∘∊: aplatir l'entrée, puis générer une liste [1..N] pour chaque N dans l'entrée
  • : aplatir le résultat de cette
marinus
la source
2
Plus simple:{(∊⍳¨)⍣⍵⊢⍵}
Adám
@ Adám: Ah, oui, les trains fonctionnent différemment de J. J'avais commencé avec {(∊∘(⍳¨))⍣⍵+⍵}, puis pensé: comment puis-je me débarrasser de ces accolades?
marinus
2

CJam, 14 octets

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

Testez-le ici.

Explication

_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.
}*
Martin Ender
la source
2

Mathematica, 27 26 octets

1 octet enregistré avec une certaine inspiration de la réponse d'Essari.

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

Assez simple: pour l' entrée , xnous commençons par {x}et appliquer ensuite la Rangelui xfois ( Rangeest ce Listablequi signifie qu'il applique automatiquement aux entiers à l' intérieur des listes imbriquées arbitrairement). À la fin, Flattenle résultat.

Martin Ender
la source
2

Clojure, 59 octets

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

Explication:

Un moyen très simple de résoudre le problème. Travailler de l'intérieur:

(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
marque
la source
2

Python 3, 75 74 octets

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

Il s'agit simplement d'une traduction simple de la description du problème en code.

Edit: enregistré un octet grâce à @Dennis.

Andrew Epstein
la source
Vous printpouvez sortir du exec.
xnor
Oui, c'est ce que j'avais au début, mais il s'imprime simplement [k]pour une raison quelconque. J'ai renoncé à essayer de comprendre s'il s'agissait d'un problème de portée ou autre chose.
Andrew Epstein
Oui, cela ressemble à un problème de portée . Cela fonctionne très bien en Python 2.
xnor
2

R, 60 49 octets

Utilisation assez simple de unlistet sapply.

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

Merci à @MickyT pour avoir économisé 11 octets

balle rebondissante
la source
@MickyT thx pour la pointe, je peux utiliser seqpour réduire le nombre d'octets
bouncyball
Désolé d'avoir mal lu la question
MickyT
2

php 121

Pas vraiment beaucoup de trucs derrière celui-ci. L'aplatissement d'un tableau en php n'est pas court, il est donc nécessaire de le construire à plat en premier lieu

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);
user55641
la source
Le garder à plat est une bonne idée. Mais les fonctions de rappel ne sont pas courtes non plus. Vous battre de 15 octets. Vous pouvez enregistrer 4 octets avec la balise courte <?ou 6 octets avec -ret sans balise.
Titus
2

Haskell, 33 octets

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

Merci à nimi d'avoir enregistré un octet.

Une version sans point est plus longue (35 octets):

(!!)=<<iterate(>>= \a->[1..a]).pure
xnor
la source
iterate(>>= \a->[1..a])pour un octet de moins.
nimi
2

JavaScript (Firefox 30-57), 63 60 octets

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

Port de la réponse Python @ xnor.

Neil
la source
J'ai essayé cela avec Firefox 42 ( SyntaxError: missing : in conditional expression) et Babel ( Unexpected token (1:21)). Qu'est-ce que je fais mal?
Dennis
@Dennis Désolé, mais je n'en ai aucune idée; En fait, j'ai Firefox 42 sur une de mes machines pour une raison quelconque et j'ai revérifié et cela a bien fonctionné là-bas. (J'ai aussi vérifié Firefox 37 et 47 juste pour être sûr.)
Neil
Huh, la page ne s'est pas rafraîchie et j'ai testé votre ancienne version. Le nouveau fonctionne très bien.
Dennis
@ Dennis Ah, on dirait une sorte de parasite qui )s'est glissé dans cette version.
Neil
1

J, 18 octets

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

Approche directe basée sur le processus décrit dans le défi.

Usage

   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

Explication

([:;<@(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
miles
la source
1

Pyth, 8 octets

usSMGQ]Q

Essayez-le en ligne!

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.
Leaky Nun
la source
1

Gelée, 7 octets

Rapide, avant que Dennis ne réponde (jk)

WR€F$³¡

Essayez-le en ligne!

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.
Leaky Nun
la source
1

F #, 63 octets

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

Renvoie une fonction anonyme prenant n en entrée.

Remplace chaque entrée k dans A par [1..k], répète le processus n fois, en commençant par A = [n].

hlo
la source
1

Swift 3, 58 octets

Destiné à fonctionner directement dans une aire de jeux, avec n réglé sur l'entrée:

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

Non golfé, avec la notation la plus courte à la main inversée:

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)
    })
}
Alexander - Rétablir Monica
la source
1

Java, 159 octets

Procédure

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

Usage

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

Exemple de sortie:

[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, ]
Giacomo Garabello
la source
1

Python 2, 69 68 66 octets

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

Edit: 1 octet enregistré grâce à @xnor. Enregistré 2 octets grâce à @ Dennis ♦.

Neil
la source
Vous pouvez supprimer les parens autour exec. En Python 2, c'est un mot-clé, pas une fonction. Je compte 68 octets btw.
Dennis
@Dennis Ah, cela signifie que j'ai mal compté et que c'était à l'origine 69 octets ...
Neil
1

Utilitaires Bash + GNU, 49

  • 1 octet enregistré grâce à @Dennis.

Fonctions récursives canalisées FTW!

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

nest transmis sur la ligne de commande. La sortie est séparée par des sauts de ligne.

L'utilisation des ddstatistiques de causes à envoyer à STDERR. Je pense que c'est OK, mais sinon, ddpeut être remplacé par catau coût de 1 octet supplémentaire.

Traumatisme numérique
la source
1
La sortie étrangère vers STDERR est autorisée par défaut. Vous pouvez remplacer {...;}par (...)pour enregistrer un octet.
Dennis
@Dennis oui, bien sûr! Apparemment, vous avez reçu cette astuce de moi :)
Digital Trauma
0

Perl 5, 53 octets

Un sous-programme:

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

Voyez-le en action comme

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

PHP, 100 98 octets

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

Dans chaque itération, créez une copie temporaire en boucle de 1 .. (première valeur supprimée) jusqu'à $a soit vide.


Ces deux sont toujours et resteront probablement à 100 octets:

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

Dans chaque boucle d'itération en arrière à travers le tableau en remplaçant chaque nombre par une plage.

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

Dans chaque boucle d'itération à travers le tableau, augmentez l'index par le numéro précédent et remplacez chaque élément indexé par une plage

Titus
la source