Sucessores de faixa reversa


21

Dado um número inteiro positivo n, faça o seguinte (e produza todas as etapas):

  1. comece com uma lista contendo ncópias de n.
  2. faça os seguintes nhorários:
  3. na iª etapa, diminua gradualmente a iª entrada da lista até atingiri

Assim, por exemplo, se um dado né 4, então você começa com [4,4,4,4], e em seguida, no primeiro passo que você tem [3,4,4,4], [2,4,4,4], [1,4,4,4]. Na segunda etapa, você tem [1,3,4,4], [1,2,4,4]. No terceiro passo você tem [1,2,3,4]. Nada é feito no quarto passo.

Então sua saída é [[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]].


Qualquer formato de entrada / saída razoável é permitido.


Aplicam-se brechas padrão . Isso é : a resposta com a menor contagem de bytes ganha.


Implementação de Python para fins de verificação .


1
Você pode declarar explicitamente que ith sempre é indexado em 1.
Kevin Cruijssen 28/03

Nós realmente temos que manipular array? Chego a uma resposta mais curta sem manipular nenhuma matriz, produzindo uma saída aceitável.
Olivier Grégoire

2
@ OlivierGrégoire Você não precisa seguir as etapas, basta produzir a saída em um formato razoável. (ou seja, vá em frente)
Leaky Nun

Respostas:


6

Geléia , 9 bytes

r€⁸Œp»\QṚ

Experimente online!

Quão?

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

* Pode ser mais fácil ver o que está acontecendo com o produto cartesiano usado acima com uma entrada diferente:

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

Você superou os incapazes de vencer.
Leaky Nun

5

R , 83 82 74 bytes

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

Experimente online!

Em vez de um loop for duplo, um whileloop é suficiente aqui: encontramos o primeiro índice em que a lista é maior que o índice e diminuímos lá.

Ktem TRUEonde N[i]>i, which(K)retorna os índices verdadeiros, e levamos o primeiro com [1].




2

APL + WIN, 54 bytes

Solicita a entrada de tela de número inteiro

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

Produz uma matriz com cada linha representando o resultado de cada etapa, por exemplo, para 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

Gelatina , 11 bytes

x`’Jḟḣ1Ʋ¦ÐĿ

Experimente online!

Como funciona

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 bytes

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)

Experimente online!


1 espaço é suficiente para recuar o código em python. Removendo espaços desnecessários e mudar para python 2 economiza 10 bytes: verificá-la
Morto Possum

@DeadPossum, embora eu saiba que poderia fazer melhor no Python 2, em breve será obsoleto, então eu queria praticar minhas habilidades em Python 3 o máximo possível.
Dat

2

Java (OpenJDK 8) , 135 bytes

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

Experimente online!

Explicação:

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

Crédito:

-8 bytes graças a Jonathan Frech !

-16 bytes graças a Kevin Cruijssen !

-1 byte graças a Okx !


4
Tem import java.util.*;medo de fazer parte da contagem de bytes. E o código do @ JonathanFrech pode ser jogado com mais 4 bytes colocando o ,i=0depois do r[]e mudando <-~apara <=a. ( Experimente online. 144 bytes ) (e eu mudei ~-ipara i-1torná-lo mais legível ..)
Kevin Cruijssen

1
139 bytes , livrando-se do import java.util.*;usando java.util.Arrays x=null;and x.fille x.toString. (Note-se que sua solução atual é de 155 bytes com o exigidoimport java.util.*;.)
Kevin Cruijssen

1
Golf um byte usando em for(;r[i-1]>i;vez de for(;r[i-1]!=i;.
Okx 28/03/19

2
@KevinCruijssen Outro byte poderia ser salva por golfe ++i<=apara i++<a.
Jonathan Frech 28/03

1
Outro byte de -2 alterando a última parte para for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) Experimente on-line 135 bytes
Kevin Cruijssen 29/03

2

Haskell, 69 67 65 63 bytes

Definição recursiva:

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

Obrigado a Laikoni por 2 bytes!


O segundo mapé dois bytes mais curto com uma compreensão da lista: Experimente online!
Laikoni 29/03

2

PHP, 153 bytes

Experimente online!

Código

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

Vou tentar diminuir os bytes ou terminar a função recursiva

Explicação

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

parece que você tem algum espaço em branco desnecessário, portanto deve ter 153 bytes - observe que eu não conheço PHP.
217 Giuseppe

sim, apenas perceba, obrigado, editando agora.
Francisco Hahn




1

J , 17 15 bytes

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

Experimente online!

Explicação

+/\@,(#=)@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

Retina , 49 bytes

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

Experimente online! Explicação:

.+
*

Converta a entrada para unário.

_
$`_,$= 

Crie uma lista de n cópias de i,nonde iestá o índice da cópia.

.

Não imprima nada (quando o loop terminar).

{

Faça um loop até o padrão não mudar.

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

Exclua temporariamente ies e converta-os nem decimal e saída.

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

Pegue a primeira entrada da lista cujo valor exceda seu índice e diminua-o.


1

Python 3 , 70 67 65 bytes

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

Experimente online!

  • (67) Convertendo para função: -3 bytes
  • (65) Removendo parênteses desnecessários: -2 bytes

Versão não destruída:

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 (clang) , 131 141 bytes

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

Experimente online!

Isso funcionará para todos naté 99. O TIO trunca a saída. Ele pode suportar arbitrariamente maiores n, alterando o tamanho da matriz mconforme a memória permitir.


O seguinte é limitado a n = 1..9, mas é significativamente mais curto

C (clang) , 89 92 bytes

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

Experimente online!

Atualizado: modificado para evitar dependência da inicialização estática


Você static/global initialization because multiple test casesnão é permitido, pois as funções precisam ser chamadas mais de uma vez.
Jonathan Frech

@Jonathan Respostas atualizadas. Eu sempre me perguntei se isso deveria ser permitido, e não consegui me decidir.
GPS

1
Aqui está o meta post relevante: codegolf.meta.stackexchange.com/a/4940/73111
Jonathan Frech

Você poderia golfe m[j]--,p()para p(m[j]--)e salvar um byte.
Jonathan Frech 29/03


0

Clojure, 132 bytes

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

Eu esperava que isso fosse mais curto ...

Menos stateful mas mais longo em 141 bytes:

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

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)

Provavelmente eu poderia jogar mais com a impressão, mas estou longe do meu computador e não tenho muita certeza das regras do python 2 sobre como definir uma variável para impressão. Atualizarei mais tarde quando chegar a um computador ou se alguém esclarecer nos comentários.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.