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.