A tediosa variedade de 7 regras


11

O resumo

Crie um programa que gere uma matriz de tamanho aleatório com números aleatórios e aplique uma série de regras que alteram a matriz. Após a aplicação das regras, imprima a soma da matriz, a menos que especificado de outra forma

Configuração da matriz

A matriz deve ter um comprimento aleatório entre 5 e 10 inclusive, com números inteiros aleatórios entre 1 e 20 inclusive. Cada comprimento de matriz deve ter igual probabilidade de acontecer e cada número inteiro deve ter igual probabilidade de ser escolhido por elemento.

As 7 regras

As regras devem agir como se fossem aplicadas em sequência (por exemplo: a regra 1 atua antes da regra 2) e são aplicadas apenas uma vez. Para prova do aplicativo de regra, a matriz deve ser impressa no console após cada aplicativo de regra e uma vez antes da aplicação de qualquer regra.

  1. Se a matriz contiver 7, subtraia 1 de cada elemento
  2. Se a regra 1 for aplicada e a matriz agora contiver um 0, adicione 1 a cada elemento
  3. Se a matriz contiver 13, exclua 13 e todos os elementos a seguir da matriz
  4. Se a matriz contiver 2, exclua todos os números ímpares
  5. Se a matriz contiver 20 e o terceiro elemento for par, retorne 20 como a soma e finalize. Se um 20 estiver presente e o terceiro elemento for ímpar, retorne 20 vezes o comprimento da matriz como a soma e termine.
  6. Se a soma for maior que 50, remova o último elemento repetidamente até que seja menor ou igual a 50
  7. Se a matriz contiver 16, imprima a soma em decimal e hexadecimal.

Exemplo

Aqui está uma matriz inicial,

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

A regra 1 pode ser aplicada:

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

A regra 3 é aplicada a seguir:

[19, 1, 4, 6]

Nenhuma outra regra é necessária; portanto, o programa retorna 30 como a soma.

Notas

  • Eu não sou um jogador de código experiente, embora eu possa dizer que meu registro pessoal está em Python 3 com 369 bytes .
  • As regras não precisam ser realmente aplicadas em ordem, mas devem agir como se fossem.

1
Quão aleatório "aleatório" deve ser?
— HyperNeutrino

1
@HyperNeutrino, pode ser tão aleatório quanto você quiser, mas não é um desafio. Repetições são permitidas.
— Graviton

Como você vai verificar se realmente aplicamos as regras? Eu posso apenas gerar um número aleatório abaixo de 50 e tecnicamente ainda não violaria nenhuma das regras, e eu poderia dizer que "seguiu" as regras. Edição: Agora percebo que isso não vai funcionar, mas as pessoas vão encontrar maneiras de contornar as regras aleatórias. Você vai impedir isso?
— Clismique

1
No momento, a escolha de uma das duas matrizes [3 3 3 3 4 3]e [4 4 3 4 4], cada uma com 50% de probabilidade, está em conformidade com o que está escrito em "configuração da matriz". Para que eu possa imprimir 19sempre? (Claro, o que realmente penso é que a definição das necessidades "aleatórios" de ser esclarecido.)
— Greg Martin

2
If the array contains a 20, and the third element is even/odd, e se a matriz tiver menos de 3 elementos nesta etapa?
— Emigna

Respostas:


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)

Não sei como você impedirá que as pessoas contornem as regras, mas este usa o procedimento especificado.

+7 bytes; obrigado a @YamB por salvar alguns bytes; adicionou muito mais para corrigir um erro anterior.
-14 bytes graças a @RootTwo e a mim e também corrigimos o erro.
+83 bytes; isso está ficando horrivelmente longo porque o OP continua alterando as regras. -um número de bytes graças a @ZacharyT


Todos os cheques para mim, obrigado por ser honesto.
— Graviton

Você pode salvar 4 bytes importando 'randint como r' e alterando 'se 7in ke 1não em k: k = [i-1 ...' para 'se 7in k: k = [i + 1-int (1in k ) ... ''
— Graviton

Ao inicializar k, você não precisa do valor de i; portanto, você pode salvar 6 bytes com k=[r(1,20)for _ in'-'*r(5,11)]. Você pode salvar outro byte usando k=[i+~-(1in k)*(7in k)for i in k]para as regras 1 e 2.
— RootTwo

1
@ Notts90 As regras foram alteradas depois que escrevi este desafio. Vou corrigi-lo quando chegar ao computador. Obrigado.
— HyperNeutrino

Nas linhas cinco e sete, você tem um espaço desnecessário após o 1e pode alterar printo segundo e o terceiro para o último p. E você ... não atualizou seu bytecount.
— Zachary

6

05AB1E , 91 bytes

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

Experimente online! ou com entrada


84 bytes e potencialmente correto? Diferente? Nenhuma idéia. tio.run/nexus/…
— Magic Octopus Urn

@carusocomputing: Eu não examinei completamente, mas ele não gera a matriz aleatória no começo nem imprime resultados intermediários. Vai demorar um pouco mais ao adicionar essas partes.
— Emigna

