Преемники обратного диапазона

21

Учитывая положительное целое число n, сделайте следующее (и выведите каждый этап):

  1. начать со списка, содержащего nкопии n.
  2. сделать следующее nвремя:
  3. на iшаге постепенно уменьшать iзапись списка до тех пор, пока она не достигнетi

Так, например, если данная nявляется 4, то вы начинаете с [4,4,4,4], а затем на первом этапе у вас есть [3,4,4,4], [2,4,4,4], [1,4,4,4]. На втором этапе, у вас есть [1,3,4,4], [1,2,4,4]. На третьем этапе у вас есть [1,2,3,4]. На четвертом шаге ничего не делается.

Итак, ваш вывод [[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]].


Разрешен любой разумный формат ввода / вывода.


Применяются стандартные лазейки . Это : ответ с наименьшим выигрышем.


Реализация Python для проверки .

Дрянная Монахиня
источник
1
Вы можете явно указать, что ith всегда 1-индексирован.
Кевин Круйссен,
Мы действительно должны манипулировать массивом? Я получаю более короткий ответ, не манипулируя никаким массивом, производя приемлемый вывод.
Оливье Грегуар
2
@ OlivierGrégoire Вам не нужно выполнять шаги, вам просто нужно вывести результат в разумном формате. (т.е. идти вперед)
Дрянная Монахиня,

Ответы:

6

Желе , 9 байт

r€⁸Œp»\QṚ

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

Как?

r€⁸Œp»\QṚ - Link: integer, N    e.g. 4
 €        - for €ach of implicit range of N (i.e. for i in [1,2,3,...N])
  ⁸       -   with the chain's left argument, N on the right:
r         -     inclusive range (for i<=N this yields [i, i+1, ..., N]
          - ...leaving us with a list of lists like the post-fixes of [1,2,3,....,N]
          -                     e.g. [[1,2,3,4],[2,3,4],[3,4],[4]]
   Œp     - Cartesian product* of these N lists
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,3,4],[1,3,4,4],[1,4,3,4],[1,4,4,4],[2,2,3,4],[2,2,4,4],[2,3,3,4],[2,3,4,4],[2,4,3,4],[2,4,4,4],[3,2,3,4],[3,2,4,4],[3,3,3,4],[3,3,4,4],[3,4,3,4],[3,4,4,4],[4,2,3,4],[4,2,4,4],[4,3,3,4],[4,3,4,4],[4,4,3,4],[4,4,4,4]]
      \   - cumulative reduce with:
     »    -   maximum (vectorises)
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,3,4,4],[1,4,4,4],[1,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]
       Q  - de-duplicate        e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,4,4,4],[2,4,4,4],[3,4,4,4],[4,4,4,4]]
        Ṛ - reverse             e.g. [[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]]

* Может быть проще увидеть, что происходит с декартовым произведением, использованным выше, с другим входом:

the Cartesian product of [[0,1,2],[3,4],[5]]
is [[0,3,5],[0,4,5],[1,3,5],[1,4,5],[2,3,5],[2,4,5]]
Джонатан Аллан
источник
Вы превзошли по счету тех, кто не в состоянии одолеть.
Дрянная Монахиня
5

R , 83 82 74 байт

N=rep(n<-scan(),n);while({print(N);any(K<-N>1:n)})N[x]=N[x<-which(K)[1]]-1

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

Вместо двойного цикла whilefor здесь достаточно цикла: мы находим первый индекс, где список больше индекса, и уменьшаем его там.

Kимеет TRUEгде угодно N[i]>i, which(K)возвращает истинные показатели, и мы берем первое с [1].

Giuseppe
источник
2

APL + WIN, 54 байта

Запрашивает ввод целого числа на экране

((⍴m)⍴n)-+⍀m←0⍪(-0,+\⌽⍳n-1)⊖((+/+/m),n)↑m←⊖(⍳n)∘.>⍳n←⎕

Выводит матрицу, в которой каждая строка представляет результат каждого шага, например, для 4:

4 4 4 4
3 4 4 4
2 4 4 4
1 4 4 4
1 3 4 4
1 2 4 4
1 2 3 4
Грэхем
источник
2

Желе , 11 байт

x`’Jḟḣ1Ʋ¦ÐĿ

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

Как это устроено

x`’Jḟḣ1Ʋ¦ÐĿ  Main link. Argument: n

