Introdução:
Vamos dar uma olhada em uma calculadora padrão no Windows:
para esse desafio, veremos apenas os seguintes botões e ignoraremos todo o resto:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
Desafio:
Entrada:
você receberá duas entradas:
- Um é algo para indicar a rotação em incrementos de 90 graus
- A outra é uma lista de coordenadas que representam os botões pressionados na calculadora girada.
Com base na primeira entrada, giramos o layout mencionado acima no sentido horário em incrementos de 90 graus. Portanto, se a entrada é 0 degrees
, permanece como é; mas se a entrada for 270 degrees
, ela será girada três vezes no sentido horário (ou uma vez no sentido anti-horário). Aqui estão os quatro layouts possíveis:
Default / 0 degrees:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
90 degrees clockwise:
0 1 4 7
0 2 5 8
. 3 6 9
+ - * /
180 degrees:
+ . 0 0
- 3 2 1
* 6 5 4
/ 9 8 7
270 degrees clockwise / 90 degrees counterclockwise:
/ * - +
9 6 3 .
8 5 2 0
7 4 1 0
A segunda entrada é uma lista de coordenadas em qualquer formato razoável † . Por exemplo (matriz de números inteiros 2D com 0 índices):
[[1,2],[2,3],[0,3],[1,0],[1,1]]
Saída:
Nós produzimos tanto a soma quanto o resultado (e um sinal de igual =
).
Exemplo:
Portanto, se a entrada for 270 degrees
e [[1,2],[2,3],[0,3],[1,0],[1,1]]
, a saída se tornará:
517*6=3102
Regras do desafio:
- † As entradas podem estar em qualquer formato razoável. A primeira entrada pode ser
0-3
,1-4
,A-D
,0,90,180,270
, etc. A segunda entrada pode ser uma matriz 2D 0-indexados, array 1-indexados 2D, uma String, lista de Point-objetos, etc. Sua chamada. É até possível trocar as coordenadas x e y em comparação com as entradas de exemplo fornecidas. Indique quais formatos de entrada você usou em sua resposta! - Você tem permissão para adicionar espaços (ou seja
517 * 6 = 3102
), se desejar. - Você tem permissão para adicionar zeros à direita após a vírgula, até um máximo de três (ou seja,
3102.0
/3102.00
/ em3102.000
vez de3102
ou em0.430
vez de0.43
). - Você não tem permissão para adicionar parênteses na saída, portanto,
(((0.6+4)-0)/2)/4=0.575
não é uma saída válida. - Você tem permissão para usar outros símbolos de operando no seu idioma. Então
×
ou em·
vez de*
; ou em÷
vez de/
; etc. - Como uma calculadora calcula automaticamente ao inserir um operando, você deve ignorar a precedência do operador! Portanto
10+5*3
, resultará em45
((10+5)*3=45
), não25
(10+(5*3)=25
)
(ou seja,10
→+
→5
→*
(agora exibe 15 no visor) →3
→=
(agora exibe a resposta45
)). Lembre-se disso ao usareval
funções semelhantes na soma resultante. - Não haverá casos de teste para divisão por 0.
- Não haverá casos de teste com mais de três dígitos decimais como resultado, portanto, não há necessidade de arredondar o resultado.
- Não haverá casos de teste em que vários operandos se sigam ou em que dois pontos se sigam.
- Não haverá casos de teste para números negativos. O sinal de menos (
-
) será usado apenas como operando, não como negativo. - Não haverá casos de teste
.##
sem um número inicial antes da vírgula (ou seja2+.7
, não será um caso de teste válido, mas2+0.7
poderia ser).
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Input: 270 degrees & [[1,2],[2,3],[0,3],[1,0],[1,1]]
Output: 517*6=3102
Input: 90 degrees & [[3,1],[0,0],[0,1],[3,3],[2,0],[0,3],[0,0],[0,2],[3,0],[2,1]]
Output: 800/4+0.75=200.75
Input: 0 degrees & [[0,0],[1,0],[2,0],[3,0],[1,2],[2,1],[2,2]]
Output: 789/263=3
Input: 180 degrees & [[3,0],[1,0],[1,2],[0,0],[3,2],[0,1],[2,0],[0,3],[2,1],[0,3],[3,2]]
Output: 0.6+4-0/2/4=0.575
fonte
1+-*/+-*/2
vontade dá0.5
na calculadora Windows (10).[1,3],
2+.7
?Respostas:
SOGL V0.12 ,
706967 bytesExperimente aqui ou tente uma versão que aceite entradas, conforme indicado nos casos de teste
usa o
I
operador SOGLs , que gira a matriz. Em seguida, lê uma sequência como uma matriz JavaScript e, onde uma operação é usada, coloca o resultado anterior entre parênteses, avalia como JavaScript e remove os parênteses.fonte
Dyalog APL,
94888685 bytesExperimente online!
Toma as rotações como argumento à esquerda
0-3
, e os índices baseados em 1 como argumento à direita, como uma lista dey x
coordenadas, como(1 1)(2 3)(4 5)
etc.Isso ficou bastante confuso por causa da avaliação destra de expressões no APL.
fonte
C (gcc) , 282
294295296300304306 310bytesTodas as otimizações precisam ser desativadas e funcionam apenas no GCC de 32 bits.
1 byte graças a @Orion!
Experimente online!
Função protótipo:
Formato de entrada (como no TIO):
Versão ungolfed com comentários:
O código pode lidar com casos como
1+.7
ou-8*4
.C muito triste não tem
eval
😭.fonte
3*-5
inválidos. Eu especifiquei isso nas regras.double
comfloat
um byte livre. Além disso, não éputc()
idêntico aputchar()
? Eu poderia estar errado, no entanto.putc
preciso de um segundo argumento para especificar em qual stream você está escrevendo?JavaScript (ES6),
162160157 bytesRecebe a entrada como orientação
o
e matriz de coordenadas (y, x)a
na sintaxe de currying(o)(a)
.A orientação é um número inteiro em [0..3] :
Casos de teste
Mostrar snippet de código
fonte
Rubi ,
135 133132 bytesExperimente online!
Orientação como número inteiro: 0 para 0 °, 1 para 90 ° e assim por diante.
fonte
Python 3,
235234230 bytesUm pouco feio, mas funciona para todos os casos de teste, exceto o primeiro, que não parece coincidir com a calculadora de exemplo. Tomo a rotação como 0-3 (0-270) e multiplico por 16 para compensar.
eval()
é um recurso interno que tenta compilar cadeias de caracteres como código e manipula a conversão dos símbolos de texto em operadores.Método alternativo, ficou um pouco mais longo, mas eu realmente gosto dessa dica de SO para girar o array.
fonte
Java 10,
418380 bytesDecidi responder minha própria pergunta também. Tenho certeza de que pode jogar mais um pouco usando uma abordagem diferente.
Insira como
int
(0-3
) eint[][]
(indexado 0 / o mesmo que na descrição do desafio). Saída comofloat
à esquerda.0
se o resultado for um número inteiro em vez de um número decimal.Explicação:
Experimente aqui.
fonte