6

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

Huzzah! Finalmente empatado com a batida Arnauld !

Após essa troca * nos comentários do desafio e após muita deliberação, decidi usar new Datecomo semente do gerador de números aleatórios em vez de Math.random(). Fazer isso significa que todos os números inteiros na matriz terão o mesmo 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)

Tente

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

  • Salva 2 bytes registrando apenas os elementos popped na regra 6.
  • Economizou 2 bytes substituindo Array(x).fill()por [...Array(x)].
  • Adicionado 2 bytes porque eu errei na regra 5!
  • Economizei 7 bytes corrigindo a bagunça que fiz tentando consertar a bagunça anterior!
  • Economizei 3 bytes graças a Arnauld, ajudando-me a curar um peido cerebral na regra 2 e salvou um byte adicional substituindo a +1por a ~.
  • Adicionado 2 bytes garantindo que 0seja retornado para uma matriz vazia.
  • Economizou 20 bytes, finalmente, descobrindo como abandonar esse whileciclo fecal .
  • Salva 2 bytes substituindo as ,duas últimas instruções por a |e removendo o anexo ().
  • Economizou 6 bytes substituindo console.logpor alert.
  • Economizou 7 bytes melhorando o atalho de a.includes().
  • Economizou 1 byte editando a implementação da regra 3.
  • Economizou 7 bytes abandonando includes()e usando apenas o tempo indexOf()todo.
  • Economizou 1 byte movendo a declaração inicial da svariável para um local que não precisava de vírgula.
  • Economizou 6 bytes substituindo Math.random()por new Date.
  • Salva 4 bytes removendo o arredondamento (agora redundante) dos números aleatórios.

Versão legível e testável

  • Adicionadas quebras de linha e comentários ao código
  • Usado em console.logvez de alertsua sanidade! (Melhor visualizado no console do seu navegador)
  • Adicionado o número da regra atual à saída.
  • Comentou a geração aleatória de matrizes para permitir o teste inserindo uma lista de números separados por vírgula.


* Captura de tela, caso seja excluída:


4

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

É necessário um monte de golfe aqui ... Corrigido um erro em que ele imprimia o hexidecimal uma vez para cada 16 na lista ...

Agradecimentos especiais a ZacharyT com a ajuda do golfe

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

Experimente online!


1
Mesmo que você ainda possa jogar muito golfe, você já está 1 byte abaixo da minha resposta do Java. XD Vamos ver se eu posso jogar de alguma forma para vencer o seu envio atual. ;)
— Kevin Cruijssen

Ok, encontrei algo para -3 bytes; p
— Kevin Cruijssen

Se você pode jogar golfe, poderá conseguir um "riscado 444 ainda está 444" lá! : D
— HyperNeutrino

@HyperNeutrino Golfed fora mais 2 bytes
— cleblanc

Yay! Bom trabalho: D
— HyperNeutrino

3

JavaScript (ES6), 296 295 290 289 bytes

Um programa completo que registra a matriz inicial, os resultados intermediários e a soma final no 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)

Como funciona

Isso foi compactado usando esse empacotador JS .

Demolir:

  • String compactada : 226 225 bytes
  • Código da embalagem: 69 64 bytes

Abaixo está o código-fonte original com alguns espaços em branco e linhas adicionais para facilitar a leitura. Em vez de aplicar truques comuns de golfe, ele foi escrito de maneira a produzir o maior número possível de strings repetidos para agradar ao empacotador. Por exemplo, a sintaxe if(k=~a.indexOf(N))é duplicada em qualquer lugar, embora kseja usada apenas na 3ª regra.

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 desembalagem

O código de descompactação original é:

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

Todas as seguintes variantes do ES6 têm exatamente o mesmo tamanho:

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

A única maneira que eu encontrei até agora de economizar alguns bytes é usar for ... of:

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

Lendo isso em um telefone, posso estar errado, mas, no seu código descompactado, parece que a regra 2 está sendo aplicada, independentemente de a regra 1 estar ou não.
— Shaggy

1
@ Shagy Isso está correto. Mas você não pode obter um zero a menos que a regra 1 seja acionada.
— Arnauld

D'oh! Claro! Cara, eu tenho tido um número ridículo de arrancadas cerebrais durante este desafio :(
— Shaggy

1
@ Shaggy Infelizmente não. No entanto, podemos salvar um byte com n&1^1(ele não é empacotado, mas é apenas um byte menor que !(n&1)). Eu pensei sobre isso em algum momento e esqueci de incluí-lo.
— Arnauld

1
@Shaggy Ahah! Bom trabalho!
— Arnauld

2

Primeira tentativa no código de golfe!

Já batido por outros javascripters! Que droga! Eu vou melhorar!!! =)

Javascript -> 550 402 bytes

Definitivamente poderia ser melhorado. Comprimido agora:

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)

Originário:

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 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 graças a @Poke

Explicação:

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

