Casualità arbitraria


26

La casualità è divertente. Le sfide senza senso sono divertenti.

Scrivi una funzione a cui, dato l'input intero n, verrà emesso un insieme (non ordinato, unico) di ninteri esattamente casuali tra 1e n^2(compreso) in modo che la somma di tutti gli interi sia uguale n^2.

La casualità non deve essere uniforme, a condizione che ogni set valido abbia una probabilità diversa da zero.

Vince la risposta più breve in byte (per ogni lingua).

Esempi

Input (n) = 1, Target (n^2) = 1
Sample of possible outputs:
1

Input = 2, Target = 4
Sample of possible outputs:
3, 1
1, 3

Input = 3, Target = 9
Sample of possible outputs:
6, 1, 2
3, 5, 1
4, 3, 2

Input = 4, Target = 16
Sample of possible outputs:
1, 3, 5, 7
2, 4, 1, 9
8, 3, 1, 4

Input = 5, Target = 25
Sample of possible outputs:
11, 4, 7, 1, 2
2, 3, 1, 11, 8
6, 1, 3, 7, 8

Input = 8, Target = 64
Sample of possible outputs:
10, 3, 9, 7, 6, 19, 8, 2
7, 16, 2, 3, 9, 4, 13, 10
7, 9, 21, 2, 5, 13, 6, 1

Attività bonus: esiste una formula per calcolare il numero di permutazioni valide per un dato n?


2
imparentato , ma abbastanza diverso
Giuseppe,

1
(p / s: se hai un algoritmo veloce ma richiede più byte, considera di attendere fino all'edizione speed (attualmente in sandbox) per pubblicarlo.)
user202729

1
@EriktheOutgolfer Sebbene ci siano (molto) modi migliori di generare tutti i set e sceglierne uno casuale, sono molto più difficili da implementare e probabilmente più lunghi. Conservali per l'edizione Speed.
user202729

2
Il numero di set è OEIS A107379 .
nwellnhof,

1
Sono entrambi. Vedi il commento "Anche il numero di partizioni di n ^ 2 in n parti distinte."
nwellnhof,

Risposte:


9

Brachylog (v2), 15 byte (casuali) o 13 byte (tutte le possibilità)

Casuale

~lℕ₁ᵐA+√?∧A≜₁ᵐ≠

Provalo online!

Invio di funzioni (visto in TIO con un wrapper che lo rende un programma completo).

Spiegazione

~lℕ₁ᵐA+√?∧A≜₁ᵐ≠
~l               Specify a property of a list: its length is equal to the input,
    ᵐ              and it is composed entirely of
  ℕ₁                 integers ≥ 1,
       √           for which the square root of the
      +              sum of the list
        ?              is the input.
     A   ∧A      Restricting yourself to lists with that property,
           ≜₁      pick random possible values
             ᵐ       for each element in turn,
              ≠    until you find one whose elements are all distinct.

Tutte le possibilità

~lℕ₁ᵐ<₁.+√?∧≜

Provalo online!

Invio di funzioni, che genera tutti i possibili output.

Spiegazione

~lℕ₁ᵐ<₁.+√?∧≜
~l               Specify a property of a list: its length is equal to the input,
    ᵐ              it is composed entirely of
  ℕ₁                 integers ≥ 1,
     <₁            it is strictly increasing,
         √         and the square root of the
        +            sum of the list
          ?            is the input.
       .   ∧≜    Generate all specific lists with that property.

Sono abbastanza sorpreso che ∧≜funzioni (normalmente dovresti scrivere ∧~≜per forzare l'output piuttosto che l'input), ma si scopre che ha un presupposto input = output quindi non importa in che modo intorno a te eseguirlo.

Compito bonus

Al fine di ottenere alcune informazioni sulla sequenza del numero di possibilità, ho creato un wrapper TIO diverso che esegue il programma su numeri interi successivi per fornire la sequenza dei conteggi di output:

1,1,3,9,30,110,436,1801,7657,33401

Un viaggio in OEIS scopre che questa è già una sequenza nota, A107379 , descritta praticamente come nella domanda (apparentemente ottieni la stessa sequenza se la limiti a numeri dispari). La pagina elenca diverse formule per la sequenza (anche se nessuna è particolarmente semplice; la seconda sembra una formula diretta per il valore ma non capisco la notazione).


La seconda formula è "il coefficiente di x^(n*(n-1)/2)nell'espansione in serie di Product_{k=1..n} 1/(1 - x^k)" (per niente diretto, purtroppo)
user202729

Posizionare il vincolo "tutti diversi" prima della fase di etichettatura casuale (ad es. A≠≜₁ᵐ) Rende il tempo di esecuzione molto più veloce in media.
Fatalizza il

Non capisco perché tu l'abbia trasformato in un wiki della community. Questi sono un modo arcaico di avere post modificabili prima che fosse possibile modificarli.
pipe


7

05AB1E , 11 byte

nÅœʒDÙQ}sùΩ

