Há vários anos, a Hot Wheels fez um simples jogo em flash chamado "Formula Fuelers Racers" *. Para jogar o jogo, você seleciona três ingredientes de uma geladeira para colocar no seu carro, que depois é batido contra o carro gerado aleatoriamente no computador. Acontece que a mecânica deste jogo é bastante simples. Primeiro, o "tempo" real da corrida do seu carro é gerado aleatoriamente e não tem influência sobre se você vence ou não a corrida. Em segundo lugar, o vencedor da corrida é determinado por uma pontuação calculada a partir dos ingredientes selecionados (ingredientes duplicados são permitidos e a ordem é importante). Cada ingrediente possui um "valor" associado e uma "operação" associada, conforme mostrado na tabela a seguir:
# ingredient val op
1 Hot Salsa 2 +
2 Root Beer 1 +
3 Milk 1 +
4 Pickle Juice 2 +
5 Mystery Lunch -3 *
6 BBQ Sauce 2 +
7 Egg 1 +
8 Ketchup 2 +
9 Mustard -1 *
10 Melon 1 +
11 Chocolate Milk 1 +
12 Mayonnaise -2 *
13 Baby Food 0 +
14 Pepper 1 +
15 Salt 2 +
16 Syrup -1 *
17 Salad Dressing 2 +
18 Orange Juice 1 +
19 Soy Sauce 2 +
Por conveniência, esse desafio se refere aos ingredientes pelo número e não pelo nome. Aqui estão as etapas para calcular uma pontuação:
- Primeiro, inicialize a pontuação com o valor do primeiro ingrediente.
- Em seguida, use a operação do segundo ingrediente para combinar a pontuação atual e o valor do segundo ingrediente para obter uma pontuação atualizada.
- Por fim, use a operação do terceiro ingrediente para combinar a pontuação atual e o valor do terceiro ingrediente para obter a pontuação final.
Pontuações mais altas são melhores e sempre superam pontuações mais baixas.
Por exemplo, os ingredientes 1 2 3
têm uma pontuação de (2+1)+1 = 4
. Os ingredientes 7 5 6
têm uma pontuação de (1*-3)+2 = -1
. Portanto, 1 2 3
bate 7 5 6
.
Desafio
Neste desafio, você deve escrever um programa que pega uma lista ordenada de 3 números inteiros e gera a pontuação correspondente.
Entrada
Seu programa pode aceitar uma lista de três números inteiros no formato mais conveniente. Você tem permissão para usar a indexação 1 para os nomes dos ingredientes (como acima) ou a indexação 0 (subtrair 1 de todos os índices acima).
Ouput
Seu programa deve gerar um único número inteiro indicando a pontuação.
Casos de teste
4 5 5 => 18 // max score
5 5 5 => -27 // min score
13 13 13 => 0
1 2 3 => 4
7 5 6 => -1
16 2 19 => 2
19 7 12 => -6
* Esta página está desatualizada e não funciona em alguns navegadores, mas você não precisa jogar o jogo para este desafio.
fonte
Respostas:
Gelatina , 24 bytes
Leva uma lista de ingredientes indexados em 0.
Experimente online! ou veja uma suíte de testes
Quão?
Usa uma forma levemente complicada de compactar os valores como um número de base 6 e o fato de as entradas multiplicativas serem negativas. Em vez de simplesmente aumentar 3 para obter os dígitos da base 6, são usados os valores complementados incrementados - isso economiza bytes, permitindo que o
Ị
átomo selecione as entradas negativas antes da etapa do complemento, além de salvar um byte na base 250 compressão.fonte
zẈ€$ụ¤
são lidos como seus índices (indexados 1) na página de códigos Jelly, que são[123,188,13,37,226,4]
interpretados como um número base-250:123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004
(consulte a seção literal das strings do tutorial .)JavaScript (ES6),
8984827873 bytesRecebe a entrada como uma matriz de 3 números inteiros, usando a indexação 0.
Casos de teste
Mostrar snippet de código
Versão anterior, 78 bytes
Pega os 3 números inteiros na sintaxe de currying
(a)(b)(c)
, usando a indexação 0.Como funciona
Uma coisa um pouco incomum sobre esse código é que ele usa apenas 2 argumentos na sintaxe de curry 'comum'
a => b =>
e, eventualmente, retorna uma função que aceita o terceiro.Demolir
Casos de teste
Mostrar snippet de código
fonte
Befunge,
7473 bytesExperimente aqui! É estranho que meu código funcione apenas nesse intérprete.
A segunda linha contém basicamente todos os valores da tabela. Os valores não numéricos são, na verdade, valores negativos, pois vêm antes dos dígitos na tabela ASCII. Existe um pouco de lógica que determina se o número é negativo ou não e, se for, esse número é multiplicado pelo resultado.
O lado direito da terceira linha inicializa o primeiro número. Se eu não tivesse que fazer isso, poderia economizar muitos bytes.
fonte
PHP, 128 bytes
PHP, 138 bytes
Versão Online
Expandido
fonte
Python 2 ,
123110107 bytesExperimente online!
-3 bytes graças a @mathjunkie
fonte
5445054524413452545
subtrair 3 pode economizar toneladas de bytes.n=[n+i,n*i][i<0]
dentro do loop poupa 3 bytes05AB1E , 29 bytes
Experimente online!
Na verdade, isso funciona para tantas ou poucas entradas quanto você quiser, para que você possa ter carros com 4 ou mais características ou carros com apenas 2. Isso não foi intencional, exatamente como acabou.
fonte
CJam ,
4338 bytesPode haver uma maneira de compactar ainda mais a lista ...
Usa indexação baseada em 0.
Experimente online!
Explicação
Este programa utiliza o fato de que um valor é multiplicativo em vez de aditivo se e somente se for negativo.
fonte
+ *
truque!Lua,
140131 bytesfonte
JavaScript,
8572 bytesRecebe entrada em formato
[a,b,c]
-13 bytes graças a ETHproductions
fonte
x=>(b="...",b<0?"*":"+")+b
para evitar oreturn
, eu acho. (Além disso, você não precisa o[... ]
, indexando obras em cordas)a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)
o trabalho para você?)
depois+b
, acreditoR,
125123 bytesFunção anônima que recebe três números inteiros como entrada. Define uma lista de valores e operações e avalia apenas os chamados pela entrada, ou seja,
o3(o2(v1,v2),v3)
. Definitivamente, existe uma maneira mais prática de fazer isso!Atualização: depois de algumas retrabalhos, tenho uma alternativa, também 123 bytes . Novamente, uma função anônima, mas recebe a entrada como um único vetor de três valores. Usa a mesma abordagem, definindo uma lista de valores e operações e avaliando-a.
fonte
Haskell,
186116112108 bytesPrincipal função é
k
. Novo no Code Golf, por isso tenho certeza de que há alguns bytes que eu poderia raspar com o uso inteligente de$
operador versus parênteses. Provavelmente atualizarei a resposta à medida que continuo encontrando melhorias.Essencialmente, o programa pode ser dividido assim:
*
são valores positivos sempre+
)v
mapeadas para inserir números inteiros e busca as operações e valores apropriados de cada uma e retorna a saída apropriada.ATUALIZAR
Agradecimentos especiais por apontar o truque fromEnum! Isso funcionou muito bem. Também perdi a parte das regras que declaravam que uma solução aceitável poderia ser uma função que leva uma lista de números inteiros. Isso economizou uma tremenda quantidade de trabalho.
ATUALIZAÇÃO 2
Conforme outras sugestões, raspou um punhado de bytes reordenando as operações, criando uma outra proteção que sempre é avaliada como True e um padrão correspondente em W esse padrão corresponde a uma Lista de 3 elementos. Obrigado pelas sugestões!
ATUALIZAÇÃO 3
Outro agradecimento a Laikoni por apontar mais regras de código de golfe que eu não conhecia. Também mapear v para minha entrada para criar uma lista de funções parcialmente aplicadas foi uma ideia fenomenal e me salvou 4 bytes adicionais!
fonte
[Int] -> Int
vez de ler de stdin e gravar em stdout. Fazer isso é permitido por padrão, mas, neste caso, é explicitamente mencionado no desafio de que considerar aceitável uma lista de números inteiros como entrada.fromEnum
vez dedigitToInt
provavelmente será mais curto, pois permite que você interrompa a importação.v=(map((-51+).fromEnum)"95 ... 5"!!)
salva dois parênteses.o x|x<0=(*)|0<1=(+)
salva um byte na segunda guarda.w
é um espaço extra restante. Além disso, como você só precisa lidar com listas de tamanho 3, pode usarw[x,y,z]=
como correspondência de padrões.Haskell,
9287 bytesExperimente online!
Com base na resposta do @ maple_shaft, eu apenas o fatorei um pouco.
Obrigado a @Laikoni por 5 bytes!
fonte
f=
porque funções anônimas são permitidas como envio. Eles são necessários apenas para fazer o exemplo funcionar.C,
171161 bytesfonte
Código de máquina 8086, 62 bytes
Os últimos três bytes contêm a entrada (indexada a zero). Ei, você me disse que eu poderia usar o formato de entrada mais conveniente. Nesse caso, isso é codificado!
Saída é o código de erro retornado ao shell.
Como funciona:
fonte