Saídas de amostra: os
comentários por trás das saídas de amostra não são impressos, mas os adicionei como esclarecimento.

Experimente aqui.

[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
Agora estou com 594 bytes:
— #

@cleblanc Vejo que você está com 444 agora. Não posso competir com isso com Java. :) (engraçado dizer que desde 444 não é onde perto ganhando em comparação com todas as outras respostas ..)
— Kevin Cruijssen

Eu sei disso, mesmo as línguas de golfe como 05AB1E têm quase 100 bytes de comprimento. Esse desafio foi doloroso.
— Cleblanc 14/04

Você pode deixar sua lista genérica List a = new ArrayList()? Pode salvar alguns bytes. Você pode precisar adicionar uma conversão de texto ao fazer aritmética real. Se não, Longé mais curto queInteger
— Poke

@Poke Com um genérico List, tenho que usar um (int)elenco cinco vezes, além de alterar o loop for-each de intpara Objecte adicionar um sexto elenco. Quanto a Long: obrigado, isso economiza 1 byte :) (ainda é necessário alterar o for-each de intpara longe r.nextInt(20)+1para r.nextInt(20)+1L).
— Kevin Cruijssen

2

Ruby 2.4, 260 bytes

O Ruby 2.4 é necessário 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)

Experimente online! (Nem o repl.it nem o tio.run suportam o Ruby 2.4 ainda, portanto, esta versão online substitui sumpor inject(:+), que tem o mesmo comportamento.)


1

R (3.3.1), 325 bytes

Implementação bastante ingênua; Eu acho que provavelmente posso torná-lo um pouco mais curto.

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

Experimente online!

Eu queria tentar este, embora tenha imaginado que ainda não conseguiria responder às respostas aqui: os PI ainda estão tentando jogar golfe, tenho certeza de que é possível com menos bytes. Encontrou um método melhor para hex, mas provavelmente ainda poderia melhorar.

Teve que converter $auma string tantas vezes que era melhor criar um filtro para ela ...

Havia alguns campos fáceis que eu perdi, como parênteses e espaços. Ainda pode haver alguns por aí?

Um pouco mais fácil de ler código:

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 bytes

Inicialmente, planejei talvez uma resposta de oitava única, mas exigir a saída de todas as regras aplicadas frustrou meus planos. Em vez disso, uma resposta bastante direta do MATLAB com algumas otimizações interessantes, por exemplo, o uso de em cumsumvez do óbvio whilepara a regra 6. Ainda assim, grande parte da contagem de bytes é desperdiçada em ifs para impedir a saída se uma regra não for aplicada.

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

Experimente online!


0

Scala 587 bytes um forro

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 está

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(","))
  }
}

Como essa é uma questão de código-golfe , solicitamos que você faça pelo menos os campos fáceis, como remover espaços em branco desnecessários.
— Post Rock Garf Hunter

Eu adicionei a versão de um byte de baixa linha
— Saideep Sambaraju 17/17/17

Não conheço Scala, mas o espaço é a: Array[T]necessário? Você não tem espaço args:Array[String], e foi isso que resultou em minha pergunta.
— Zachary

não, acho que senti falta.
— 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

Isso aplicará todas as regras em ordem, imprimindo o valor da matriz após cada etapa.

O programa falhará na regra 5 se o número resultante de elementos for menor que três. Atualmente, não há nada a dizer o que deve acontecer se não houver um terceiro elemento, portanto, estou assumindo que uma falha seja aceitável. O programa agora imprimirá 20 se houver menos de 3 elementos e um ou mais for 20.

Curiosamente, a etapa 2 pode ser aplicada independentemente da etapa 1. Isso ocorre porque a matriz de entrada nunca terá um 0, o que significa que, se houver algum 0 na matriz, deve ser o resultado da etapa 1.

Todas as regras são aplicadas por vez, até 5, mesmo se não houver alterações. Como resultado, a matriz será impressa no início e depois de cada etapa até 5. Após a etapa 5, você receberá a soma se for aplicada ou nenhuma saída até a etapa 6. Uma linha extra contendo apoderá ser adicionada após a instrução else para garantir que o valor da matriz seja impresso após a etapa 5 ao custo de 2 bytes.


Também gostaria de mencionar que não olhei para as outras respostas até depois de escrever isso. Vejo agora que há outra resposta do MATLAB com algumas semelhanças - todas coincidentes.


0

Python 3, 297293289 , 278 bytes

Como Arnauld percebeu, você não pode obter 0 a menos que a regra 1 tenha sido aplicada, a qual foi salva no recuo. Obrigado a todos os outros que também comentaram com sugestões.

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

Experimente online


Eu não acho que você precise do espaço entre o ande ~.
— Zachary

eu acredito from random import* a=b=sample(range(1,20),randint(5,10))salva alguns bytes desde que você pode excluir a linha 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 $/

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 comum, 490 bytes

Aqui a matriz é representada como uma 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 costume, grande uso ande orcomo estruturas de controle.

(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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.