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.
- Se a matriz contiver 7, subtraia 1 de cada elemento
- Se a regra 1 for aplicada e a matriz agora contiver um 0, adicione 1 a cada elemento
- Se a matriz contiver 13, exclua 13 e todos os elementos a seguir da matriz
- Se a matriz contiver 2, exclua todos os números ímpares
- 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.
- Se a soma for maior que 50, remova o último elemento repetidamente até que seja menor ou igual a 50
- 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.
fonte
[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 imprimir19
sempre? (Claro, o que realmente penso é que a definição das necessidades "aleatórios" de ser esclarecido.)If the array contains a 20, and the third element is even/odd
, e se a matriz tiver menos de 3 elementos nesta etapa?Respostas:
Python 3,
294301287356 bytesNã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
fonte
k=[r(1,20)for _ in'-'*r(5,11)]
. Você pode salvar outro byte usandok=[i+~-(1in k)*(7in k)for i in k]
para as regras 1 e 2.1
e pode alterarprint
o segundo e o terceiro para o últimop
. E você ... não atualizou seu bytecount.05AB1E , 91 bytes
Experimente online! ou com entrada
fonte
Javascript (ES6),
344342340342335331333313311305298297290289283279 bytesHuzzah! Finalmente
empatado com abatida Arnauld !Após essa troca * nos comentários do desafio e após muita deliberação, decidi usar
new Date
como semente do gerador de números aleatórios em vez deMath.random()
. Fazer isso significa que todos os números inteiros na matriz terão o mesmo valor.Tente
Array(x).fill()
por[...Array(x)]
.+1
por a~
.0
seja retornado para uma matriz vazia.while
ciclo fecal .,
duas últimas instruções por a|
e removendo o anexo()
.console.log
poralert
.a.includes()
.includes()
e usando apenas o tempoindexOf()
todo.s
variável para um local que não precisava de vírgula.Math.random()
pornew Date
.Versão legível e testável
console.log
vez dealert
sua sanidade! (Melhor visualizado no console do seu navegador)Mostrar snippet de código
* Captura de tela, caso seja excluída:
fonte
C (gcc) ,
621619593585570562557552529517500482461444442441438 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
Experimente online!
fonte
JavaScript (ES6),
296295290289 bytesUm programa completo que registra a matriz inicial, os resultados intermediários e a soma final no console.
Como funciona
Isso foi compactado usando esse empacotador JS .
Demolir:
compactada:226225 bytes6964 bytesAbaixo 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, emborak
seja usada apenas na 3ª regra.Métodos de desembalagem
O código de descompactação original é:
Todas as seguintes variantes do ES6 têm exatamente o mesmo tamanho:
A única maneira que eu encontrei até agora de economizar alguns bytes é usar
for ... of
:fonte
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.Primeira tentativa no código de golfe!
Já batido por outros javascripters! Que droga! Eu vou melhorar!!! =)
Javascript ->
550402 bytesDefinitivamente poderia ser melhorado. Comprimido agora:
Originário:
fonte
Java 7,
622619618 bytes-1 byte graças a @Poke
Explicação:
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.
fonte
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
List
, tenho que usar um(int)
elenco cinco vezes, além de alterar o loop for-each deint
paraObject
e adicionar um sexto elenco. Quanto aLong
: obrigado, isso economiza 1 byte :) (ainda é necessário alterar o for-each deint
paralong
er.nextInt(20)+1
parar.nextInt(20)+1L
).Ruby 2.4, 260 bytes
O Ruby 2.4 é necessário para
Enumerable#sum
.Experimente online! (Nem o repl.it nem o tio.run suportam o Ruby 2.4 ainda, portanto, esta versão online substitui
sum
porinject(:+)
, que tem o mesmo comportamento.)fonte
R (3.3.1), 325 bytes
Implementação bastante ingênua; Eu acho que provavelmente posso torná-lo um pouco mais curto.
fonte
PowerShell ,
525413 bytesExperimente 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
$a
uma 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:
fonte
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
cumsum
vez do óbviowhile
para a regra 6. Ainda assim, grande parte da contagem de bytes é desperdiçada emif
s para impedir a saída se uma regra não for aplicada.Experimente online!
fonte
Scala 587 bytes um forro
Scala, 763 bytes como está
fonte
a: Array[T]
necessário? Você não tem espaçoargs:Array[String]
, e foi isso que resultou em minha pergunta.MATLAB,
228241bytesIsso 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
a
poderá 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.
fonte
Python 3,
297293289, 278 bytesComo 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.
Experimente online
fonte
and
e~
.from random import* a=b=sample(range(1,20),randint(5,10))
salva alguns bytes desde que você pode excluir a linha 2.Perl 6 , 246 bytes
Ungolfed:
fonte
Lisp comum, 490 bytes
Aqui a matriz é representada como uma lista Common Lisp.
Como de costume, grande uso
and
eor
como estruturas de controle.fonte