La noiosa serie di 7 regole


11

Il fatiscente

Crea un programma che genera un array di lunghezza casuale con numeri casuali, quindi applica una serie di regole che modificano l'array. Dopo aver applicato le regole, stampare la somma dell'array se non diversamente specificato

Configurazione dell'array

L'array deve avere una lunghezza casuale compresa tra 5 e 10 inclusi, con numeri interi casuali compresi tra 1 e 20 inclusi. Ogni lunghezza dell'array dovrebbe avere la stessa probabilità di accadere e ogni numero intero dovrebbe avere la stessa probabilità di essere scelto per elemento.

Le 7 regole

Le regole dovrebbero agire come se fossero applicate in sequenza (ad es .: la regola 1 agisce prima della regola 2) e dovrebbero essere applicate una sola volta. Per la prova dell'applicazione delle regole, l'array deve essere stampato sulla console dopo ogni applicazione delle regole e una volta prima che vengano applicate le regole.

  1. Se l'array contiene un 7, sottrarre 1 da ogni elemento
  2. Se viene applicata la regola 1 e l'array ora contiene uno 0, aggiungere 1 a ciascun elemento
  3. Se l'array contiene un 13, escludere il 13 e tutti gli elementi che seguono, dall'array
  4. Se l'array contiene un 2, escludi tutti i numeri dispari
  5. Se l'array contiene un 20 e il terzo elemento è pari, restituire 20 come somma quindi terminare. Se è presente un 20 e il terzo elemento è dispari, restituire 20 volte la lunghezza dell'array man mano che la somma termina.
  6. Se la somma è maggiore di 50, rimuovi ripetutamente l'ultimo elemento fino a quando è inferiore o uguale a 50
  7. Se l'array contiene un 16, stampare la somma sia in decimale che in esadecimale.

Esempio

Ecco un array iniziale,

[20, 2, 5, 7, 14, 8]

È possibile applicare la regola 1:

[19, 1, 4, 6, 13, 7]

La regola 3 è applicata successivamente:

[19, 1, 4, 6]

Non sono necessarie altre regole, quindi il programma restituisce 30 come somma.

Appunti

  • Non sono un golfista esperto di codice, anche se posso dire che il mio record personale è in Python 3 con 369 byte .
  • Le regole non devono essere effettivamente applicate in ordine, ma devono agire come se lo fossero.

1
Quanto casuale deve essere "casuale"?
HyperNeutrino,

1
@HyperNeutrino può essere sudo-casuale come vuoi, ma non sfidare il lancio. Sono consentite ripetizioni.
Graviton,

Come hai intenzione di verificare se abbiamo effettivamente applicato le regole? Posso semplicemente generare un numero casuale inferiore a 50 e tecnicamente non infrangerebbe nessuna delle regole, e potrei semplicemente dire che "ha seguito" le regole. EDIT: mi rendo conto ora che questo non funzionerà, ma le persone troveranno modi per aggirare le regole casuali. Lo impedirai?
clismique,

1
Al momento, la scelta di uno dei due array [3 3 3 3 4 3]e [4 4 3 4 4], ciascuno con una probabilità del 50%, è conforme a quanto scritto sotto "array setup". Quindi posso solo uscire 19ogni volta? (Certo, quello che penso davvero è che la definizione di "casuale" deve essere chiarita.)
Greg Martin

2
If the array contains a 20, and the third element is even/odd, cosa succede se l'array ha meno di 3 elementi in questo passaggio?
Emigna,

Risposte:


8

Pitone 3, 294 301 287 356 byte

import random as r
r=r.randint
k=[r(i)+1for i in[20]*r(5,11)]
p=print
if 7in k:k=[i-1for i in k]
p(k)
if 0in k:k=[i+1for i in k]
p(k)
i=k.find(13)
if not~i:k=k[:i]
p(k)
if 2in k:k=[i for i in k if~i%2]
p(k)
a=0
z=len(k)>2and k[2]%2
if 20in k:a=20*len(k)**z
if~z:p(k)
while sum(k)>50:k=k[:-1]
if~z:p(k)
if a:p(a)
else:a=sum(k);p(a,hex(a)*(16in k))
if~z:p(k)

Non so come impedirai alle persone di eludere le regole, ma questa usa la procedura specificata.