x`           Repeat self; yield an array of n copies of n.
         ÐĿ  While the results are unique, repeatedly call the link to the left.
             Return the array of all unique results, including the initial value.
  ’     ¦      Decrement the return value at all indices specified by the chain
               in between.
       Ʋ         Combine the four links to the left into a monadic chain.
   J               Indices; yield [1, ..., n].
    ḟ              Filterfalse; remove all indices that belong to the return value.
     ḣ1            Head 1; truncate the result to length 1.
Деннис
источник
2

Python 3 , 91 байт

n=int(input())
x=[n]*n;print(x)
for i in range(n):
    for j in[0]*(n-i-1):x[i]-=1;print(x)

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

Dat
источник
Для отступа кода в python достаточно 1 пробела. Удаление ненужных пробелов и переключение на python 2 экономит 10 байт: проверьте это
Dead Possum
@DeadPossum, хотя я знаю, что мог бы добиться большего успеха в Python 2, он скоро устареет, поэтому я хотел как можно больше практиковать свои навыки в Python 3.
Dat
2

Java (OpenJDK 8) , 135 байт

a->{int r[]=new int[a],i=0;java.util.Arrays x=null;x.fill(r,a);for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));}

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

Объяснение:

int r[]=new int[a],i=0;    //Initialize array and loop counter
java.util.Arrays x=null;    //reduces the number of of “Arrays” needed from 3 to 1
x.fill(r,a);    //Sets each value in array length n to int n
for(r[0]++;i<a;r[i++]++)    //Increment everything!
  for(;--r[i]>i;    //If decremented array element is larger than element number:
     System.out.print(x.toString(r)));}    //Print the array

Кредит:

-8 байт благодаря Джонатану Фреху !

-16 байт благодаря Кевину Круйссену !

-1 байт благодаря Okx !

X1M4L
источник
4
import java.util.*;Является частью байт-счетчик , я боюсь. И код @ JonathanFrech может быть обработан еще 4 байтами, поставив ,i=0после r[]и изменив <-~aна <=a. ( Попробуйте онлайн. 144 байта ) (и я изменил ~-iего, i-1чтобы сделать его более читабельным ..)
Кевин Круйссен
1
139 байт , избавившись от import java.util.*;с помощью java.util.Arrays x=null;и x.fillи x.toString. (Обратите внимание, что ваше текущее решение составляет 155 байтов с необходимымиimport java.util.*;.)
Кевин Круйссен,
1
Гольф байт, используя, for(;r[i-1]>i;а не for(;r[i-1]!=i;.
Okx
2
@KevinCruijssen Другой байт может быть сохранен в гольф ++i<=aв i++<a.
Джонатан Фрех
1
Еще -2 байта, изменяя последнюю часть на for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) Попробуйте онлайн 135 байтов
Кевин Круйссен
2

Haskell, 69 67 65 63 байта

Рекурсивное определение:

f 0=[[]]
f a=map(:(a<$[2..a]))[a,a-1..2]++[1:map(+1)x|x<-f$a-1]

Спасибо Лайкони за 2 байта!

Angs
источник
Второй mapна два байта короче с пониманием списка: попробуйте онлайн!
Лайкони
2

PHP, 153 байта

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

Код

function f($n){
$a=array_fill(0,$n,$n);$r=json_encode($a)."\n";$p=0;while($p<$n)
{if($a[$p]!=$p+1){$a[$p]--;$r.=json_encode($a)."\n";}else{$p++;}}echo$r;}

Попробуем уменьшить байты или завершить рекурсивную функцию

объяснение

function f($n){
  $a=array_fill(0,$n,$n);          #start with $nlength array filled with $n
  $r=json_encode($a)."\n";         #pushed to the string to output
  $p=0;                            #first position
  while($p<$n){                    #on position $n ($n-1) we do nothing
    if($a[$p]!=$p+1){              #comparing the position+1 to the value
     $a[$p]--;                     #it gets decreased by 1
     $r.= json_encode($a)."\n";    #and pushed
   } else {
     $p++;                       #when position+1 = the value,
   }                               #position is changed ++
  }
   echo $r;
  }
Франциско Хан
источник
Похоже, у вас есть лишние пробелы, поэтому это должно быть 153 байта - обратите внимание, что я не знаю PHP.
Джузеппе
да, просто понимаю, спасибо, редактирую сейчас.
Франциско Хан,
1

Python 2 , 80 76 байт

i=input();l=[i]*i;print l
for x in range(i):
 while l[x]>x+1:l[x]-=1;print l

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

Немного расточительно иметь два printутверждения, но я не могу придумать лучшего способа в данный момент.

ElPedro
источник
75 байтов .
Джонатан Фрех
1

Python 2 , 70 байт

-2 байта благодаря @LeakyNun
-2 байта благодаря @JonathanFrech

i=I=input()
l=[I]*I
exec"exec'print l;l[-i]-=1;'*max(~-i,2);i-=1;"*~-I

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

Мертвый Опоссум
источник
1
(I-1)->~-I
Дрянная Монахиня
1
70 байтов , инициализация i=Iи уменьшение.
Джонатан Фрех
1

J , 17 15 байт

+/\@,(#=)@i.&.-

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

объяснение

+/\@,(#=)@i.&.-  Input: n
              -  Negate n
          i.     Reverse of range [0, n)
       =           Identity matrix of order n
      #            Copy each row by the reverse range
              -  Negate
    ,            Prepend n
+/\              Cumulative sum of rows
миль
источник
1

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

.+
*
_
$`_,$= 
.{*\`_+,(_+)
$.1
0`(\b(_+),\2)_
$1

Попробуйте онлайн!Объяснение:

.+
*

Преобразовать ввод в унарный.

_
$`_,$= 

Создайте список из n копий, i,nгдеi находится индекс копии.

.

Не печатайте ничего (когда цикл заканчивается).

{

Цикл, пока рисунок не изменится.

*\`_+,(_+)
$.1

Временно удалите is и конвертируйтеn s в десятичную и выведите.

0`(\b(_+),\2)_
$1

Возьмите первую запись списка, значение которой превышает ее индекс, и уменьшите ее.

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

Python 3 , 70 67 65 байт

def f(n):
 k=0;a=[n]*n
 while k<n-1:print(a);k+=a[k]==k+1;a[k]-=1

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

  • (67) Преобразование в функцию: -3 байта
  • (65) Удаление ненужных скобок: -2 байта

Безголовая версия:

def f(n):
    k = 0
    a = [n] * n             # create n-item list with all n's
    while k < n - 1:        # iterate through columns 0..n-1
        print(a)            # print whole list
        if a[k] == k + 1:   # move to the next column when current item reaches k+1
            k += 1
        a[k] -= 1           # decrement current item
xbarbie
источник
0

C (лязг) , 131 141 байт

i,j,k,m[99];p(){for(k=0;m[k];printf("%d ",m[k++]));puts("");}f(n){for(j=k=m[n]=0;k<n;m[k++]=n);p();for(;j<n;j++)for(i=1;i++<n-j;m[j]--,p());}

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

Это будет работать для всех nдо 99. TIO усекает вывод. Он может поддерживать произвольно больший nразмер, изменяя размер массива, mесли позволяет память.


Следующее ограничено n = 1,9, но значительно короче

C (лязг) , 89 92 байта

i,j;char m[12];f(n){j=!puts(memset(m,n+48,n));for(;j<n;j++)for(i=1;i++<n-j;m[j]--,puts(m));}

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

Обновлено: изменено, чтобы избежать зависимости от статической инициализации

GPS
источник
Ваш static/global initialization because multiple test casesне допускается, так как функции должны вызываться более одного раза.
Джонатан Фрех
@Jonathan Обновленные ответы. Я всегда задавался вопросом, должно ли это быть позволено, и не мог решить.
GPS
1
Вот соответствующая мета-запись: codegolf.meta.stackexchange.com/a/4940/73111
Джонатан Фрех
Вы можете играть m[j]--,p()в гольф p(m[j]--)и сохранить байт.
Джонатан Фрех
128 байт
floorcat
0

Clojure, 132 байта

#(loop[R[(vec(repeat % %))]j(- % 2)i 0](if(> i j)R(recur(conj R(update(last R)i dec))(if(= i j)(- % 2)(dec j))(if(= i j)(inc i)i))))

Я надеялся, что это будет короче ...

Менее с состоянием, но длиннее на 141 байт:

#(apply map list(for[i(range %)](concat(repeat(nth(cons 0(reductions +(reverse(range %))))i)%)(range % i -1)(if(>(dec %)i)(repeat(inc i))))))
NikoNyrh
источник
0

Python 3, 101 байт

def f(n):
 p=print;m=[n for_ in range(n)];p(m)
 for i in range(n):
    while m[i]>1+i:m[i]-=1;p(m)

Вероятно, я мог бы больше играть в гольф с печатью, но я далеко от своего компьютера и не совсем уверен в правилах Python 2 по установке переменной для печати. Я обновлю позже, когда доберусь до компьютера или если кто-то уточнит в комментариях.

sonrad10
источник