Provalo online o verifica tutti i casi di test .

Spiegazione:

n             # Take the square of the (implicit) input
              #  i.e. 3 → 9
 Ŝ           # Get all integer-lists using integers in the range [1, val) that sum to val
              #  i.e. 9 → [[1,1,1,1,1,1,1,1,1],...,[1,3,5],...,[9]]
   ʒ   }      # Filter the list to only keep lists with unique values:
    D         # Duplicate the current value
     Ù        # Uniquify it
              #  i.e. [2,2,5] → [2,5]
      Q       # Check if it's still the same
              #  i.e. [2,2,5] and [2,5] → 0 (falsey)
        s     # Swap to take the (implicit) input again
         ù    # Only leave lists of that size
              #  i.e. [[1,2,6],[1,3,5],[1,8],[2,3,4],[2,7],[3,6],[4,5],[9]] and 3
              #   → [[1,2,6],[1,3,5],[2,3,4]]
          Ω   # Pick a random list from the list of lists (and output implicitly)


5

R , 68, 75 48 byte (casuale) e 70 byte (deterministico)

@ Metodo di campionamento del rifiuto di Giuseppe:

function(n){while(sum(F)!=n^2)F=sample(n^2,n);F}

Provalo online!

Originale golfato:

function(n,m=combn(1:n^2,n))m[,sample(which(colSums(m)==n^2)*!!1:2,1)]

Provalo online!

Il *!!1:2business è quello di evitare il modo strano di sampleagire quando il primo argomento ha lunghezza 1.


@Giuseppe "riparato" :-)
ngm

molto bella. l'utilizzo pdiretto come indice invece di calcolarlo e riutilizzarlo dovrebbe salvare alcuni byte.
Giuseppe,

1
Ne ho anche function(n){while(sum(F)!=n^2)F=sample(n^2,n);F}per 48 ...
Giuseppe,

1
@ J.Doe per evitare il problema quando si chiama qualcosa di simile con sample(2,1)cui succede n=2. Quindi repgarantisce solo che ciò non accadrà mai. Potrebbe esserci un modo migliore, ma questo è stato rapido ed ero arrabbiato con sample.
ngm,

1
Puoi salvare un byte con x*!!1:2over rep(x,2)se la tua meta domanda ottiene un no.
J.Doe,


4

Java 10, 250 242 222 byte

import java.util.*;n->{for(;;){int i=n+1,r[]=new int[i],d[]=new int[n];for(r[n<2?0:1]=n*n;i-->2;r[i]=(int)(Math.random()*n*n));var S=new HashSet();for(Arrays.sort(r),i=n;i-->0;)S.add(d[i]=r[i+1]-r[i]);if(!S.contains(0)&S.size()==n)return S;}}

-20 byte grazie a @nwellnhof .

Fai attenzione, Java arriva ... Sono "solo" cinque volte più lunghe delle altre quattro risposte combinate, quindi non male, immagino ... rofl.
Esso viene eseguito n=1attraverso n=25(combinato) in meno di 2 secondi, però, così io probabilmente posterò una versione modificata alla versione velocità di questa sfida (che è attualmente ancora in Sandbox) pure.

Provalo online.

Spiegazione:

Nello pseudo-codice facciamo quanto segue:

1) Generare un array di dimensione n+1contenente: 0, nquadrato, e n-1quantità di numeri interi casuali compresi nell'intervallo tra [0, n squared)
2) In ordine questa matrice
3) Creare un secondo array di dimensione ncontenente le differenze anteriori delle coppie
Questi primi tre passi ci daranno un array contenente ncasuale numeri interi (nell'intervallo [0, n squared)che si somma al nquadrato.
4a) Se non tutti i valori casuali sono univoci o uno qualsiasi di essi è 0: riprovare dal passaggio 1
4b) Altrimenti: restituire questo array di differenze come risultato

Per quanto riguarda il codice attuale:

import java.util.*;      // Required import for HashSet and Arrays
n->{                     // Method with int parameter and Set return-type
  for(;;){               //  Loop indefinitely
    int i=n+1,           //   Set `i` to `n+1`
        r[]=new int[i];  //   Create an array of size `n+1`
    var S=new HashSet(); //   Result-set, starting empty
    for(r[n<2?           //   If `n` is 1:
           0             //    Set the first item in the first array to:
          :              //   Else:
           1]            //    Set the second item in the first array to:
             =n*n;       //   `n` squared
        i-->2;)          //   Loop `i` in the range [`n`, 2]:
      r[i]=              //    Set the `i`'th value in the first array to:
           (int)(Math.random()*n*n); 
                         //     A random value in the range [0, `n` squared)
    for(Arrays.sort(r),  //   Sort the first array
        i=n;i-->0;)      //   Loop `i` in the range (`n`, 0]:
      S.add(             //    Add to the Set:
        r[i+1]-r[i]);    //     The `i+1`'th and `i`'th difference of the first array
    if(!S.contains(0)    //   If the Set does not contain a 0
       &S.size()==n)     //   and its size is equal to `n`:
      return S;}}        //    Return this Set as the result
                         //   (Implicit else: continue the infinite loop)

1
n=25in meno di 2 secondi è impressionante! Dovrò leggere la spiegazione e vedere come lo fa. È ancora un metodo bruteforce?
Skidsdev,

È uniforme? -
user202729

@ user202729 Anche se non sono sicuro di come dimostrarlo, penso che lo sia. Il builtin Java è uniforme, e lo utilizza per ottenere prima valori casuali nell'intervallo [0, n squared), quindi calcola le differenze tra quei valori casuali ordinati (inclusi iniziale 0e finale), n squaredquindi sono abbastanza sicuro che anche queste differenze siano uniformi. , Non sono sicuro di come dimostrarlo. L'uniformità nella casualità non è in realtà la mia competenza.
Kevin Cruijssen,

3
Non hai mai letto dalla matrice delle differenze do mi sto perdendo qualcosa?
nwellnhof,

1
Sono abbastanza contento della mia soluzione a 127 byte : D
Olivier Grégoire il

4

Perl 6 , 41 byte

{first *.sum==$_²,(1..$_²).pick($_)xx*}

Provalo online!

  • (1 .. $_²) è l'intervallo di numeri compreso tra 1 e il quadrato del numero di input
  • .pick($_) sceglie casualmente un sottoinsieme distinto di quell'intervallo
  • xx * replica l'espressione precedente all'infinito
  • first *.sum == $_² seleziona il primo di quei set di numeri che si sommano al quadrato del numero di input


2

Pyth, 13 12 byte

Ofq*QQsT.cS*

Provalo online qui . Si noti che l'interprete online si imbatte in un MemoryError per input maggiori di 5.

Ofq*QQsT.cS*QQQ   Implicit: Q=eval(input())
                 Trailing QQQ inferred
          S*QQQ   [1-Q*Q]
        .c    Q   All combinations of the above of length Q, without repeats
 f                Keep elements of the above, as T, where the following is truthy:
      sT            Is the sum of T...
  q                 ... equal to...
   *QQ              ... Q*Q?
O                 Choose a random element of those remaining sets, implicit print

