Quem não gosta de filmes de ação com carros velozes e barulhentos, especialmente aqueles com muitos acidentes? Quem não ama cenas de ação na arte ascii?
A cena é:
Dois carros estão começando em lados opostos de uma estrada reta (com 60 espaços no meio). Eles começam a dirigir um para o outro em velocidades constantes. O carro à esquerda dirige a 1 espaço por segundo e o carro à direita dirige a 2 espaços por segundo.
Obviamente, os carros não podem passar um pelo outro, então n ≥ 20
, a cena será dois carros batidos com capotas na posição em que o acidente ocorreu.
Como amante de filmes, quero pausar a cena de vez em quando, apenas para apreciar a beleza dela.
Dado um número inteiro n
(argumento da função ou STDIN), representando o número de segundos desde o início da cena, mostre a cena naquele momento.
Esta é a cena inicial, com 60 espaços entre as rodas dianteiras:
__ __
_/ \_ _/ \_
o o o o
esta é a cena após 11 segundos:
__ __
_/ \_ _/ \_
o o o o
e é assim que parece após o acidente (observe que as capotas estão abertas após o acidente):
__ __
_/ \/\/ \_
o oo o
Eu só estou interessado em assistir dois carros batendo, então espaços, novas linhas ++ não importam.
Este é o código golf, portanto o código mais curto em bytes vence. As respostas adicionadas mais tarde ainda podem vencer se forem mais curtas que a resposta atualmente aceita.
/ \
e não diminuem_ _
?Respostas:
CJam,
6866 bytesExperimente online
Quem vê o início do código terá certeza
liKe
disso!Explicação:
fonte
Labirinto ,
394386 bytesEu orgulhosamente apresento ...
... meu novo labirinto esolang bidimensional! O código acima não é incrivelmente bom (existem 161 espaços e 25 NOPs, portanto, um layout melhor pode reduzir muito isso), mas pelo menos eu consegui mostrar que o idioma é utilizável para tarefas não triviais. :)
Como funciona
Primeiro, uma rápida visão geral do idioma:
"
é um NOP que não é uma parede e pode ser útil para preencher determinados caminhos no código. Ao contrário de muitas outras linguagens 2D, as bordas não se enrolam.@
finaliza o programa.>v<^
que deslocam uma linha ou coluna do código fonte ciclicamente por uma célula. A linha ou coluna afetada depende da parte superior da pilha. Se a própria linha ou coluna do IP for alterada, ela se moverá com a mudança. Isso torna possível pular de uma borda do código fonte para a outra.Agora, para este desafio em particular, aqui está a ideia geral do algoritmo:
/ \_o oo o
) na pilha auxiliar.__
ou a/\
seguir.__ __ _/ \
dois espaços à esquerda) na pilha auxiliar.20
, vamos chamar isso de N .Por fim, vejamos algumas partes do código. O IP inicia no canto superior esquerdo, em um comando de mudança de grade. A parte superior da pilha principal é
0
(que é usada como um índice relativo); portanto, a primeira linha é deslocada para a esquerda, o que também move o IP para a extremidade direita da grade. Agora, a primeira linha é simplesmente executada da direita para a esquerda, o que coloca o primeiro conjunto de caracteres fixos na pilha auxiliar:Essa mudança de linha é útil para jogar golfe quando você deseja iniciar com uma grande quantidade de código linear.
Em seguida, lemos a entrada e pressionamos os capôs corretos:
O bit à esquerda com os três NOPs envia resultados negativos ao longo do ramo superior e não negativos ao longo do ramo inferior. À direita, eles se juntam novamente.
Agora segue outra seção linear grande (que provavelmente poderia ser muito jogada com outro truque de mudança de linha):
Isso empurra o restante dos carros para a pilha auxiliar.
Em seguida, computamos
min(20, input)
, que é semelhante ao primeiro ramo:Finalmente, temos o loop que é executado três vezes para imprimir as linhas. Cada iteração do loop contém dois pequenos loops (3x3) para imprimir os espaços, bem como duas seções para imprimir 6 caracteres da pilha auxiliar:
Um truque bacana que eu gostaria de chamar a atenção é o
.{.{.
da borda direita. Esse é um beco sem saída, portanto, além do.
final, o código é executado duas vezes, uma para frente e outra para trás. Isso fornece uma maneira clara de reduzir o código palindrômico (o problema é que você precisa garantir que o IP tome a curva correta ao sair do beco sem saída novamente).fonte
Python 2.7,
167164159 bytesIsso leva a entrada de stdin.
Demonstração aqui
Testando isso -
fonte
(n,20)[n>20]
é simplesmentemin(n,20)
.(' \_',' \/')[s<1]
por' \\\\_/'[s<1::2]
.l
necessário? Você poderia simplesmente fazerfor e in [' _',"_/ ","o "]:
e removerl
completamente?l
não é necessário agora. Eu tive que usá-lo em uma versão anterior. Obrigado :)R, 191 bytes
Tão bom quanto eu posso conseguir agora. Leva os segundos de STDIN e gatos para STDOUT.
Explicação
Testes
fonte
formals()
. :)CJam, 120 bytes
Demo
Ungolfed:
Demo
fonte
J
tem o valor 19, oK
valor 20, salvando um caractere para cada constante. Se você precisar de uma matriz com um elemento, poderá usar oa
operador para agrupar o elemento, em vez de usar um par de colchetes.PHP,
160155 bytesO código é exibido aqui em 3 linhas para ajustar o layout da caixa de código. Essas novas linhas não são necessárias.
O código não destruído:
Obtém o número de segundos da linha de comando (primeiro argumento):
A opção CLI do PHP
-d error_reporting=0
é necessária para ocultar alguns avisos que o PHP exibe sobre constantes indefinidas (str_repeat
,_
) que ele converte em strings (2 bytes salvos para cada aviso).Um byte adicional pode ser salvo no PHP 7 pressionando a inicialização
$f
no seu primeiro uso ($m=($f=str_repeat)(...)
); não compila no PHP 5.O caso de teste e algumas das técnicas usadas para reduzir o código podem ser encontradas no github .
Atualizar:
@ ismail-miguel reduziu a inicialização
$left
e incluiu$c
os argumentos deecho
salvar 4 bytes (veja o comentário abaixo).Ao trocar a ordem das variáveis
$m
es
são inicializadas, me livrei de um par de parênteses e economizei 1 byte a mais.fonte
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
em uma variável, mas obtive o mesmo comprimento ou pior.\n
por novas linhas reais. Eu esqueci sobre isto. E conta como 1 byte cadaJavaScript (ES6), 121 bytes
Usando a sequência de modelo, as duas novas linhas dentro da sequência são significativas e contadas.
Para salvar bytes, imprima com
alert
, mesmo que a fonte proporcional usadaalert
não seja adequada para a arte ASCII e o resultado seja feio para n> = 20 (falha).Teste a execução do snippet no FireFox
fonte
Python 2, 148 bytes
Isso usa códigos de escape ANSI para posicionar o cursor no lugar certo para desenhar os carros. Em seguida, verifica se a entrada foi 20, se foi, volta e usa as capotas do carro.
Retorna um int de stdin, output para stdout.
Ungolfed:
fonte
Pitão, 67 bytes
Experimente aqui .
fonte
C,
180191168 bytesungolfed:
programa de teste:
saída:
Eu era capaz de jogar golfe com bastante força. Eu acho que comecei com quase 300 bytes.
Mas não sei se isso ainda cumpre todos os requisitos. Como você pode ver após 21 segundos, o primeiro carro empurra o segundo carro para a direita. Eu precisaria adicionar alguns bytes se isso não for permitido.Edit: corrigido. Isso deve ser mais realista do que Sharknado ;-)
Editar: eu poderia reduzir significativamente minha solução dando uma segunda olhada na
printf
página de manual. Se você usar '*', poderá fornecer o comprimento do campo diretamente para printf, sem a necessidade de criarsprintf
previamente uma string de formato .fonte
> <> ,
538276 bytesEu perdi muito o tamanho, estou surpreso por ter conseguido diminuir o tamanho pela metade. O antigo está abaixo. Este não é tão eficiente quanto ao desempenho devido à largura da grade, principalmente da primeira linha.
Você pode testá-lo aqui . Coloque a quantidade de tempo passada na "Pilha Inicial", não na "Entrada"!
Aqui está a versão antiga.
fonte
Java, 258 caracteres
Un-Golfed
Resultados
fonte
Python 2, 102 bytes
Bem direto. Para cada linha do carro, imprimimos
n
espaços, essa linha,60-3*n
espaços e a linha novamente. Para parar os carros, em vez de fazermin(n,20)
, era um caractere mais curto para limitar a primeira corrida de espaços com[:20]
, e o segundo é bom porque um número negativo de vezes que uma sequência é a sequência vazia.Para subir as defesas, nós apenas fazemos a
replace
. Como__
também aparece no telhado, precisamos de um pouco de contexto para identificar os pára-lamas, portanto, verificamos o/
seguinte.fonte
Java,
270267 bytesTenho certeza de que há uma maneira melhor / mais curta de fazer isso, mas meu cérebro não está devidamente envolvido.
Para n = 19:
Para n = 20:
Ungolfed
fonte
PHP 7, 140 bytes
Uso:
Salve como ANSI em
file.php
(deve haver caracteres de largura zero$o
) e execute:com
x
o número de segundos.E uma versão que funciona sem alterar o relatório de erros ( 148 bytes ):
fonte
Javascript, 193 bytes
Não é um vencedor, mas é algo
http://jsfiddle.net/yb703y0p/2/
fonte