+7 byte; grazie a @YamB per aver salvato qualche byte; aggiunto molto di più per correggere un errore precedente.
-14 byte grazie a @RootTwo e a me stesso e ho anche corretto l'errore.
+83 byte; questo sta diventando orribilmente lungo perché OP continua a cambiare le regole. -un numero di byte grazie a @ZacharyT


Tutto mi ha verificato, grazie per essere onesto.
Graviton,

Puoi salvare 4 byte importando 'randint as r' e cambiando 'se 7in k e 1not in k: k = [i-1 ...' in 'se 7in k: k = [i + 1-int (1in k ) ... "
Graviton,

Quando si inizializza k, non è necessario il valore di i, quindi è possibile salvare 6 byte con k=[r(1,20)for _ in'-'*r(5,11)]. Puoi salvare un altro byte usando k=[i+~-(1in k)*(7in k)for i in k]per le regole 1 e 2.
RootDue

1
@ Notts90 Le regole sono state cambiate dopo che ho scritto questa sfida. Lo riparerò quando arrivo a un computer. Grazie.
HyperNeutrino,

Sulle righe cinque e sette, dopo lo hai uno spazio non necessario 1e puoi cambiare printil secondo e il terzo all'ultima riga p. E tu ... non hai aggiornato il tuo bytecount.
Zacharý,

6

05AB1E , 91 byte

5TŸ.RF20©L.R})=D7åi<=D0åi>=}}D13åiD13k£=}D2åiDÈÏ=}D®åiDgs2èÉ®si*},q}[DO50›_#¨=]D16åiDOH,}O,

Provalo online! o Con input


84 byte e potenzialmente corretto? Diverso? Nessuna idea. tio.run/nexus/…
Magic Octopus Urn

@carusocomputing: non l'ho esaminato a fondo, ma all'inizio non genera l'array casuale né stampa risultati intermedi. Sarà un po 'più lungo quando si aggiungono quelle parti.
Emigna,

6

Javascript (ES6), 344 342 340 342 335 335 331 333 313 311 305 298 297 290 289 283 279 byte

Huzzah! Finalmente legato con il ritmo di Arnauld !

A seguito di questo scambio * nei commenti della sfida e dopo molte discussioni, ho deciso di utilizzare new Datecome seme invece il generatore di numeri casuali Math.random(). Ciò significa che tutti i numeri interi nella matrice avranno lo stesso valore.

_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)

Provalo

f=
_=>(l=alert,r=new Date,l(a=[...Array(r%6+5)].map(x=>r%20+1)),i=v=>~a.indexOf(v),i(7)&&l(a=a.map(x=>--x)),i(0)&&l(a=a.map(x=>++x)),i(13)&&l(a=a.slice(0,~i(13))),i(2)&&l(a=a.filter(x=>x%2)),i(t=20)?a[2]%2?t*a.length:t:l(a=a.filter(x=>s+x<51?s+=x:0,s=0))|i(16)?[s,s.toString(16)]:s)
alert(f())

  • Salvato 2 byte registrando solo gli elementi spuntati nella regola 6.
  • Salvato 2 byte sostituendo Array(x).fill()con [...Array(x)].
  • Aggiunti 2 byte perché avevo incasinato la regola 5!
  • Ho salvato 7 byte risolvendo il pasticcio che ho fatto cercando di correggere il pasticcio precedente!
  • Ho salvato 3 byte grazie ad Arnauld che mi ha aiutato a curare un brainfart sulla regola 2 e ha salvato un byte aggiuntivo sostituendo a +1con a ~.
  • Aggiunti 2 byte assicurando che 0venga restituito per un array vuoto.
  • Hai salvato 20 byte, scoprendo finalmente come abbandonare quel whileloop fecking .
  • Salvato 2 byte sostituendo le ,ultime 2 istruzioni con a |e rimuovendo l'allegato ().
  • 6 byte salvati sostituendoli console.logcon alert.
  • Salvato 7 byte migliorando la scorciatoia di a.includes().
  • Salvato 1 byte modificando l'implementazione della regola 3.
  • Ho salvato 7 byte abbandonando includes()e semplicemente usando indexOf()tutto.
  • Salvato 1 byte spostando la dichiarazione iniziale della svariabile in un punto in cui non era necessaria una virgola.
  • 6 byte salvati sostituendoli Math.random()con new Date.
  • Salvato 4 byte rimuovendo l'arrotondamento (ora ridondante) dei numeri casuali.

