Você pode ou não se lembrar do Xeyes, um programa de demonstração que acompanha (e, até onde eu sei, ainda acompanha) o sistema X window. Seu objetivo era desenhar um par de olhos que seguiam o cursor do mouse:
Seu desafio é recriar Xeyes com arte ASCII. Escreva um programa ou função que desenhe dois olhos artísticos ASCII (especificados abaixo) onde o usuário clica e depois move as pupilas para apontar na direção do cursor.
O GIF acima é uma gravação dessa implementação Ruby sem golf , que pode ser executada com qualquer versão recente do Ruby. Você também pode achar útil como referência para seqüências de controle do Xterm.
Especificações
Isso é código-golfe , então a solução com o menor número de bytes vence.
Este é um ascii-art desafio, assim que seu programa deve desenhar usando caracteres ASCII, especificamente, os personagens -
, .
, |
, '
, 0
, espaço, e de nova linha. 1 2
Este é um desafio interativo , portanto, seu programa deve aceitar entradas e extrair suas saídas em tempo real. 3
Antes de seu programa começar a aceitar entrada, ele deve inicializar uma tela em branco de pelo menos 20 linhas e 20 colunas. Não deve desenhar nada até o usuário clicar na tela.
Sempre que o usuário clicar em 4 na tela, o programa deverá limpar qualquer saída anterior e, em seguida, desenhar esses olhos ASCII na tela, centralizados no caractere mais próximo da localização do cursor do mouse. 5 6 (Abaixo, ✧
representa o cursor do mouse e não deve ser desenhado.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Observe como as pupilas "apontam" em direção ao cursor.
Sempre que o cursor do mouse se move sobre a tela, o programa deve redesenhar os alunos para que continuem apontando em direção ao cursor, 7 por exemplo:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Aluno apontando
Suponha que enumeremos as posições dos nove caracteres internos de cada olho da seguinte maneira:
.---.
|678|
|591|
|432|
'---'
O aluno será sorteado em um dos locais 1
- 9
. Para decidir qual, finja que os caracteres são quadrados e que a tela é uma grade cartesiana, com o centro do 9
caractere em (0, 0), o centro de 1
em (1, 0) e assim por diante. Quando o programa recebe entrada - um clique ou movimento - ele deve mapear o local de entrada para a coordenada da grade mais próxima 𝑀. Se 𝑀 for (0, 0), o aluno deve ser desenhado em (0, 0), ou seja, o local 9
acima. Caso contrário, ele deve ser desenhado conforme descrito abaixo.
Imagine um plano cartesiano sobreposta no grid e dividido em oitantes numerada 1 - 8 :
Se 𝑀 estiver dentro de 1 de outubro , então a pupila deve ser desenhada no local 1
acima, ou seja, em (1, 0). Se 𝑀 estiver em 2 de outubro, ele deve ser desenhado em 2
- e assim por diante. Para ilustrar, a imagem abaixo mostra parte da grade codificada por cores de acordo com o local em que a pupila deve ser desenhada quando o cursor do mouse estiver em um local específico. Quando, por exemplo, o cursor estiver em qualquer uma das coordenadas verdes (lembrando que as coordenadas da grade estão no centro dos quadrados, não nos cantos), o aluno deve ser desenhado 4
.
As pupilas dos dois olhos se movem independentemente, portanto, para cada olho, repita o processo com 𝑀 em relação ao centro desse olho.
Notas
Este não é um desafio de saída gráfica . A saída deve ser uma grade de caracteres. Obviamente, você pode usar rotinas gráficas para desenhar uma grade de caracteres.
O espaço em branco pode ser desenhado (ou melhor, não desenhado), no entanto, é conveniente. Um ponto vazio na grade é igual a um caractere de espaço e será considerado equivalente.
"Tempo real" é definido aqui como menos de 200ms entre a entrada e a saída correspondente que está sendo desenhada.
É a seu critério quais botões do mouse são observados para entrada e se uma pressão ou liberação constitui um "clique".
A tela deve ser limpa ou o equivalente visual deve ser alcançado. Com uma solução baseada em terminal, por exemplo, imprimir uma nova tela abaixo da tela anterior não é considerado equivalente.
Quando o usuário clica perto da borda da tela, de modo que alguns dos caracteres oculares sejam desenhados além da borda, o comportamento é indefinido. No entanto, o programa deve continuar sendo executado normalmente nos cliques subsequentes.
Quando o cursor do mouse sai da "tela", o comportamento é indefinido, mas o programa deve continuar sendo executado normalmente quando o cursor entra novamente na tela.
Um cursor de texto pode aparecer na tela, desde que não oculte a saída.
As brechas padrão são proibidas.
fonte
<pre>
oufont-family:monospace
).Respostas:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 bytesfonte
X||Y
podem ser jogadosX|Y
para economizar 2 bytes.|
acaba tendo precedência sobre a expressão ternária.|
e||
de certa forma no mesmo nível, e ambos acima?:
. AmbosX||Y?w*r(cos(a)):0
eX||Y?h*r(sin(a)):0
estão atualmente no formulárioboolean_condition?A:B
. Portanto, quando você mudarX||Y
paraX|Y
ele, fará um OR bit a bit e depois interpretará como uma condição booleana novamente. ((X||Y)?A:B
vs(X|Y)?A:B
, nãoX|(Y?A:B)
). Além disso, não vejo diferença quando uso "Copiar snippet para responder" e altero||
para|
. Tudo ainda funciona exatamente da mesma, tanto quanto eu posso dizer ..Excel VBA, 630 bytes
Sub-rotina de planilha declarada que é executada com o clique do mouse, sem nenhuma entrada e produz um par de olhos que seguem o cursor. Isso depende da função auxiliar incluída e da declaração de tipo, que deve ser colocada em um módulo normal.
Esta versão é calibrada para executar com o zoom padrão de 100%. Quebra se você tentar rolar.
Função auxiliar e declaração de tipo
Sem Golfe e Comentado
Esta versão é calibrada para ser executada com um nível de zoom de 400%.
Função auxiliar e declaração de tipo
Saída
Gif
Imagem de maior resolução
fonte
'
caractere mais à direita , a saída será diferente de quando estiver no'
caractere mais à esquerda . 2. A posição dos olhos não é fixa. Um clique do mouse deve fazer com que eles se movam para a posição clicada. Sou flexível no método de entrada (eu aceitaria, digamos, um cursor virtual do mouse controlado pelas teclas de seta), mas há dois eventos de entrada distintos com comportamento distinto: movimento do mouse e clique do mouse.Worksheet_SelectionChange
evento e passar no intervalo de chamada (Target
ouT
neste caso) - que redesenha os olhos e um*
na chamada célulaQBasic ( QB64 ),
361305 bytesClique esquerdo coloca os olhos. Se a colocação dos olhos resultar em parte fora dos limites, o programa "congela" até que uma colocação válida seja feita.
A principal parte complicada é colocar os alunos. Na maioria das vezes, as coordenadas da pupila são apenas o centro do olho mais (sinal (Δx), sinal (Δy)), exceto que nos octantes 1 e 5, a coordenada y é igual ao centro y e nos octantes 3 e 7, a coordenada x é igual ao centro x. Os limites dos octantes podem ser calculados usando a inclinação
m
da linha do centro do olho até as coordenadas do mouse. Convenientemente, dividir por zero ao calcular a inclinação gera infinito de ponto flutuante (+/-) em vez de um erro.Ungolfed
fonte
?0
vez de?"0"
? Isso sugere que você pode usar uma expressão numérica e seqüências de caracteres."| |"
. Portanto, provavelmente não salvaria nada."0"
tem apenas 2 bytes a mais.Código da máquina 6502 ( mouse C64 + 1351 ), 630 bytes
Em ação:
Não há demonstração on-line , desculpe, porque não há emulador AFAIK sem js C64 suportando um mouse. Se você quiser experimentar, pegue o VICE , baixe o executável binário e inicie-o no emulador C64:
Para pegar / desagrupar a entrada do mouse no emulador em execução, use
ctrl+m
no Unix / Linux ectrl+q
no Windows.Sim, isso tinha que ser feito;) Afinal, não é um rato Commodore original para o C64, mas é claro, o sistema operacional embutido não apoiá-lo, então eu precisava primeiro um driver de mouse, que já levou 230 bytes ( incluindo um sprite de hardware em forma de cursor do mouse e limites de verificação de código para a área da tela, mas sem converter as coordenadas do ponteiro em coordenadas da tela de texto).
Se você estiver interessado, pode ler o código como fonte de montagem aqui :)
fonte
Limpo ,
1014904892884840814782772769 bytes-6 bytes se os olhos não precisarem se encaixar em uma grade
Isso não foi fácil. UIs em idiomas funcionais raramente são.
Certifique-se de usar o iTasks Clean, ter a
Courier
fonte instalada eStdLib
ANTES de qualquer subpastaObjectIO
no caminho de pesquisa do módulo.Compile com (por exemplo, pode ser diferente):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Se você nunca executou o Clean antes, espere que este projeto leve mais de 5 minutos para ser compilado.
Ungolfed:
Como você pode ver na versão simplificada, a maior parte do código está apenas configurando a combinação de "fonte monoespaçada" com "responder ao mouse". E mesmo que
Courier
não torná-lo fácil de dizer, é realmente desenhar as.
s e'
s. Trocar para algo assimConsolas
torna mais claro.fonte
(abs m)<9&&(abs n)<w='9'
para(abs m)<9&(abs n)<w='9'
? Além disso, sugiro adicionar uma tela para gif em vez de captura de tela.Ruby, 335 + 13 = 348 bytes
+13 bytes para
-rio/console
ativar o sinalizadorIO#getch
.Contém caracteres literais ESC (
0x1b
), mostrados␛
abaixo. O despejo xxd segue.Cuidado: Isso não se limpa na saída. Veja a nota em xxd dump abaixo.
Ungolfed
Este é um campo bastante ingênuo da minha implementação original do Ruby .
despejo xxd
Este programa ativa o rastreamento do mouse com a sequência de controle xterm,
\e[?1003h
mas não o desativa na saída. Para desligá-lo, use a sequência de controle\e[?1003l
, por exemplo:Como o programa consome toda a entrada, é difícil sair. Se você deseja sair pressionando Ctrl + C, adicione a seguinte linha abaixo
(s<<STDIN.getch
:Sem mais delongas:
fonte