Modifica: salvato un byte adottando un approccio alternativo. Versione precedente: Of&qQlT{IT./*


2

Python 3 , 136 134 127 121 114 byte

from random import*
def f(n):
	s={randint(1,n*n)for _ in range(n)}
	return len(s)==n and sum(s)==n*n and s or f(n)

Provalo online!

Un commentatore mi ha corretto, e questo ora colpisce la profondità massima di ricorsione in f (5) invece di f (1). Molto più vicino ad essere una vera risposta competitiva.

L'ho visto fare f (5) una volta , e sto lavorando per cercare di perseguire questo obiettivo con shuffle.

Ho provato a creare alcune espressioni lambda per s=..., ma questo non ha aiutato i byte. Forse qualcun altro può fare qualcosa con questo: s=(lambda n:{randint(1,n*n)for _ in range(n)})(n)

Grazie a Kevin per essersi rasato altri 7 byte.


1
Quindi questo utilizza la ricorsione per "rigenerare" il set se quello generato non è valido? Sicuramente qualcosa di sbagliato nel tuo codice se sta colpendo la profondità di ricorsione a f(1), l'unico array possibile che dovrebbe essere generabile n=1è [1]Inoltre c'è un sacco di spazio bianco estraneo da rimuovere qui. Ricorda che questa è una sfida di code-golf, quindi l'obiettivo è quello di raggiungere il numero più basso di addetti
Skidsdev

1
range(1,n)-> range(n)Credo che dovrebbe risolvere il bug.
Jonathan Allan,

1
Ciò dovrebbe correggere il tuo bug e rimuovere anche gli spazi bianchi estranei. Immagino che ci sia molto più spazio anche per il golf
Skidsdev,

1
Sebbene la ricorsione peggiori leggermente da 5 a 4, puoi combinare le tue due dichiarazioni di ritorno in questo modo: return len(s)==n and sum(s)==n*n and s or f(n)( Provalo online 114 byte ).
Kevin Cruijssen,

1
Puoi avere tutto su una riga. 111 byte
Jo King,

2

APL (Dyalog Unicode) , 20 byte SBCS

Prefisso anonimo lambda.

{s=+/c←⍵?s←⍵*2:c⋄∇⍵}

Provalo online!

{... } "dfn"; è argomento

⍵*2 piazza l'argomento

s← assegnare a s(per s quare)

⍵? trova nindici casuali da 1 ... ssenza sostituzione

c← assegnare a c(per c andidate)

+/ sommarli

s= confrontare con s

: se uguale

  c restituire il candidato

 altro

  ∇⍵ fare affidamento sull'argomento


hai visto i 18 byte di my e H.PWiz ?
ngn,

@ngn No, chiaramente no, ma ho verificato che nessuna soluzione APL fosse pubblicata prima di pubblicare. Perché nessuno di voi?
Adám,

beh, una volta che l'ho giocato a golf e l'ho mostrato al frutteto, non c'è quasi alcun incentivo a pubblicare :)
ngn

@ngn Per te no, ma per me c'è.
Adám,

1
certamente, e penso che tu stia facendo un ottimo lavoro diffondendo in questo campo. mi stavo solo assicurando che tu sapessi che sono state trovate soluzioni più brevi ed è probabilmente meglio spiegarne una (o una variante) invece
ngn

2

APL (Dyalog Classic) , 18 byte

(≢?≢×≢)⍣(0=+.-∘≢)⍳

Provalo online!

usi ⎕io←1

genera i numeri 1 2 ... n

(... )⍣(... )continua ad applicare la funzione a sinistra finché la funzione a destra non ritorna vera

lunghezza, ad es n

≢?≢×≢scegli nnumeri interi casualmente distinti tra 1 e n2

+.-∘≢ sottrarre la lunghezza da ciascun numero e somma

0= se la somma è 0, interrompere il ciclo, altrimenti riprovare


1

MATL , 18 13 byte

`xGU:GZrtsGU-

Provalo online!

`	# do..while:
x	# delete from stack. This implicitly reads input the first time
	# and removes it. It also deletes the previous invalid answer.
GU:	# paste input and push [1...n^2]
GZr	# select a single combination of n elements from [1..n^2]
tsGU-	# is the sum equal to N^2? if yes, terminate and print results, else goto top

Non lo proverei in R: i personaggi casuali non producono quasi mai un programma valido.
ngm

@ngm hahaha Suppongo che una spiegazione sia in ordine.
Giuseppe,

1

Japt, 12 byte

²õ àU ö@²¥Xx

Provalo

                 :Implicit input of integer U
²                :U squared
 õ               :Range [1,U²]
   àU            :Combinations of length U
      ö@         :Return a random element that returns true when passed through the following function as X
        ²        :  U squared
         ¥       :  Equals
          Xx     :  X reduced by addition

Secondo un commento del PO, l'ordine degli elementi nell'output è irrilevante, quindi àdovrebbe andare bene.
Kamil Drakari,

Grazie, @KamilDrakari. Aggiornato.
Shaggy,

1

Java (JDK) , 127 byte

n->{for(int s;;){var r=new java.util.TreeSet();for(s=n*n;s>0;)r.add(s-(s-=Math.random()*n*n+1));if(r.size()==n&s==0)return r;}}

Provalo online!

Ciclo infinito fino a quando un set con i criteri corrisponde.

Spero che tu abbia il tempo, perché è molto sloooooow! Non può nemmeno andare a 10 senza timeout.


Puoi giocare a golf 3 byte cambiando if(r.size()==n&s==0)in if(r.size()+s==n).
Kevin Cruijssen,

@KevinCruijssen Ci ho pensato anche io, ma no non posso perché s potrebbe essere -1 e n potrebbe essere size () - 1.
Olivier Grégoire

Ah aspetta, continui ad aggiungere elementi al set fino a quando s>0, quindi la dimensione può essere maggiore di n. Ok, in tal caso in effetti non funziona. nè una costante, ma sfortunatamente entrambe se r.size()sono variabili che possono essere sia al di sotto che al di sopra 0e nrispettivamente.
Kevin Cruijssen,

1

Lotto, 182 145 byte

@set/an=%1,r=n*n,l=r+1
@for /l %%i in (%1,-1,1)do @set/at=n*(n-=1)/2,m=(r+t+n)/-~n,r-=l=m+%random%%%((l-=x=r+1-t)*(l^>^>31)+x-m)&call echo %%l%%

Spiegazione: Calcola la selezione minima e massima consentita, dato che i numeri devono essere scelti in ordine decrescente e sceglie un valore casuale all'interno dell'intervallo. Esempio per un input di 4:

  • Iniziamo con 16 rimasti. Non possiamo scegliere 11 o più perché le restanti 3 scelte devono aggiungere almeno a 6. Dobbiamo anche scegliere almeno 6, perché se selezioniamo solo 5, le restanti 3 scelte possono aggiungere solo a 9, che non è abbastanza per 16. Scegliamo un valore casuale da 6 a 10, diciamo 6.
  • Ne rimangono 10. Non possiamo scegliere 8 o più perché le restanti 2 scelte devono aggiungere almeno a 3. In effetti, non possiamo scegliere 6 o più perché ne abbiamo scelte 6 l'ultima volta. Dobbiamo anche scegliere almeno 5, perché se selezioniamo solo 4, le restanti 2 scelte possono solo aggiungere a 5, per un totale complessivo di 15. Selezioniamo un valore casuale da 5 a 5, diciamo 5 (!).
  • Ne rimangono 5. Non possiamo scegliere 5 o più perché la scelta rimanente deve aggiungere almeno 1, e anche perché abbiamo scelto 5 l'ultima volta. Dobbiamo anche scegliere almeno 3, perché se selezioniamo solo 2, la scelta rimanente può essere solo 1, per un totale complessivo di 14. Selezioniamo un valore casuale da 3 a 4, ad esempio 4.
  • Ne rimane 1. A quanto pare, l'algoritmo sceglie un intervallo da 1 a 1 e scegliamo 1 come numero finale.

1

JavaScript, 647 291 261 260 259 251 239 byte

Grazie a @Veskah per -10 byte nella versione originale e "Oh sì, stai emettendo tutti i set mentre la sfida richiede un ritorno casuale"

(n,g=m=n**2,r=[...Array(g||1)].map(_=>m--).sort(_=>.5-Math.random()).slice(-n),c=_=>eval(r.join`+`),i=_=>r.includes(_))=>[...{*0(){while(g>1&&c()!=g){for(z of r){y=c();r[m++%n]=y>g&&!(!(z-1)||i(z-1))?z-1:y<g&&!i(z+1)?z+1:z}}yield*r}}[0]()]

Provalo online!

Crea una matrice di n^2indici basati su 1, ordina la matrice in modo casuale, suddivide gli nelementi dalla matrice. Mentre la somma degli elementi casuali non equivale alla n^2matrice di loop di elementi casuali; se la somma degli elementi dell'array è maggiore di n^2e l'elemento corrente -1non è uguale a zero o l'elemento corrente -1non è nell'array corrente, sottrarre 1; se la somma dell'array è minore di n^2e l'elemento corrente +1non è nell'array, aggiungi 1all'elemento. Se la somma dell'array è uguale al n^2ciclo di interruzione, output array.


1
637 byte tirando z.join in una variabile ek++
Veskah il

@Veskah Probabilmente i due whileloop potrebbero anche essere ridotti al corpo di una singola funzione che accetta parametri; e potrebbe sostituire gli operatori condizionali (ternari) per le if..elsedichiarazioni; tra le altre parti del codice che potrebbero essere probabilmente adattate per il golf; ieg, rimuovendo le letdichiarazioni.
ospite271314

@Veskah 601 byte senza sostituire il ternario perif..else
guest271314

1
Oh sì, stai producendo tutti i set mentre la sfida richiede che ne venga restituito uno casuale (vedi i commenti di OP per maggiori dettagli)
Veskah

@Veskah Deve aver frainteso la sfida e gli esempi, oppure era troppo concentrato sulla risoluzione di questa parte della domanda " Compito bonus: esiste una formula per calcolare il numero di permutazioni valide per un dato n?" . test risultato atteso se l'algoritmo costantemente restituito per n^2matrici output generati in una singola chiamata alla funzione, e considerando contemporaneamente le somiglianze a questa domanda N N-dimensionale ^ matrice N riempito con N .
ospite271314

0

Japt , 20 byte

²õ ö¬oU íUõ+)Õæ@²¥Xx

Provalo online!

Sfrutta enormemente la casualità "Non uniforme", quasi sempre produce i primi nnumeri dispari, che si sommano n^2. In teoria può produrre qualsiasi altro set valido, anche se sono stato in grado di confermarlo solo per piccoli n.

Spiegazione:

²õ                      :Generate the range [1...n^2]
   ö¬                   :Order it randomly
     oU                 :Get the last n items
        í   )Õ          :Put it in an array with...
         Uõ+            : The first n odd numbers
              æ_        :Get the first one where...
                  Xx    : The sum
                ²¥      : equals n^2


0

C (gcc) , 128 125 byte

p(_){printf("%d ",_);}f(n,x,y,i){x=n*n;y=1;for(i=0;++i<n;p(y),x-=y++)while(rand()&&(n-i)*(n-i+1)/2+(n-i)*(y+1)+y<x)y++;p(x);}

Provalo online!

-3 byte grazie a ceilingcat

NOTA: la probabilità è molto lontana dall'uniforme. Vedi la spiegazione di cosa intendo e un mezzo migliore per testare che funzioni (rendendo la distribuzione più vicina all'uniforme [ma ancora lontana da essa]).

Come?

L'idea di base è quella di scegliere solo numeri crescenti per non preoccuparsi dei duplicati. Ogni volta che scegliamo un numero, abbiamo una possibilità diversa da zero di 'saltarlo' se consentito.

xky

y+(y+1)+(y+2)+...
x
k(k+1)2+k(y+1)+y<x

Tuttavia, la logica è quella di avere la possibilità di scartare qualsiasi ycosa soddisfi l'equazione di cui sopra.

Il codice

p(_){printf("%d ",_);}  // Define print(int)
f(n,x,y,i){             // Define f(n,...) as the function we want
    x=n*n;              // Set x to n^2
    y=1;                // Set y to 1
    for(i=0;++i<n;){    // n-1 times do...
        while(rand()&&  // While rand() is non-zero [very very likely] AND
            (n-i)*      // (n-i) is the 'k' in the formula
            (n-i+1)/2+  // This first half takes care of the increment
            (n-i)*(y+1) // This second half takes care of the y+1 starting point
            +y<x)       // The +y takes care of the current value of y
        y++;            // If rand() returned non-zero and we can skip y, do so
    p(y);               // Print y
    x-=y++;             // Subtract y from the total and increment it
    }p(x);}             // Print what's left over.

Il trucco ho menzionato prova migliore il codice consiste nella sostituzione rand()&&con rand()%2&&modo che ci sia un 50-50 probabilità che un dato y viene saltata, piuttosto che un 1 nella RAND_MAXprobabilità che un dato y viene utilizzato.


Mi piacerebbe se qualcuno controllasse la mia matematica per coerenza. Mi chiedo anche se questo tipo di soluzione potrebbe rendere semplice la sfida uniforme della velocità casuale. La formula posiziona un limite superiore e inferiore sulla risposta, un numero casuale uniforme in quell'intervallo produce risultati casuali uniformi? Non vedo perché no, ma non ho fatto molta combinatoria da un po '.
LambdaBeta,

Suggerisci p(y),x-=y++)while(rand()&&(i-n)*((~n+i)/2+~y)+y<x)y++;invece di){while(rand()&&(n-i)*(n-i+1)/2+(n-i)*(y+1)+y<x)y++;p(y);x-=y++;}
ceilingcat il

@ceilingcat Adoro questi piccoli miglioramenti che trovi. Mi concentro sempre così sull'algoritmo generale che dimentico di ottimizzare per l'implementazione (sostanzialmente vado in modalità golf automatico con pilota automatico una volta che ho una fonte non golfizzata che funziona - quindi mi manca un sacco di risparmi)
LambdaBeta

Ehi, non sei solo tu ad avere quei golf di sintassi. Trovo piccoli miglioramenti in molte risposte C / C ++ del genere (tranne che nel tuo, @ceilingcat di solito scatta quelle).
Zacharý,

Sì, ho notato che voi due siete probabilmente i putter C / C ++ più attivi (possiamo usare il put per estendere l'analogia del golf agli ultimi colpi? Perché no!). Mi ha sempre colpito il fatto che tu possa persino capire abbastanza bene il codice golfizzato per migliorarlo.
LambdaBeta,

0

Pulito , 172 byte

import StdEnv,Math.Random,Data.List
? ::!Int->Int
?_=code{
ccall time "I:I"
}
$n=find(\s=length s==n&&sum s==n^2)(subsequences(nub(map(inc o\e=e rem n^2)(genRandInt(?0)))))

Provalo online!


0

Python (2 o 3), 84 byte

from random import*;l=lambda n,s=[]:(sum(s)==n*n)*s or l(n,sample(range(1,n*n+1),n))

Provalo online!

Colpisce la profondità massima di ricorsione a circa l (5)



0

Mathematica 40 byte

RandomChoice[IntegerPartitions[n^2, {n}]]

1
Innanzitutto è n ^ 2, non 2 ^ n. In secondo luogo, il programma deve essere una funzione e anche un golf. Prova questo RandomChoice@IntegerPartitions[#^2,{#}]&
J42161217

1
Anche il risultato deve essere (non ordinato, unico) ma questa funzione non riesce in entrambi
J42161217

0

Wolfram Language (Mathematica) , 49 byte

(While[Tr[s=RandomSample[Range[#^2],#]]!=#^2];s)&

Provalo online!

Versione golfata di @ J42161217.


Wolfram Language (Mathematica) , 62 byte

Range[#-1,0,-1]+RandomChoice@IntegerPartitions[#*(#+1)/2,{#}]&

Provalo online!

Come funziona

n2nn2(n2n)/2=(n2+n)/20n1n10


La risposta all'attività bonus

Attività bonus: esiste una formula per calcolare il numero di permutazioni valide per un dato n?

part(n,k)nk

part(n,k)=part(n1,k1)+part(nk,k)

part(n,1)=1n<kpart(n,k)=0

part(n2+n2,n)

che è, in Mathematica:

Length@IntegerPartitions[#*(#+1)/2,{#}]&

Provalo online!


Questo è il codice golf .. 49 byte(While[Tr[s=RandomSample[Range[#^2],#]]!=#^2];s)&
J42161217
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.