Versione leggibile e testabile

  • Aggiunte interruzioni di riga e commenti al codice
  • Usato al console.logposto del alerttuo buonsenso! (Visualizzazione ottimale nella console del browser)
  • Aggiunto il numero della regola corrente all'output.
  • Generazione di array casuale commentata per consentire il test immettendo un elenco di numeri separato da virgole.


* Screenshot, nel caso in cui venga eliminato:


4

C (cc) , 621 619 593 585 570 562 557 552 529 517 500 482 461 444 442 441 438 byte

C'è molto golf necessario qui ... Risolto un bug che stampava l'esadecimale una volta per ogni 16 nell'elenco ...

Un ringraziamento speciale a ZacharyT con l'aiuto del golf

#define R r[i]
#define P printf("%d "
#define L for(d=i=0;i<l;i++)
d,i,j,l,r[11];p(i){L P,R);puts("");}main(){srand(time(0));for(l=5+rand()%5;i<l;R=1+rand()%20,i++);for(p();i--;)if(R==7){L--R;j=i=1;}for(p();j&&i<l;i++)if(!R){L++R;j=i=l;}p();L if(R==13)l=i;p();L if(R==2)for(d=1;d;)L if(R&1)for(d=1,--l;i<=l;i++)R=r[i+1];p();L if(R==20)return P,r[3]&1?20*l:20);for(j=i=0;i<l&&j+R<51;j+=R,i++);l=i;p();P,j);L if(R==16)printf("0x%x",j,i=l);}

Provalo online!


1
Anche se puoi ancora giocare a golf molto, sei già 1 byte sotto la mia risposta Java. XD Vediamo se riesco a giocare a golf in qualche modo per battere la tua attuale richiesta. ;)
Kevin Cruijssen,

Ok,
ho

Se puoi giocare a golf, potresti essere in grado di ottenere un "444 barrato è ancora 444" lì dentro! : D
HyperNeutrino,

@HyperNeutrino golfò altri 2 byte
cleblanc

Sìì! Bel lavoro: D
HyperNeutrino,

3

JavaScript (ES6), 296 295 290 289 byte

Un programma completo che registra l'array iniziale, i risultati intermedi e la somma finale sulla console.

f="z=[...Array(5+6j)]Z1+20jw7`-1w0`+1w13_qi+1<-kw2_qn&1^1w20_z[2]&1?a.length*20:20);else{q(s+=n)<51,s=0w16_b.toString(16_;b)}zconsole.log(aw_;if(k=~a.indexOf(v((n,i)=>qz=a.filtervj*Math.random()|0bz.reducevn+i,0)`_z=aZn_))Z.mapv";for(g of "Z_`bjqvwz")e=f.split(g),f=e.join(e.pop());eval(f)

Come funziona

Questo è stato compresso usando questo packer JS .

Abbattersi:

  • Stringa compressa: 226 225 byte
  • Codice di decompressione: 69 64 byte

Di seguito è riportato il codice sorgente originale con alcuni spazi bianchi aggiuntivi e feed di riga per la leggibilità. Piuttosto che applicare trucchi golf standard, è stato scritto in modo da produrre quante più stringhe ripetute possibile per soddisfare il packer. Ad esempio, la sintassi if(k=~a.indexOf(N))viene duplicata ovunque, sebbene kvenga utilizzata solo nella terza regola.

console.log(a=[...Array(5+6*Math.random()|0)].map((n,i)=>1+20*Math.random()|0));
if(k=~a.indexOf(7))
  console.log(a=a.map((n,i)=>n-1));
if(k=~a.indexOf(0))
  console.log(a=a.map((n,i)=>n+1));
if(k=~a.indexOf(13))
  console.log(a=a.filter((n,i)=>i+1<-k));
if(k=~a.indexOf(2))
  console.log(a=a.filter((n,i)=>n&1^1));
if(k=~a.indexOf(20))
  console.log(a[2]&1?20*a.length:20);
else {
  console.log(a=a.filter((n,i)=>(s+=n)<51,s=0));
  if(k=~a.indexOf(16))
    console.log(a.reduce((n,i)=>n+i,0).toString(16));
  console.log(a.reduce((n,i)=>n+i,0))
}

Metodi di decompressione

Il codice di decompressione originale è:

f="packed_string";for(i in g="ABCDEFGHI")e=f.split(g[i]),f=e.join(e.pop());eval(f)

Tutte le seguenti varianti ES6 hanno esattamente le stesse dimensioni:

eval([..."ABCDEFGHI"].reduce((f,g)=>(e=f.split(g)).join(e.pop()),"packed_string"))
[..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")&&eval(f)
eval([..."ABCDEFGHI"].map(g=>f=(e=f.split(g)).join(e.pop()),f="packed_string")[8])

L'unico modo che ho trovato finora per radere qualche byte è usare for ... of:

f="packed_string";for(g of "ABCDEFGHI")e=f.split(g),f=e.join(e.pop());eval(f)

Leggendolo su un telefono, quindi potrei sbagliarmi ma, nel tuo codice decompresso, sembra che la regola 2 sia applicata indipendentemente dal fatto che la regola 1 sia o meno.
Shaggy,

1
@Shaggy È corretto. Ma non è possibile ottenere uno zero se non viene attivata la regola 1.
Arnauld,

D'oh! Ovviamente! Amico, ho avuto un numero ridicolo di brainfarts durante questa sfida :(
Shaggy

1
@Shaggy Purtroppo no. Tuttavia, possiamo salvare un byte con n&1^1(non viene compresso affatto, ma è solo un byte più corto di !(n&1)). Ci ho pensato a un certo punto e ho dimenticato di includerlo.
Arnauld,

1
@Shaggy Ahah! Bel lavoro!
Arnauld,

2

Prima prova a code golf!

Già battuto da altri javascripters! Dangit! Migliorerò!!! =)

Javascript -> 550 402 byte

Potrebbe sicuramente essere migliorato. Compresso ora:

f="ba=[];bl;yz5+5`^=0;i<y;i++)a[i]z20+1|~7j-1|~0j+1|}}~13_l=indexOf(13`ql,y-l-Y_^ in a)if(a[i]%2)qi,Y0)&&(!a[3]%2_k'20'`throw new Error(`}do{l=Vreduce((X,num)=>X+num`ifW)qy-1,1`}whileW|kl`~16))kl.toString(16)`~if(Vincludes(|`ka`z=Zound(Zandom()*yVlengthqVsplice(kalert(j_Vmap((i)=>ibvar `);_)){^for(biZMath.rY1|}~2XtotalW(l>50Va.";for(i in g="VWXYZ^_`bjkqyz|~")e=f.split(g[i]),f=e.join(e.pop());eval(f)

originial:

var a=[];var l;a.length=Math.round(Math.random()*5+5);for(var i=0;i<a.length;i++)a[i]=Math.round(Math.random()*20+1);alert(a);if(a.includes(7)){a.map((i)=>i-1);alert(a);if(a.includes(0)){a.map((i)=>i+1);alert(a);}}if(a.includes(13)){l=indexOf(13);a.splice(l,a.length-l-1);alert(a);}if(a.includes(2)){for(var i in a)if(a[i]%2)a.splice(i,1);alert(a);}if(a.includes(20)&&(!a[3]%2)){alert('20');throw new Error();}do{l=a.reduce((total,num)=>total+num);if(l>50)a.splice(a.length-1,1);}while(l>50);alert(a);alert(l);if(a.includes(16))alert(l.toString(16));

2

Java 7, 622 619 618 byte

import java.util.*;void c(){Random r=new Random();List<Long>l=new ArrayList();int i=0,c=r.nextInt(6)+5;for(;i++<c;l.add(r.nextInt(20)+1L));p(l);if(l.contains(7)){for(i=0;i<c;l.set(i,l.get(i++)-1));p(l);}if(l.contains(0)){for(i=0;i<c;l.set(i,l.get(i++)+1));p(l);}if((i=l.indexOf(13))>=0){for(;i<l.size();l.remove(i));p(l);}if(l.contains(2)){for(i=0;i<l.size();)if(l.get(i)%2>0)l.remove(l.get(i));else i++;p(l);}if(l.contains(20)){p(20*(l.get(2)%2<1?1:l.size()));return;}i=0;for(long x:l)i+=x;for(;i>50;)i-=l.remove(l.size()-1);p(l);if(l.contains(16))p(Byte.valueOf(i+"",16));p(i);}<T>void p(T t){System.out.println(t);}

-1 byte grazie a @Poke

Spiegazione:

import java.util.*;                      // Imports used for List, ArrayList and Random

