Aleatorizar os escalares de uma matriz

14

Você deve preencher uma matriz com todos os números do 0-ninclusive. Nenhum número deve se repetir. No entanto, eles devem estar em uma ordem aleatória.

Regras

Todas as regras de padrão e brechas padrão são proibidas

A matriz deve ser gerada pseudo-aleatoriamente. Toda permutação possível deve ter uma probabilidade igual.

Entrada

n de qualquer maneira permitida na postagem de E / S na meta.

Resultado

A matriz de números passou de 0-ninclusiva.

Christopher
fonte
a saída pode ser separada por novas linhas?
DrnglVrgs
@Riley opps que deveria ter ido embora desculpe.
Christopher
@DrnglVrgs sim, pode
Christopher
Por "números", presumo que você queira dizer "números inteiros"?
precisa saber é o seguinte
1
@KevinCruijssen IMO lists = array mas com suporte à pesquisa. Tão certo usar uma lista
Christopher

Respostas:

9

Perl 6 , 14 bytes

{pick *,0..$_}

Tente

Expandido:

{           # bare block lambda with implicit parameter 「$_」

  pick      # choose randomly without repeats
    *,      # Whatever (all)
    0 .. $_ # Range from 0, to the input (inclusive)
}
Brad Gilbert b2gills
fonte
8

05AB1E , 3 bytes

Ý.r

Experimente online!

Ý   # Make a list from 0 to input
 .r # Shuffle it randomly
Riley
fonte
8

Pitão, 3 bytes

.Sh

Demonstração

.Sé embaralhar. Envolve implicitamente um número inteiro de entrada npara o intervalo [0, 1, ..., n-1]. hé +1, e a entrada é obtida implicitamente.

isaacg
fonte
7

R , 16 bytes

sample(0:scan())

lê de stdin. sampleamostras aleatórias do vetor de entrada, retornando uma sequência (pseudo) aleatória.

Experimente online!

Giuseppe
fonte
6

Geléia , 3 bytes

0rẊ

Experimente online!

Explicação:

0rẊ 
0r  Inclusive range 0 to input.
  Ẋ Shuffle.
    Implicit print.

Solução alternativa, 3 bytes

‘ḶẊ

Explicação:

‘ḶẊ
‘   Input +1
 Ḷ  Range 0 to argument.
  Ẋ Shuffle.

Experimente online!

Camarada SparklePony
fonte
5

Python 2 , 51 bytes

lambda n:sample(range(n+1),n+1)
from random import*

Experimente online!

Existe, random.shuffle()mas ele modifica o argumento em vez de retorná-lo ...

totalmente humano
fonte
Você pode usarrandom.shuffle
Caird coinheringaahing
@cairdcoinheringaahing Sim, mas isso não funcionaria. Por exemplo, lambda n:shuffle(range(n+1))não gravaria a saída em nenhum lugar.
totallyhuman
4

Bash, 18 11 bytes

shuf -i0-$1

Experimente online!

DrnglVrgs
fonte
Se novas linhas são permitidos podemos esquecer a parte echo
DrnglVrgs
3

Mathematica, 24 bytes

RandomSample@Range[0,#]&
J42161217
fonte
3

MATL , 4 bytes

QZ@q

Experimente online!

Explicação

Q     % Implicitly input n. Add 1
Z@    % Random permutation of [1 2 ... n+1]
q     % Subtract 1, element-wise. Implicitly display
Luis Mendo
fonte
3

Japonês , 4 bytes

ò öx

Experimente online


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.
Shaggy
fonte
Puta que pariu, pensei öxque seria o suficiente até perceber a parte "inclusiva". (Você pode substituir o xcom quase qualquer outra coisa, btw)
ETHproductions
@ETHproductions, esse foi o meu primeiro pensamento também.
Shaggy
3

C #, 76 bytes

using System.Linq;i=>new int[i+1].Select(x=>i--).OrderBy(x=>Guid.NewGuid());

Isso retorna um IOrderedEnumerable, espero que esteja tudo bem, ou então preciso de mais alguns bytes para um .ToArray ()

LiefdeWen
fonte
3

CJam , 7 6 bytes

1 byte removido graças a Erik, o Outgolfer .

{),mr}

Este é um bloco anônimo (função) que pega um número inteiro da pilha e o substitui pelo resultado. Experimente online!

Explicação

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block
Luis Mendo
fonte
{),mr}1 byte não é mais curto?
Erik the Outgolfer
@EriktheOutgolfer Indeed! Obrigado
Luis Mendo
3

