El tedioso conjunto de 7 reglas

11

El resumen

Cree un programa que genere una matriz de longitud aleatoria con números aleatorios, luego aplique una serie de reglas que alteren la matriz. Después de que se hayan aplicado las reglas, imprima la suma de la matriz a menos que se especifique lo contrario

Configuración de matriz

La matriz debe tener una longitud aleatoria entre 5 y 10 inclusive, con enteros aleatorios entre 1 y 20 inclusive. Cada longitud de matriz debe tener la misma probabilidad de suceder y cada número entero debe tener la misma probabilidad de ser elegido por elemento.

Las 7 reglas

Las reglas deben actuar como si se aplicaran en secuencia (por ejemplo: la regla 1 actúa antes que la regla 2) y solo se aplican una vez. Para la prueba de la aplicación de la regla, la matriz debe imprimirse en la consola después de cada aplicación de la regla y una vez antes de aplicar las reglas.

  1. Si la matriz contiene un 7, reste 1 de cada elemento
  2. Si se aplica la regla 1 y la matriz ahora contiene un 0, agregue 1 a cada elemento
  3. Si la matriz contiene un 13, excluya la 13 y todos los elementos que siguen, de la matriz
  4. Si la matriz contiene un 2, excluya todos los números impares
  5. Si la matriz contiene un 20, y el tercer elemento es par, devuelve 20 como la suma y luego termina. Si hay un 20 presente y el tercer elemento es impar, devuelve 20 veces la longitud de la matriz como la suma y luego termina.
  6. Si la suma es mayor que 50, elimine el último elemento repetidamente hasta que sea menor o igual a 50
  7. Si la matriz contiene un 16, imprima la suma en decimales y hexadecimales.

Ejemplo

Aquí hay una matriz inicial,

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

La regla 1 se puede aplicar:

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

La regla 3 se aplica a continuación:

[19, 1, 4, 6]

No se necesitan otras reglas, por lo que el programa devuelve 30 como suma.

Notas

  • No soy un jugador de código experimentado, aunque puedo decir que mi registro personal está en Python 3 con 369 bytes .
  • Las reglas no tienen que aplicarse realmente en orden, sino que deben actuar como si lo hicieran.
Graviton
fuente
1
¿Qué tan aleatorio tiene que ser "aleatorio"?
HyperNeutrino
1
@HyperNeutrino puede ser tan aleatorio como quieras, pero no desafiar el lanzamiento. Se permiten repeticiones.
Graviton el
¿Cómo va a verificar si realmente aplicamos las reglas? Simplemente puedo generar un número aleatorio por debajo de 50 y técnicamente todavía no rompería ninguna de las reglas, y podría decir que "siguió" las reglas. EDITAR: Ahora me doy cuenta de que esto no funcionará, pero las personas encontrarán formas de eludir las reglas aleatorias. ¿Vas a evitar eso?
clismique
1
Por el momento, elegir una de las dos matrices [3 3 3 3 4 3]y [4 4 3 4 4], cada una con una probabilidad del 50%, cumple con lo que está escrito en "configuración de la matriz". Entonces, ¿puedo simplemente salir 19cada vez? (Por supuesto, lo que realmente pienso es que la definición de "aleatorio" debe aclararse).
Greg Martin
2
If the array contains a 20, and the third element is even/odd, ¿qué pasa si la matriz tiene menos de 3 elementos en este paso?
Emigna

Respuestas:

8

Python 3, 294 301 287 356 bytes

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)

No sé cómo va a evitar que las personas eludan las reglas, pero este utiliza el procedimiento especificado.

+7 bytes; gracias a @YamB por guardar algunos bytes; Agregó mucho más para corregir un error anterior.
-14 bytes gracias a @RootTwo y a mí y también corrigió el error.
+83 bytes; esto se está haciendo terriblemente largo porque OP sigue cambiando las reglas. -algunos bytes gracias a @ZacharyT