void c(){                                // Main method
  Random r=new Random();                 //  Random generator
  List<Long>l=new ArrayList();           //  The list
  int i=0,                               //  Temp index we use multiple times
      q=r.nextInt(6)+5;                  //  Random size of the list (5-10)
  for(;i++<q;l.add(r.nextInt(20)+1L));   //  Fill the list with random long-integers (1-20)
  p(l);                                  //  Print the initial list
  if(l.contains(7)){                     //  If the list contains a 7
    for(i=0;i<c;l.set(i,l.get(i++)-1));  //   Decrease each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(0)){                     //  If the list now contains a 0
    for(i=0;i<c;l.set(i,l.get(i++)+1));  //   Increase each number in the list by 1
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if((i=l.indexOf(13))>=0){              //  If the list contains a 13 (and save it's index in `i` at the same time)
    for(;i<l.size();l.remove(i));        //   Remove everything from that index and onward
    p(l);                                //   And then print the list again
  }                                      //  End of if
  if(l.contains(2)){                     //  If the list now contains a 2
    for(i=0;i<l.size();)                 //   Loop over the list
      if(l.get(i)%2>0)                   //    If the current list item is odd
        l.remove(l.get(i));              //     Remove it
      else                               //    If it's even instead
        i++;                             //     Go to the next item
                                         //   End of loop (implicit / single-line body)
    p(l);                                //   And print the list again
  }                                      //  End of if
  if(l.contains(20)){                    //  If the list now contains a 20
    p(20*(l.get(2)%2<1?1:l.size()));     //   Print 20 if the third item in the list is odd, or 20*size if it's even instead
    return;                              //   And then terminate the method
  }                                      //  End of if
  i=0;                                   //  Reset `i` to 0
  for(long x:l)i+=x;                     //  And calculate the total sum of the list (stored in `i`)
  for(;i>50;)                            //  Loop as long as this list's sum is above 50
    i-=l.remove(l.size()-1);             //   Subtract the last item from this sum, and then remove it from the list
                                         //  End of loop (implicit / single line body)
  p(l);                                  //  And print the list again
  if(l.contains(16))                     //  If the list now contains a 16
    p(Byte.valueOf(i+"",16));            //   Print the sum (still stored in `i`) as hexadecimal
                                         //  End of if (implicit / single-line body)
  p(i);                                  //  And print the sum as integer either way
}                                        // End of main method

<T>void p(T t){                          // Separate method with a generic parameter
  System.out.println(t);                 //  Print the given parameter including a new-line
}                                        // End of separated method

Output di esempio: i
commenti dietro gli output di esempio non vengono stampati, ma li ho aggiunti come chiarimento.

Provalo qui.

[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Initial print (size 9)
[16, 4, 2, 0, 15, 16, 10, 6, 12]   // Rule 1 (contains a 7)
[17, 5, 3, 1, 16, 17, 11, 7, 13]   // Rule 2 (contains a 0)
[17, 5, 3, 1, 16, 17, 11, 7]       // Rule 3 (contains a 13)
[17, 5, 3, 1, 16]                  // Rule 6 (sum must be <= 50)
66                                 // Rule 7 (contains a 16 -> print as Hexadecimal)
42                                 // Print sum as integer

[4, 18, 17, 12, 11, 8]             // Initial print (size 6)
[4, 18, 17]                        // Rule 6 (sum must be <= 50)
39                                 // Print sum as integer

[4, 14, 6, 14, 7, 20, 2, 2]        // Initial print (size 8)
[3, 13, 5, 13, 6, 19, 1, 1]        // Rule 1 (contains a 7)
[3]                                // Rule 3 (contains a 13)
[3]                                // Print is always done after rule 6
3                                  // Print sum as integer

1
Sono sceso a 594 byte ora :-D
cleblanc

@cleblanc Vedo che sei sceso a 444 ora .. Non posso competere con Java. :) (Divertente dire che dal 444 non è quasi vincente rispetto a tutte le altre risposte ..)
Kevin Cruijssen

Lo so, anche le lingue del golf come 05AB1E sono lunghe quasi 100 byte. Questa sfida è stata un dolore.
Cleblanc,

Puoi lasciare la tua lista generica List a = new ArrayList()? Potrebbe salvare alcuni byte. Tuttavia, potrebbe essere necessario aggiungere un typecast quando si esegue l'aritmetica effettiva. In caso contrario, Longè più breve diInteger
Poke

@Poke Con un generico Listdevo usare un (int)cast cinque volte, così come cambiare il ciclo for-each da inta Objecte aggiungere un sesto cast. Per quanto riguarda Long: grazie, che consente di risparmiare 1 byte :) (devo ancora cambiare il for-ciascuno da inta long, r.nextInt(20)+1a r.nextInt(20)+1L).
Kevin Cruijssen,