Java 8, 114 111 97 bytes

import java.util.*;n->{List l=new Stack();for(;n>=0;l.add(n--));Collections.shuffle(l);return l;}

-3 bytes e correções de bugs graças a @ OlivierGrégoire .
-4 bytes graças a @Jakob .
-10 bytes removendo .toArray().

Explicação:

Experimente aqui.

import java.util.*;        // Required import for List, Stack and Collections
n->{                       // Method with integer parameter and Object-array return-type
  List l=new Stack();      //  Initialize a List
  for(;n>=0;l.add(n--));   //  Loop to fill the list with 0 through `n`
  Collections.shuffle(l);  //  Randomly shuffle the List
  return l;                //  Convert the List to an Object-array and return it
}                          // End of method
Kevin Cruijssen
fonte
1
Bug: não inclui n. Fix e golfe: for(n++;--n>=0;l.add(n));. Além disso, eu digo que você não precisa retornar uma matriz. Matriz e lista são iguais na maioria dos idiomas, portanto, basta retornar a lista.
Olivier Grégoire
@ OlivierGrégoire Woops .. Isso é o que você ganha por não checar corretamente e apenas postar .. Obrigado pela correção de bugs (e 4 bytes salvos no processo).
Kevin Cruijssen
1
Bem, na verdade três, porque editei novamente, introduzindo outro bug: >deveria ser >=.
Olivier Grégoire
1
-4 bytes: use a em Stackvez de ae Vectoraltere seu loop para for(;n>=0;l.add(n--));. E devolver um java.util.Listé definitivamente bom.
21417 Jakob
2

Ohm , 2 bytes

#╟

Experimente online!

Nick Clifford
fonte
Este é um link melhor.
Erik the Outgolfer
2

Pyth, 4 bytes

.S}0

Experimente aqui!

KarlKastor
fonte
Você pode jogar golfe a 3 bytes. .Scom um argumento inteiro é o mesmo que .SU, e [0..n]pode ser codificado como Uh, para que você possa usar o .SUhque se torna .Sh.
Erik the Outgolfer
@EriktheOutgolfer, obrigado pela dica, mas como alguém já publicou a solução que você propõe, deixarei isso como este.
KarlKastor 31/05
Bem, é limítrofe se essa deveria ter sido uma resposta separada ou não, mas acredito que isso é uma mentira, portanto, mesmo sendo permitido, eu consideraria apenas uma substituição embutida, então nah, eu não queria postar separado, mas Isaac fez.
Erik the Outgolfer
2

C, 75 bytes

a[99],z,y;f(n){if(n){a[n]=--n;f(n);z=a[n];a[n]=a[y=rand()%(n+1)];a[y]=z;}}

Função recursiva que é inicializada a partir do final da matriz na entrada e troca com um elemento aleatório antes da saída.

Computronium
fonte
E se n > 98?
LegionMammal978
É claro que falharia, mas o intervalo de entrada não foi especificado no problema. Por favor, não me faça mal :)
Computronium
mudar apara um para se ajustar mais à regra?
l4m2
67 bytes
ceilingcat
2

Carvão , 33 bytes

A…·⁰NβFβ«AβδA‽δθPIθ↓A⟦⟧βFδ¿⁻θκ⊞βκ

Experimente online! Link é a versão detalhada do código.

Aparentemente, são necessários 17 bytes para remover um elemento de uma lista no Charcoal.

Editar: Atualmente, são necessários apenas três bytes, desde que você deseje remover todas as ocorrências do item da lista. Isso, além de outras alterações no carvão, reduz a resposta para 21 bytes: Experimente online!

Neil
fonte
Caramba, isso é muita coisa
Christopher
2

APL (Dyalog) , 5 bytes

?⍨1+⊢

Experimente online!

Supõe ⎕IO←0, que é o padrão em muitas máquinas.

Explicação

o argumento certo

1+ adicione 1 a ele

?⍨gerar números 0 .. 1+⊢-1 e distribuí-los aleatoriamente em uma matriz para que dois números não se repitam

Kritixi Lithos
fonte
2

q / kdb +, 11 bytes

Solução:

{(0-x)?1+x}

Exemplo:

q){(0-x)?1+x}10
5 9 7 1 2 4 8 0 3 10
q){(0-x)?1+x}10
6 10 2 8 4 5 9 0 7 3
q){(0-x)?1+x}10
9 6 4 1 10 8 2 7 0 5

Explicação:

Use o ? operador com uma entrada negativa para fornecer a lista completa de 0->nsem duplicatas:

{(0-x)?1+x} / solution
{         } / lambda expression
         x  / implicit input
       1+   / add one
      ?     / rand
 (0-x)      / negate x, 'dont put item back in the bag'
rua
fonte
2

TI-83 BASIC, 5 bytes (chato)

randIntNoRep(0,Ans

Sim, um embutido. randIntNoRep(é um token de dois bytes e Ansé um byte.

Mais divertido, 34 bytes:

Ans→N
seq(X,X,0,N→L₁
rand(N+1→L₂
SortA(L₂,L₁
L₁

Direto do tibasicdev . Provavelmente jogável, mas ainda não encontrei nada.

O que isso faz: Classifica uma matriz aleatória, movendo elementos do segundo argumento ( L₁aqui) da mesma maneira que seus elementos correspondentes.

Khuldraeseth na'Barya
fonte
1

JavaScript (ES6), 51 bytes

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())
Shaggy
fonte
2
Eu não acho isso uniforme; Eu tentei f(5)10 vezes e 5sempre foi um dos dois últimos itens.
ETHproductions
Apenas executei novamente algumas vezes e obtive 1,5,4,0,2,3& 1,0,2,5,3,4. EDIT: E mais alguns prnt.sc/fe0goe
Shaggy
3
Acabei de executar um teste rápido que é executado f(5)1e5 vezes e encontra a posição média de cada número nos resultados. A matriz resultante foi [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], então não acho que seja uniforme. ( code )
ETHproductions
Eu acho que tenho uma solução de 93 bytes que poderia funcionar. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
Kamoroso94
A classificação do resultado de random()não é uniforme. Veja (por exemplo) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil
1

Aceto , 15 14 16 bytes

@lXp
Y!`n
zi&
0r

Pressione zero na pilha, leia um número inteiro, construa um intervalo e embaralhe-o:

Y
zi
0r

Defina uma marca de captura, comprimento de teste para 0 e (nesse caso) saída:

@lX
 !`

Caso contrário, imprima o valor, uma nova linha e retorne ao teste de comprimento:

   p
   n
  &

(Eu tive que mudar o código porque percebi que interpretava mal a pergunta e havia construído um intervalo de 1-n, não 0-n.)

L3viathan
fonte
1

Go , 92 bytes

Perda principalmente pela necessidade de semear o PRNG.

import(."fmt";."math/rand";."time")
func f(n int){Seed(Now().UnixNano());Println(Perm(n+1))}

Experimente online!

totalmente humano
fonte
1

Ruby, 20 bytes

->n{[*0..n].shuffle}

canhascodez
fonte
1

8o , 42 36 34 bytes

Código

>r [] ' a:push 0 r> loop a:shuffle

SED (diagrama de efeito de pilha) é n -- a

Uso e exemplo

ok> 5 >r [] ' a:push 0 r> loop a:shuffle .
[2,5,0,3,1,4]
Chaos Manor
fonte
1

Javascript (ES6), 68 bytes

n=>[...Array(n+1)].map((n,i)=>[Math.random(),i]).sort().map(n=>n[1])

Cria uma matriz de formulário

[[Math.random(), 0],
 [Math.random(), 1],
 [Math.random(), 2],...]

Em seguida, classifica e retorna os últimos elementos na nova ordem

Tudo bem eu
fonte
1

J, 11 bytes

(?@!A.i.)>:

Explicação:

         >:   | Increment
(?@!A.i.)     | Fork, (f g h) n is evaluated as (f n) g (h n)
      i.      | Integers in range [0,n) inclusive
 ?@!          | Random integer in the range [0, n!)
    A.        | Permute right argument according to left

Exemplos:

    0 A. i.>:5
0 1 2 3 4 5
    1 A. i.>:5
0 1 2 3 5 4
    (?@!A.i.)>: 5
2 3 5 1 0 4
    (?@!A.i.)>: 5
0 3 5 1 2 4
Bolce Bussiere
fonte
1

Tcl , 90 bytes

proc R n {lsort -c {try expr\ rand()>.5 on 9} [if [incr n -1]+2 {concat [R $n] [incr n]}]}

Experimente online!

Tcl , 96 bytes

proc R n {proc f a\ b {expr rand()>.5}
set i -1
while \$i<$n {lappend L [incr i]}
lsort -c f $L}

Experimente online!

sergiol
fonte
Tente superar o mesmo número de bytes: tio.run/…
sergiol