Hiperneutrino
fuente
Todo me sale bien, gracias por ser honesto.
Graviton el
Puede guardar 4 bytes importando 'randint as r' y cambiando 'if 7in k y 1not in k: k = [i-1 ...' a 'if 7in k: k = [i + 1-int (1in k ) ... '
Graviton el
Al inicializar k, no necesita el valor de i, por lo que puede guardar 6 bytes con k=[r(1,20)for _ in'-'*r(5,11)]. Puede guardar otro byte utilizando las k=[i+~-(1in k)*(7in k)for i in k]reglas 1 y 2.
RootTwo
1
@ Notts90 Las reglas cambiaron después de escribir este desafío. Lo arreglaré cuando llegue a una computadora. Gracias.
HyperNeutrino
En las líneas cinco y siete, tiene un espacio innecesario después del 1, y puede cambiarlo printen la segunda y tercera a las últimas líneas p. Y tú ... no has actualizado tu bytecount.
Zacharý
6

05AB1E , 91 bytes

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

Pruébalo en línea! o con entrada

Emigna
fuente
84 bytes, y potencialmente correcto? ¿Diferente? Ni idea. tio.run/nexus/…
Urna de pulpo mágico
@carusocomputing: no lo he examinado a fondo, pero al principio no genera la matriz aleatoria ni imprime resultados intermedios. Será un poco más largo al agregar esas partes.
Emigna
6

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

Huzzah! Finalmente atado con el ritmo Arnauld !

Después de este intercambio * en los comentarios del desafío y después de mucha deliberación, he decidido utilizarlo new Datecomo semilla para el generador de números aleatorios en lugar de Math.random(). Hacerlo significa que todos los enteros en la matriz serán del mismo valor.

_=>(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)

Intentalo

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

  • Se guardaron 2 bytes al registrar solo los elementos emergentes en la regla 6.
  • Se guardaron 2 bytes al reemplazar Array(x).fill()con [...Array(x)].
  • ¡Agregué 2 bytes porque me equivoqué en la regla 5!
  • ¡Ahorré 7 bytes arreglando el desastre que hice tratando de arreglar el desastre anterior!
  • Ahorré 3 bytes gracias a Arnauld, que me ayudó a curar un brainfart en la regla 2 y guardó un byte adicional al reemplazar a +1por a ~.
  • Se agregaron 2 bytes para garantizar que 0se devuelva una matriz vacía.
  • Ahorró 20 bytes al finalmente descubrir cómo deshacerse de ese whilebucle de fecking .
  • Se guardaron 2 bytes reemplazando las ,últimas 2 declaraciones con a |y eliminando el encerramiento ().
  • Guardado 6 bytes al reemplazar console.logcon alert.
  • Ahorró 7 bytes al mejorar el acceso directo de a.includes().
  • Se guardó 1 byte editando la implementación de la regla 3.
  • Guardado 7 bytes por zanja includes() y simplemente usando en indexOf()todo momento.
  • Se guardó 1 byte moviendo la declaración inicial de s variable a algún lugar donde no se necesita una coma.
  • Guardado 6 bytes al reemplazar Math.random()con new Date.
  • Se guardaron 4 bytes al eliminar el redondeo (ahora redundante) de los números aleatorios.

Versión legible y comprobable

  • Se agregaron saltos de línea y comentarios al código
  • Usado en console.loglugar dealert para su cordura! (Se ve mejor en la consola de su navegador)
  • Se agregó el número de la regla actual a la salida.
  • Comentó la generación de matriz aleatoria para permitir la prueba mediante la entrada de una lista de números separados por comas


* Captura de pantalla, en caso de que se elimine:

Lanudo
fuente
4

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

Aquí se necesita mucho golf ... Se corrigió un error por el cual se imprimía el hexadecimal una vez por cada 16 en la lista ...

Un agradecimiento especial a ZacharyT con la ayuda de 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);}

Pruébalo en línea!

cleblanc
fuente
1
Aunque todavía puedes jugar mucho golf, ya estás 1 byte debajo de mi respuesta Java. XD Veamos si puedo jugarlo de alguna manera para superar tu presentación actual. ;)
Kevin Cruijssen
Ok, encontré algo para -3 bytes; p
Kevin Cruijssen
Si puede jugar golf, puede ser capaz de obtener un "444 tachado 444". : D
HyperNeutrino
@HyperNeutrino Golfed otros 2 bytes
cleblanc
¡Hurra! Buen trabajo: D
HyperNeutrino
3

