Прикинь, замени, повтори!

18

Определение

Определите n- й массив последовательности CURR следующим образом.

  1. Начните с одноэлементного массива A = [n] .

  2. Для каждого целого к в А , заменить запись K с K натуральных чисел, подсчитывая от 1 до K .

  3. Повторите предыдущий шаг n - еще 1 раз.

Например, если n = 3 , мы начинаем с массива [3] .

Заменим 3 на 1, 2, 3 , получив [1, 2, 3] .

Теперь мы заменим 1 , 2 и 3 на 1 ; 1, 2 и 1, 2, 3 (соотв.), Получая [1, 1, 2, 1, 2, 3] .

Наконец, мы выполняем те же замены, что и на предыдущем шаге, для всех шести целых чисел в массиве, получая [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] . Это третий массив CURR.

задача

Напишите программу функции, которая, учитывая строго положительное целое число n в качестве входных данных, вычисляет n- й массив CURR.

Выходными данными должен быть какой-то плоский список (и массив, возвращаемый функцией, строковое представление синтаксиса массива вашего языка, разделенных пробелами и т. Д.).

Это . Пусть победит самый короткий код в байтах!

Контрольные примеры

 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
Связанный: считать, заменить, добавить! ._.
Деннис
Можем ли мы принять входные данные как одноэлементный массив (например [2]), а не как целое число?
Мего
@Mego Давайте держать это в целых числах.
Деннис
Я чувствую, что для этого должна быть последовательность OEIS.
DanTheMan
@DanTheMan Это не целочисленная последовательность в ее текущей форме, но я думаю, что ее можно превратить в одну, объединяя результаты для всех натуральных чисел.
Деннис

Ответы:

23

Желе, 3 байта

R¡F

Попробуйте онлайн

объяснение

R¡F    Argument n

R      Yield range [1..n]
 ¡     Repeat n times
  F    Flatten the result
Essari
источник
Это ... просто великолепно ... по сравнению с моим ответом на желе.
Дрянная Монахиня
6
Отличный первый пост!
Синий
16

Python, 50 байт

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

Сфера злоупотребления! Например, для i=3строки, которая должна быть оценена, расширяется до.

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

Каким-то образом, несмотря на использование входной переменной функции iдля всего, Python различает каждый индекс итерации как принадлежащий отдельной области видимости, как если бы выражение было

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

с iвходом в функцию.

XNOR
источник
Этот трюк работает и в Firefox 30+ и сэкономил мне 3 байта, спасибо!
Нил
@DigitalTrauma И Python, и JavaScript имеют eval, очевидно, сам код должен быть портирован, но я подумал, что вы все равно можете это предположить.
Нил
@ Нил О, я вижу - я совершенно не понял :)
Цифровая травма
12

05AB1E, 6 3 байта

DFL

Разъяснения

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

Попробуйте онлайн

Сохранено 3 байта благодаря @Adnan

Emigna
источник
DFLна 3 байта короче :)
Аднан
1
@Adnan: не знал, что L работал так в списках. Немного удивительно, что он сплющивается автоматически.
Эминья
3
На самом деле это ошибка, которую я никогда не исправлял: с.
Аднан
6

Сетчатка , 33 байта

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

Ввод и вывод в одинарный.

Попробуйте онлайн!

Несмотря на то, что я не использовал закрытую форму для связанной задачи, адаптация этого ответа была на удивление хитрой.