2

Ruby 2.4, 260 byte

Ruby 2.4 è richiesto per Enumerable#sum.

p a=(1..s=5+rand(5)).map{1+rand(19)}
a.map!{|i|i-1}if a.index 7
p a
a.map!{|i|i+1}if a.index 0
p a
a.pop s-(a.index(13)||s)
p a
a.reject! &:odd?if a.index 2
p a
a.index(20)?p(20*[1,s][(a[2]||1)%2]):((a.pop;p a)while a.sum>50
p m=a.sum;puts"%x"%m if a.index 16)

Provalo online! (Né repl.it né tio.run supportano ancora Ruby 2.4, quindi questa versione online sostituisce sumcon inject(:+), che ha lo stesso comportamento.)


1

R (3.3.1), 325 byte

Implementazione piuttosto ingenua; Penso che probabilmente posso renderlo un po 'più breve.

s=sample(1:20,sample(5:10,1));print(s);if(7%in%s){s=s-1;print(s);if(0%in%s)s=s+1;print(s)};if(13%in%s){s=s[1:(which(s==13)-1)];print(s)};if(2%in%s){s=s[!(s%%2)];print(s)};if(20%in%s){if(s[3]%%2){20*length(s);print(s)}else{20;print(s)}};while(sum(s)>50){s=s[-length(s)];print(s)};if(16%in%s){print(as.hexmode(sum(s)))};sum(s)

1

PowerShell , 525 413 byte

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}if(2-in$a){$a=($a|?{$_%2-eq0});a}if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

Provalo online!

Volevo provare questo anche se ho pensato di non battere le risposte già qui: PI ha tentato di giocarci ancora, sono sicuro che è possibile con meno byte. Trovato un metodo migliore per hex, ma probabilmente potrebbe ancora migliorare.

Ho dovuto eseguire il cast $adi una stringa così tante volte che era meglio creare un filtro per essa ...

Ho perso parecchi campi da golf facili come parentesi e spazi. Potrebbero essere ancora alcuni là fuori?

Codice leggermente più semplice da leggere:

filter a{"$a"};0..(4..9|random)|%{$a+=@(1..20|random)};a;
if(7-in$a){$a=($a|%{$_-1});a;if(0-in$a){$a=($a|%{$_+1});a}}
$b=$a;$a=@();foreach($z in $b){if($z-ne13){$a+=@($z)}else{a;break}}
if(2-in$a){$a=($a|?{$_%2-eq0});a}
if(20-in$a){if($a[2]%2){20*$a.count;exit}else{20;exit}}
while(($h=$a-join'+'|iex)-gt50){$a=$a[0..($a.count-2)];a}
if(16-in$a){$l=0..9+'a b c d e f'-split' ';$q=[math]::floor($h/16);"$q"+$l[$h%16]};$h

0

MATLAB, 275 byte

Inizialmente avevo pianificato una risposta Octave forse a una riga, ma richiedere l'output di tutte le regole applicate ha contrastato i miei piani. Invece, una risposta MATLAB abbastanza semplice con alcune interessanti ottimizzazioni, ad esempio l'uso cumsuminvece dell'ovvio whileper la regola 6. Tuttavia, gran parte del conteggio dei byte viene sprecato su ifs per impedire l'output se non viene applicata una regola.

A=randi(20,1,randi(6)+4)
if any(A==7)
A=A-1
if any(~A)
A=A+1
end;end
q=find(A==13,1);if q
A=A(1:q-1)
end
if any(A==2)
A=A(2:2:end)
end
if any(A==20)
if mod(A(3),2)
20*length(A)
else
20
end;return;end
q=cumsum(A)<51;if any(~q)
A=A(q)
end
q=sum(A)
if(any(A==16))
dec2hex(q)
end

Provalo online!


0

Scala 587 byte una fodera