JavaScript (ES6), 296 295 290 289 bytes

Un programa completo que registra la matriz inicial, los resultados intermedios y la suma final en la consola.

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)

Cómo funciona

Esto fue comprimido usando este JS Packer .

Descompostura:

  • Cadena empaquetada: 226 225 bytes
  • Código de desempaque: 69 64 bytes

A continuación se muestra el código fuente original con algunos espacios en blanco adicionales y avances de línea para facilitar la lectura. En lugar de aplicar trucos de golf estándar, fue escrito de una manera que produce tantas cuerdas repetitivas como sea posible para complacer al empacador. Por ejemplo, la sintaxis if(k=~a.indexOf(N))se duplica en todas partes, aunque ksolo se usa en la tercera regla.

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

Métodos de desembalaje

El código de desempaque original es:

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

Todas las siguientes variantes de ES6 tienen exactamente el mismo tamaño:

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

La única forma que he encontrado hasta ahora para reducir algunos bytes es usar for ... of:

f="packed_string";for(g of "ABCDEFGHI")e=f.split(g),f=e.join(e.pop());eval(f)
Arnauld
fuente
Al leer esto en un teléfono, puedo estar equivocado, pero, en su código desempaquetado, parece que la regla 2 se está aplicando independientemente de si la regla 1 es o no.
Shaggy
1
@ Shaggy Eso es correcto. Pero no puede obtener un cero a menos que se active la regla 1.
Arnauld
D'oh! ¡Por supuesto! Hombre, he tenido una cantidad ridícula de brainfarts durante este desafío :(
Shaggy
1
@ Shaggy Lamentablemente no. Sin embargo, podemos guardar un byte con n&1^1(no se empaqueta en absoluto, pero es solo un byte más corto que !(n&1)). Pensé en eso en algún momento y olvidé incluirlo.
Arnauld
1
@ Shaggy Ahah! ¡Buen trabajo!
Arnauld
2

¡Primero prueba en code golf!

¡Ya vencido por otros javascripters! Dangit! ¡¡¡Voy a mejorar!!! =)

Javascript -> 550 402 bytes

Definitivamente podría mejorarse. Comprimido ahora:

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)

Original:

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));
Okiris azul
fuente
2

Java 7, 622 619 618 bytes

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 gracias a @Poke

Explicación:

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

Resultados de muestra: los
comentarios detrás de los resultados de muestra no se imprimen, pero los agregué como aclaración.

Pruébalo aquí.

[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
Kevin Cruijssen
fuente
1
Ahora tengo 594 bytes :-D
cleblanc
@cleblanc Veo que ahora tienes 444 .. No puedo competir con eso con Java. :) (Es gracioso decir que ya que 444 no está cerca de ganar en comparación con todas las otras respuestas ...)
Kevin Cruijssen
Lo sé, incluso los idiomas de golf como 05AB1E tienen casi 100 bytes de longitud. Este desafío fue un dolor.
cleblanc
¿Puedes dejar tu lista genérica List a = new ArrayList()? Podría guardar algunos bytes. Sin embargo, es posible que deba agregar un tipo de letra al hacer la aritmética real. Si no, Longes más corto queInteger
Poke
@Poke Con un genérico Listque tengo que usar un (int)yeso cinco veces, así como el cambio del bucle para cada uno-a partir intde Objecty añadir un sexto elenco. En cuanto a Long: gracias, eso ahorra 1 byte :) (todavía tiene que cambiar el for-each de intto long, r.nextInt(20)+1to r.nextInt(20)+1L).
Kevin Cruijssen
2

Ruby 2.4, 260 bytes

Se requiere Ruby 2.4 para 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)

Pruébalo en línea! (Ni repl.it ni tio.run admiten Ruby 2.4 todavía, por lo que esta versión en línea reemplaza sumpor inject(:+), que tiene el mismo comportamiento).