Мартин Эндер
источник
+%(M!&это самая длинная метка, которую я когда-либо видел.
Дрянная Монахиня
6

Python 2, 82 байта

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

Это не самое короткое решение, но оно иллюстрирует интересный метод:

  • Запишите первые 2^(2*n-1)числа в двоичном виде
  • Держите те именно с nних
  • Для каждого числа посчитайте количество конечных нулей и добавьте 1.
XNOR
источник
4

На самом деле, 9 байтов

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

Спасибо Leaky Nun за байт и вдохновение за еще 2 байта.

Mego
источник
;#@"♂R♂i"*ƒсохраняет байт
Leaky Nun
@ LeakyNun Хороший улов - ;#@`♂R♂i`nспасает еще один!
Мего
Я собирался попробовать суммирование, лол.
Утренняя монахиня
Я думаю, что 9 будет оптимальным решением здесь
Mego
Ваша ссылка все еще устарела.
Дрянная Монахиня
4

C #, 128 байт

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
источник
С using static System.Linq.Enumerable, вы можете сделать это:int[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
умереть maus
4

APL, 11 байт

{∊⍳¨∘∊⍣⍵+⍵}

Тестовое задание:

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

Объяснение:

  • +⍵: начиная с ,
  • ⍣⍵: сделайте следующее время:
    • ⍳¨∘∊: выровнять вход, а затем сгенерировать список [1..N] для каждого N на входе
  • : сгладить результат этого
Мэринус
источник
2
Проще:{(∊⍳¨)⍣⍵⊢⍵}
Адам
@ Adám: Ах, да, поезда работают не так, как Дж. Я начал с того, {(∊∘(⍳¨))⍣⍵+⍵}что подумал, а как мне избавиться от этих скоб?
марин
2

CJam, 14 байтов

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

Проверьте это здесь.

объяснение

_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 байтов

1 байт сохранен с вдохновением от ответа Эссари.

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

Довольно просто: для ввода xмы начинаем с, {x}а затем применяем Rangeк нему xвремя ( Rangeэто Listableозначает, что оно автоматически применяется к целым числам внутри произвольно вложенных списков). В итоге Flattenрезультат.

Мартин Эндер
источник
2

Clojure, 59 байт

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

Объяснение:

Действительно прямой путь решения проблемы. Работаем изнутри:

(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 байта

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

Это просто прямой перевод описания проблемы в код.

Изменить: Сохраненный один байт благодаря @Dennis.

Эндрю Эпштейн
источник
Вы printможете выйти за пределы exec.
xnor
Да, это то, что у меня было поначалу, но [k]по какой-то причине оно просто печатается . Я перестал пытаться выяснить, был ли это вопрос объема или что-то еще.
Эндрю Эпштейн
Да, это похоже на проблему сферой . Он отлично работает в Python 2.
xnor
2

R, 60 49 байтов

Довольно простое использование unlistи sapply.

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

Спасибо @MickyT за сохранение 11 байтов

надувной
источник
@MickyT спасибо за совет, я могу использовать, seqчтобы уменьшить количество байтов
bouncyball
Извините, что неправильно прочитал вопрос
MickyT
2

php 121

На самом деле не так уж много хитростей за этим. Сглаживание массива в php не короткое, поэтому необходимо сначала построить его массив

<?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
источник
Держать это плоским - хорошая идея. Но функции обратного вызова тоже не короткие. Избили тебя на 15 байтов. Вы можете сохранить 4 байта с коротким тегом <?или 6 байтов с -rи без тега.
Тит
2

Haskell, 33 байта

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

Спасибо Ними за сохранение байта.

Бессмысленная версия длиннее (35 байт):

(!!)=<<iterate(>>= \a->[1..a]).pure
XNOR
источник
iterate(>>= \a->[1..a])на один байт меньше.
Ними
2

JavaScript (Firefox 30-57), 63 60 байт

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

Порт ответа @ xnor на Python.

Нил
источник
Я попробовал это с Firefox 42 ( SyntaxError: missing : in conditional expression) и Babel ( Unexpected token (1:21)). Что я делаю неправильно?
Деннис
@ Денис Извините, но я понятия не имею; По какой-то причине у меня действительно есть Firefox 42 на одной из моих машин, и я дважды проверил, и там он работал нормально. (Я также проверил Firefox 37 и 47, чтобы быть уверенным.)
Нил
Да, страница не обновилась, и я проверил вашу старую версию. Новый работает просто отлично.
Деннис
@ Деннис А, похоже, )что эта версия как-то закралась.
Нил
1

J, 18 байт

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

Прямой подход, основанный на процессе, описанном в задаче.

использование

   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

объяснение

([:;<@(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 байт

usSMGQ]Q

Попробуйте онлайн!

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

Желе, 7 байт

Быстро, прежде чем Деннис отвечает (JK)

WR€F$³¡

Попробуйте онлайн!

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 байта

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

Возвращает анонимную функцию, принимающую n в качестве входных данных.

Заменяет каждую запись k в A на [1..k], повторяет процесс n раз, начиная с A = [n].

хло
источник
1

Swift 3, 58 байт

Предназначен для запуска прямо на игровой площадке, где n установлено на входе:

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

Ungolfed, с самой короткой нотацией стороны возвращены:

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 байт

Процедура

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

использование

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

Пример вывода:

[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 байт

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

Редактировать: 1 байт сохранен благодаря @xnor. Сохранено 2 байта благодаря @ Деннис ♦.

Нил
источник
Вы можете удалить Parens вокруг exec. В Python 2 это ключевое слово, а не функция. Я считаю 68 байтов между прочим.
Деннис
@ Деннис Ах, это значит, что я ошибся в подсчете, и изначально он был 69 байтов ...
Нил
1

Утилиты Bash + GNU, 49

  • 1 байт сохранен благодаря @Dennis.

Трубная рекурсивная функция FTW!

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

nпередается в командной строке. Вывод через новую строку

Использование ddприводит к отправке статистики в STDERR. Я думаю, что это нормально, но если нет, то ddможет быть заменено catна 1 дополнительный байт.

Цифровая травма
источник
1
Посторонний вывод в STDERR разрешен по умолчанию. Вы можете заменить {...;}на, (...)чтобы сохранить байт.
Деннис
@ Денис, да, конечно! Видимо, вы получили этот совет от меня :)
Digital Trauma
0

Perl 5, 53 байта

Подпрограмма:

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

Увидеть это в действии как

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'
msh210
источник
0

Рубин, 61 байт

def f(n);a=[n];n.times{a=a.map{|i|(1..i).to_a}.flatten};a;end
Андрей
источник
Здравствуй! Добро пожаловать в PPCG. Краткое объяснение было бы хорошо!
TheCoffeeCup
Добро пожаловать в PPCG! Если задача не отменяет этого, все представления должны быть полными программами или функциями , а не просто фрагментами. (И в этом случае вызов фактически подтверждает это требование.)
Мартин Эндер
0

PHP, 100 98 байт

Беги с 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);

В каждой итерации создайте временную копию цикла с 1 .. (первое значение удалено), пока не $aстанет пустым.


Эти два все еще и, вероятно, останутся в 100 байтах:

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

В каждом цикле итерации в обратном порядке через массив заменяя каждое число диапазоном.

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

В каждом цикле итерации через массив увеличивайте индекс на предыдущее число и заменяйте каждый индексированный элемент диапазоном

Titus
источник