Наступники з реверсним діапазоном


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-індексованим.
Kevin Cruijssen

Чи нам справді доводиться маніпулювати масивом? Я добираюсь до коротшої відповіді, не маніпулюючи жодним масивом, даючи прийнятний вихід.
Олів'є Грегоар

2
@ OlivierGrégoire Вам не доведеться виконувати кроки, потрібно просто зробити результат у розумному форматі. (тобто йти вперед)
Leaky Nun

Відповіді:


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]]

Ви перемогли не здатного перемогти.
Leaky Nun

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

Спробуйте в Інтернеті!

Замість подвійного циклу для whileциклу тут достатньо циклу: ми знаходимо перший індекс, де список більший за індекс, і декремент там.

Kмає TRUEвсюди N[i]>i, which(K)повертає справжні показники, і ми беремо перші з [1].




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)

Спробуйте в Інтернеті!


1 місця достатньо для відступу коду в python. Видалення непотрібних пробілів та перехід на python 2 заощаджує 10 байт: перевірити це
Dead Possum

@DeadPossum, хоча я знаю, що міг би зробити краще в Python 2, його скоро буде застарілим, тому я хотів якомога більше практикувати свої навички Python 3.
Дат

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 байт завдяки Kevin Cruijssen !

-1 байт завдяки Okx !


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;.
Окс

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


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

Сітківка , 49 байт

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

Спробуйте в Інтернеті! Пояснення:

.+
*

Перетворити вхід в одинаковий.

_
$`_,$= 

Створіть список із n примірників, i,nде iзнаходиться індекс копії.

.

Не друкуйте нічого (коли цикл закінчується).

{

Цикл, доки шаблон не зміниться.

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

Тимчасово видаліть is та перетворіть ns у десятковий та вихідний.

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

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

Спробуйте в Інтернеті!

Оновлено: Змінено, щоб уникнути залежності від статичної ініціалізації


Вам static/global initialization because multiple test casesзаборонено, оскільки функції потрібно дзвонити не один раз.
Джонатан Фрех

@Jonathan Оновлені відповіді. Я завжди замислювався, чи потрібно це дозволити, і не міг вирішити.
GPS

1
Ось відповідна мета-повідомлення: codegolf.meta.stackexchange.com/a/4940/73111
Джонатан

Ви можете m[j]--,p()взяти участь у гольф p(m[j]--)і зберегти байт.
Джонатан Фрех


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

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 щодо встановлення змінної для друку. Я оновлю пізніше, коли доберуся до комп’ютера або якщо хтось уточнить у коментарях.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.