Tinta de valor
fuente
1

R (3.3.1), 325 bytes

Implementación bastante ingenua; Creo que probablemente pueda hacerlo un poco más corto.

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)
Giuseppe
fuente
1

PowerShell , 525413 bytes

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

Pruébalo en línea!

Quería intentar este, aunque pensé que no superaría las respuestas que ya están aquí: PI todavía ha estado intentando descifrar esto, estoy seguro de que es posible con menos bytes. Encontré un mejor método para hexadecimal, pero probablemente aún podría mejorar.

Tuve que lanzar $auna cadena tantas veces que era mejor crear un filtro para ella ...

Eché de menos algunos campos de golf fáciles, como paréntesis y espacios. ¿Todavía podría haber algo por ahí?

Código algo más fácil de leer:

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
Sinusoide
fuente
0

MATLAB, 275 bytes

Originalmente planeé tal vez una respuesta Octave de una sola línea, pero requerir la producción de todas las reglas aplicadas frustró mis planes. En cambio, una respuesta MATLAB bastante sencilla con algunas optimizaciones interesantes, por ejemplo, el uso de en cumsumlugar de lo obvio whilepara la regla 6. Aún así, se desperdicia una gran cantidad de bytes en ifs para evitar la salida si no se aplica una regla.

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

Pruébalo en línea!

Sanchises
fuente
0

Scala 587 bytes un trazador de líneas

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 bytes como es

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(","))
  }
}
Saideep Sambaraju
fuente
Dado que esta es una pregunta de código de golf , le pedimos que haga al menos los campos de golf fáciles, como eliminar espacios en blanco innecesarios.
Ad Hoc Garf Hunter
Agregué la
No sé Scala, pero ¿es necesario el espacio a: Array[T]? No tienes espacio args:Array[String], que es lo que resultó en mi consulta.
Zacharý
No, creo que me lo perdí.
Saideep Sambaraju
0

MATLAB, 228 241bytes

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

Esto aplicará todas las reglas en orden, imprimiendo el valor de la matriz después de cada paso.

El programa se bloqueará en la regla 5 si el número resultante de elementos es inferior a tres. Actualmente no hay nada que decir qué debería suceder si no hay un tercer elemento, por lo que supongo que un bloqueo es aceptable. El programa ahora imprimirá 20 si hay menos de 3 elementos y uno o más es un 20.

Curiosamente, el paso 2 se puede aplicar independientemente de si el paso 1 fue. Esto se debe a que la matriz de entrada nunca tendrá un 0, lo que significa que si hay 0 en la matriz, debe ser el resultado del paso 1.

Todas las reglas se aplican a su vez, hasta 5, incluso si no se realizan cambios. Como resultado, la matriz se imprimirá al principio y luego, después de cada paso, hasta 5. Después del paso 5, obtendrá la suma si se aplica, o no saldrá hasta después del paso 6. Se apodría agregar una línea adicional que contenga después. la instrucción else para garantizar que el valor de la matriz se imprima después del paso 5 a un costo de 2 bytes.


También me gustaría mencionar que no miré las otras respuestas hasta después de haber escrito esto. Ahora veo que hay otra respuesta de MATLAB con algunas similitudes, todas las cuales son coincidencia.

Tom Carpenter
fuente
0

Python 3, 297 293 289 , 278 bytes

Como descubrió Arnauld, no puede obtener 0 a menos que se haya aplicado la regla 1, que se guardó en la sangría. Gracias a todos los que también comentaron con sugerencias.

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

Pruébalo en línea

Notts90 apoya a Monica
fuente
No creo que necesites el espacio entre el andy ~.
Zacharý
Creo que from random import* a=b=sample(range(1,20),randint(5,10))ahorra algunos bytes ya que puede eliminar la línea 2.
nocturama
0

Perl 6 , 246 bytes

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 $/

Sin golf:

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
Sean
fuente
0

Lisp común, 490 bytes

Aquí la matriz se representa como una lista Common Lisp.

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

Como de costumbre, gran uso de andy orcomo estructuras de control.

(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
Renzo
fuente