Bem-vindo ao meu primeiro desafio de código-golfe! :) Vamos pular direto para ele.
Desafio:
Dados dois vetores de ponto flutuante, O (origem) e T (destino), é necessário criar um programa para imprimir os valores L e R em STDOUT.
- O é um canto da praça
- T é um canto do quadrado localizado em frente a O
- L é o ponto 2D (canto) que marca o outro ponto do quadrado incompleto
- R é o ponto 2D (canto) oposto a L
Regras
- Os valores para O e T devem ser lidos no STDIN (consulte as entradas de exemplo).
- Novamente, os valores de L e R devem ser impressos em STDOUT.
Pontuação e bônus
- Conte os bytes do seu programa.
- Se o seu programa desenhar linhas que se conectam entre O e L e T e R , subtraia 15 bytes da contagem de bytes.
Exemplos
A primeira linha abrange as entradas (os primeiros colchetes para O e os próximos colchetes para T ) e a outra linha representa a saída esperada.
- [0, 0] [3, 3] Esperado: [0, 3] [3, 0]
- [0, 0] [-2, -2] Esperado: [-2, 0] [0, -2]
- [1, -1] [4, 2] Esperado: [1, 2] [4, -1]
- [0, -1] [0, 1] Esperado: [-1, 0] [1, 0]
AVISO : as entradas e saídas podem ser pontos flutuantes!
Informação importante!
- Os valores O e T podem ser obtidos em qualquer formato, desde que sejam provenientes de STDIN (por exemplo, Inside [] ou () ...), use o formato que você desejar.
- L e R podem ser impressos em qualquer ordem.
- Lembre-se: quando (O-> L-> T-> R-> O) estão conectados, cada lado deve ter o mesmo comprimento!
Ganhando
- Este é o código-golfe, pois o menor número de bytes possível é a resposta!
- A resposta do vencedor será aceita no domingo 15.11.2015 20: 00-22: 00 (horário da Finlândia) (se não estiver errado, essa data será escrita como 15 de outubro de 2015 nos EUA, não se confunda).
Feliz golfe!
Respostas:
Seriamente , 11 bytes
Uma porta da minha resposta TI-BASIC. Calcula
mean(X)+i*(X-mean(X))
.Explicação:
Entrada como uma lista de dois números complexos:
[1-1j,4+2j]
e saída no mesmo formato:[(4-1j), (1+2j)]
.fonte
æ
a média da lista e causouî
a vetorização (multiplicar por i), permitindo uma solução não concorrente de 9 bytes. Sério está começando a se tornar uma linguagem muito boa.Σ
2 bytes?Σ
tem o ponto de código 0xF4.Sério , 25 bytes
,i││-++½)+-+½)++-½)±+++½)
Toma entrada como uma lista:
[x1,y1,x2,y2]
A mesma estratégia da minha resposta em Python, mas em sério!
Explicação:
Experimente online
fonte
TI-BASIC, 16 bytes
Para uma calculadora da série TI-83 + ou 84+.
A menos que eu tenha entendido mal, a OP disse que eles estavam bem em aceitar entrada e saída como números complexos. A
i
aqui é a unidade imaginária, não a variável estatística.O TI-BASIC tem uma
mean(
função, mas irritantemente não funciona com listas complexas, lançando umERR:DATA TYPE
.Insira o formulário
{1-i,4+2i}
para[[1,-1],[4,2]]
. A saída está no formato{4-i 1+2i}
para[[1,2][4,-1]]
.fonte
Matlab,
5145464542 bytesAgora a entrada é esperada em um vetor de coluna:
[x0;y0;x1;y1]
(saída no mesmo formato) Eu apenas a modifiquei para ser um programa completo.Ou alternativamente
Solução antiga:
A entrada espera vetores de coluna, por exemplo
f([0;0],[3;3])
Ele também retorna dois vetores de coluna (como uma matriz 2x2).
fonte
Japonês,
2928 bytesJapt é uma versão abreviada do Ja vaScri pt . Intérprete
Observe que as funções de seta exigem um navegador compatível com ES6, como as versões mais recentes do Firefox. A entrada entra como uma matriz de 4 itens, por exemplo
[1,-1,4,2]
.Como funciona
Como foi jogado
Primeiro tentei simplesmente copiar a abordagem Python do @ Mego. Isso me deixou com esse monstro de 48 bytes:
(Nota: a entrada atualmente não deve ser agrupada em uma matriz).
Como cada um desses itens precisa ser dividido por 2, é mais curto mapear toda a matriz com
mY=>Y/2
:O que agora? Bem, a matriz agora está simplesmente adicionando três das entradas e subtraindo a quarta, seguindo o padrão
1,2,3,0
. Assim, poderíamos agrupar as entradas em uma matriz, depois adicioná-las, dividir por 2 e subtrair o item necessário:Bom, salvou um byte! Mas é possível reduzir a matriz no início? Vamos tentar empacotá-lo em uma string e dividi-lo novamente em uma matriz com
a
:Olhe para isso, outro byte salvo. Mas existe uma maneira ainda melhor? Bem, podemos usar o fato de que
[1,2,3,0] ≡ [1,2,3,4] mod 4
:Mais dois bytes! Agora vamos a algum lugar. Mas isso
Ug0 +Ug1 +Ug2 +Ug3
está sobrecarregando muito espaço. E se reduzirmos a matriz com adição?Uau, isso realmente ajudou! Agora estamos com 29 bytes. E, graças a @ ɟ nɟuɐɯɹɐ ɯ o I, eu consegui tirar outro byte da redução. Mas se pudéssemos usar um built-in para somar a matriz, seria muito menor:
19 bytes! Surpreendente! Infelizmente, o Japt ainda não possui nenhum desses embutidos. Vou adicionar isso quando tiver uma chance. Sugestões são bem-vindas, tanto para o programa quanto para o idioma!
Bem, a partir da v1.4.4, implementei muito mais recursos no Japt do que havia planejado originalmente. Começando com o plano original para a versão mais curta:
Primeiro, precisamos mudar algumas coisas: as funções são definidas com
{
e a função soma éx
. Esta versão funciona como está:Agora,
@
é uma abreviação deXYZ{
, permitindo salvar um byte alternando deZ
paraX
. Além disso,£
é um atalho param@
salvar outro byte:Recentemente, implementei um recurso em que um
U
no início do programa geralmente pode ser deixado de fora. Devido a um erro de implementação, no entanto, isso também funciona com funções:Por fim, a
g
função agora envolve se o índice já passou do final da sequência, permitindo remover o%4
total de 13 bytes :E eu achei 19 incríveis ;-) Teste on-line!
fonte
eval(U.join`+`)
.eval
equivalente ainda, isso economiza um byte!Javascript (Node.js / ES6), 154 bytes
Obter stdin é a parte mais longa do código. A entrada deve ser os pontos separados por vírgula:
fonte
ngn APL, 21 bytes
Isso recebe a entrada como um par de números complexos (por exemplo,
1J¯1 4J2
) e imprime a saída da mesma maneira (por exemplo,4J¯1 1J2
). Experimente online na demonstração ngn / apl .fonte
1 ¯1
para entrada0J¯1 0J1
, que é a resposta correta. O que você está recebendo?Pitão, 12 bytes
Isso recebe a entrada como um par de números complexos (por exemplo,
1-1j, 4+2j
) e imprime a saída como uma matriz (por exemplo,[(4-1j), (1+2j)]
). Experimente online.fonte
, 29 caracteres / 43 bytes
Try it here (Firefox only).
fonte
CJam, 30 bytes
Experimente online
Isso leva a entrada como uma lista de listas, por exemplo, para o último exemplo:
Explicação:
fonte
Prolog, 118 bytes
Um pouco mais legível:
Para iniciar o programa:
Exemplo de entrada quando os cantos conhecidos são [1, -1] [4, 2]:
[1, -1,4,2]
Exemplo de saída, onde X e Y conterão os cantos desconhecidos:
X = [1.0, 2.0],
Y = [4.0, -1.0]
Experimente aqui online
Edit: Alterado para ler as entradas de STDIN
fonte
Python 3, 102 bytes
A entrada é obtida no formulário
x1 y1 x2 y2
, em uma única linha.Experimente online
fonte
Python 2, 56 bytes
A entrada pode ser
x1,y1,x2,y2
ou(x1,y1,x2,y2)
fonte