import scala.util.Random;object A{def main(args:Array[String])={val s=5+Random.nextInt(6);var a=new Array[Int](s);for(i<-1 to s){a(i-1)=1+Random.nextInt(20)};p(a);if(a.contains(7)&& !a.contains(1)){a.map(a=>a-1);p(a)};if(a.contains(13)){if(a(0)==13)a=new Array[Int](0)else a=a.slice(0,a.indexOf(13));p(a)};if(a.contains(2)){a=a.filter(pred=>pred%2==0);p(a)};if(a.contains(20)){if(a(2)%2==0)println(20)else println(20*a.length)}else{while(a.sum>50)a=a.dropRight(1);val u=a.sum;if(a.contains(16))println(Integer.toHexString(u));println(u)}};def p[T](a: Array[T])=println(a.mkString(","))}

Scala, 763 byte come è

import scala.util.Random
object TA {
  def main(args:Array[String])={
    val s=5+Random.nextInt(6)
    var a=new Array[Int](s)
    for (i<-1 to s)
      a(i-1)=1+Random.nextInt(20)
    p(a)
    if(a.contains(7) && !a.contains(1)){
      a.map(a=>a-1)
      p(a)
    }
    if(a.contains(13)){
      if (a(0)==13) a=new Array[Int](0) else a=a.slice(0,a.indexOf(13))
      p(a)
    }
   if(a.contains(2)){
      a=a.filter(pred=>pred%2== 0)
      p(a)
    }
    if(a.contains(20)){
      if (a(2)%2==0) println(20) else println(20*a.length)
    }else{
      while(a.sum>50)
        a=a.dropRight(1)
      val u =a.sum
      if (a.contains(16)) println(Integer.toHexString(u))
      println(u)
    }
  }
  def p[T](a: Array[T])={
    println(a.mkString(","))
  }
}

Dal momento che questa è una domanda di golf del codice, ti chiediamo di fare almeno i golf facili come la rimozione di spazi bianchi non necessari.
Ad Hoc Garf Hunter

Ho aggiunto la versione a byte basso di una riga
Saideep Sambaraju,

Non conosco Scala, ma è necessario lo spazio a: Array[T]? Non hai spazio args:Array[String], il che è ciò che ha portato alla mia inchiesta.
Zacharý,

no penso di essermi perso.
Saideep Sambaraju,

0

MATLAB, 228 241 byte

a=randi(20,1,randi(6)+4)
b=@any; 
a=a-b(a==7)
a=a+b(a==0)
a(find(a==13,1):end)=[]
a(and(mod(a,2),b(a==2)))=[]
if b(a==20)
a=[a 0 0 0];
s=20*(1+mod(a(3),1)*(numel(a)-4))
else
a(cumsum(a)>50)=[]
s=sum(a)
if b(a==16)
h=['0x' dec2hex(s)]
end
end

Ciò applicherà tutte le regole in ordine, stampando il valore dell'array dopo ogni passaggio.

Il programma si arresta in modo anomalo sulla regola 5 se il numero di elementi risultante è inferiore a tre. Al momento non c'è nulla da dire su cosa dovrebbe accadere se non ci fosse un terzo elemento, quindi presumo che un incidente sia accettabile. Il programma ora stamperà 20 se ci sono meno di 3 elementi e uno o più è un 20.

È interessante notare che il passaggio 2 può essere applicato indipendentemente dal fatto che il passaggio 1 sia stato. Questo perché l'array di input non avrà mai uno 0 in esso, il che significa che se ci sono degli 0 nell'array, questo deve essere il risultato del passaggio 1.

Tutte le regole vengono applicate a turno, fino al 5, anche se non sono state apportate modifiche. Di conseguenza l'array verrà stampato all'inizio e poi dopo ogni passaggio fino a 5. Dopo il punto 5 si sia ottenere la somma se applicato, o nessuna uscita fino a dopo il passaggio 6. Una linea supplementare che contiene apotrebbero essere aggiunti dopo l'istruzione else per garantire che il valore dell'array venga stampato dopo il passaggio 5 al costo di 2 byte.


Vorrei anche ricordare che non ho guardato le altre risposte fino a quando non ho scritto questo. Vedo ora che esiste un'altra risposta MATLAB con alcune somiglianze, tutte coincidenti.


0

Python 3, 297 293 289 , 278 byte

Come ha notato Arnauld, non puoi ottenere 0 a meno che non sia stata applicata la regola 1, che ha salvato il rientro. Grazie a tutti coloro che hanno commentato anche suggerimenti.

from random import*
p=print
a=b=sample(range(1,20),randint(5,10))
p(a)
if 7in a:a=[i-1for i in a];p(a)
if 0in a:a=b;p(a)
if 13in a:a=a[:a.index(13)];p(a)
if 2in a:a=[i for i in a if~i%2];p(a)
if 20in a and~a[2]%2:a=[20]
while sum(a)>50:a=a[:-1]
b=sum(a)
p(b)
if 16in a:p(hex(b))

Provalo online


Non penso che tu abbia bisogno dello spazio tra il ande ~.
Zacharý,

credo che from random import* a=b=sample(range(1,20),randint(5,10))salva alcuni byte poiché è possibile eliminare la riga 2.
nocturama

0

Perl 6 , 246 byte

my&f={.grep($^a)};my&s=->{.say};$_=[(1..20).pick xx(5..10).pick];s;$_»--
if f 7;s;$_»++ if f 0;s;.splice(.first(13):k//+$_);s;$_=[f*%%2]if f 2;
s;say(20*(.[2]%%2||$_)),exit if $_>2&&f 20;s;.pop while
.sum>49;$/=f 16;$_=.sum;s;.base(16).say if $/

Ungolfed:

my &f = { .grep($^a) };  # Helper function: search $_ for something
my &s = -> { .say };     # Helper function: print $_
$_ = [ (1..20).pick xx (5..10).pick ];  # Generate the initial array
s;  # Print the array
$_»-- if f 7;  # Decrement all elements if it contains a 7
s;  # Print the array
$_»++ if f 0;  # Increment all elements if a zero is found
s;  # Print the array
.splice(.first(13):k // +$_);  # Splice out everything from the first 13 onward
s;  # Print the array
$_ = [ f *%%2 ] if f 2;  # Remove all odd elements if a 2 is found
s;  # Print the array
say(20*(.[2] %% 2 || $_)), exit if $_ > 2 && f 20;  # Print and exit, maybe
s;  # Print the array
.pop while .sum > 49;  # Remove elements from the end until sum is below 50
$/ = f 16;  # Save in $/ whether $_ contains a 16
$_ = .sum;  # Set $_ to its own sum
s;  # Print the sum
.base(16).say if $/  # Print the sum in hexadecimal if the last array contained a 16

0

Lisp comune, 490 byte

Qui l'array è rappresentato come un elenco Lisp comune.

(let((a(loop for i from 1 to(+ 5(random 5))collect(1+(random 19)))))(flet((p()(format t"~a~%"a))(m(x)(member x a))(h(x)(map-into a x a)))(p)(and(m 7)(h'1-))(p)(and(m 0)(h'1+))(p)(let((p(position 13 a)))(and p(setf a(butlast a (-(length a)p)))))(p)(and(m 2)(setf a(remove-if'oddp a)))(p)(or(and(m 20)(or(and(third a)(oddp(third a))(* 20(length a)))20))(p)(and(setf a(loop for x in a sum x into s while (<= s 50) collect x)) nil)(p)(let((s(reduce'+ a)))(print s)(and(m 16)(format t"~x"s))))))

Come al solito, grande uso di ande orcome strutture di controllo.

(let ((a (loop for i from 1 to (+ 5 (random 5))  ; create initial list
            collect (1+ (random 19)))))
  (flet ((p () (format t "~a~%" a))     ; auxiliary functions: print list
         (m (x) (member x a))           ; check membership
         (h (x) (map-into a x a)))      ; operate on elements
    (p)
    (and (m 7) (h '1-))                 ; if 7 is present decrement all values
    (p)
    (and (m 0) (h '1+))                 ; if 0 is now present increment all values
    (p)
    (let ((p (position 13 a)))          ; remove from 13 (if exists)
      (and p (setf a (butlast a (- (length a) p)))))
    (p)
    (and (m 2) (setf a (remove-if 'oddp a)))   ; if 2 is present remove odd values
    (p)
    (or (and (m 20)                            ; if 20 is present
             (or (and (third a)                ;    when third is present
                      (oddp (third a))         ;         and it is odd
                      (* 20 (length a)))       ;         return 20 times the length
                 20))                          ;    otherwise return 20
        (p)                                    ; otherwise (20 is not present)
        (and (setf a (loop for x in a sum x into s ; compute sum of elements
                        while (<= s 50)            ; limited to 50
                        collect x))                ; and return those elements
             nil)                                  ; (to execute the rest of the code)
        (p)
        (let ((s (reduce '+ a)))                   ; compute the final sum
          (print s)                                ; print the result in decimal
          (and (m 16) (format t "~x" s))))))       ; if 16 is present print also in hexadecimal
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.