Descrição da tarefa:
Escreva um programa o mais curto possível para desenhar um gradiente radial na arte ASCII. O tamanho da grade de saída é predefinido. O ponto central e os caracteres a serem usados para o gradiente são fornecidos como entrada para o programa.
O gradiente terá células de 70 × 25 caracteres com as seguintes especificações
- O canto superior esquerdo da grade possui as coordenadas (0, 0).
- O gradiente, composto pelos caracteres fornecidos, é mapeado em 35 unidades de comprimento . Uma unidade de comprimento tem um caractere de altura e dois caracteres de largura (já que
monospaced fonts
geralmente têm caracteres duas vezes mais altos do que eles). - Dentro dessas 35 LU, a distância atual do ponto central é multiplicada pelo número de caracteres de gradiente / 35 para obter o índice do caractere para desenhar nesse ponto. Números fracionários para o índice são arredondados para zero aqui. As unidades de comprimento devem ser deixadas como um número real. (Obviamente, se os resultados forem os mesmos, a implementação não importa.)
- Além desses 35 LU, apenas o último caractere de gradiente aparece. No entanto, como o último gradiente »band« já começa dentro da LU 35, o último caractere começa a aparecer com menos de 35 LU.
Entrada:
A entrada é fornecida na entrada padrão e consiste em três linhas, cada uma terminada por uma quebra de linha:
- A coordenada x do ponto central do gradiente
- A coordenada y do ponto central do gradiente
- Os caracteres a serem usados para desenhar o gradiente. Esses podem incluir espaços.
Saída:
Saída é o gradiente conforme definido pelas regras acima na saída padrão. O fluxo de erro padrão é ignorado. Cada linha do gradiente é finalizada por uma quebra de linha. Nenhum outro caractere, exceto aqueles definidos pela entrada, pode ocorrer.
Entrada de amostra 1:
58
14
.:;+=xX$&
Saída de amostra 1:
&&$$$$$$$$XXXXXXXXxxxxxxxxx===========++++++++++++++++++++++++++++++++
&$$$$$$$$XXXXXXXXxxxxxxxxx=========+++++++++++++;;;;;;;;;;;;;;;;;;;;;+
$$$$$$$$XXXXXXXXxxxxxxxx=========+++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$$XXXXXXXXxxxxxxxx========++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::....... .....
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;:::::::........ ......
$$$XXXXXXXxxxxxxx=======+++++++;;;;;;;::::::::......... ........
$$$XXXXXXXxxxxxxx=======++++++++;;;;;;;::::::::.......................
$$$XXXXXXXXxxxxxxx=======+++++++;;;;;;;;:::::::::...................::
$$$$XXXXXXXxxxxxxx========+++++++;;;;;;;;::::::::::...............::::
$$$$XXXXXXXXxxxxxxx=======++++++++;;;;;;;;;:::::::::::::::::::::::::::
$$$$$XXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;:::::::::::::::::::::::::
$$$$$XXXXXXXXxxxxxxxx=======+++++++++;;;;;;;;;;;:::::::::::::::::::::;
$$$$$$XXXXXXXXxxxxxxxx========+++++++++;;;;;;;;;;;;;:::::::::::::;;;;;
Entrada de amostra 2:
0
0
X.X.X.X
Saída de amostra 2:
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXXXX............XXXXXXXXXX..........XXXXXXXXXX..........XXXXXXXXXX
XXXXXX.............XXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXX
..................XXXXXXXXXXX..........XXXXXXXXXX...........XXXXXXXXXX
................XXXXXXXXXXXX...........XXXXXXXXXX..........XXXXXXXXXXX
...............XXXXXXXXXXXX...........XXXXXXXXXX...........XXXXXXXXXXX
............XXXXXXXXXXXXXX...........XXXXXXXXXXX..........XXXXXXXXXXXX
.........XXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXX...........XXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXX...........XXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXX...........XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX................XXXXXXXXXXXX............XXXXXXXXXXXXXXX
XXXXXXXXXXX..................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXX
...........................XXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXX
........................XXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXX
......................XXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXX
..................XXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXX
.............XXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX.................XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Entrada de amostra 3:
70
25
.:+#
Saída de amostra 3:
######################################################++++++++++++++++
#################################################+++++++++++++++++++++
#############################################+++++++++++++++++++++++++
##########################################++++++++++++++++++++++++++++
#######################################+++++++++++++++++++++++++++++++
####################################++++++++++++++++++++++++++++++++++
##################################++++++++++++++++++++++++++++++++++++
################################++++++++++++++++++++++++++++++++++++++
##############################++++++++++++++++++++++++++++++++::::::::
#############################+++++++++++++++++++++++++++::::::::::::::
###########################+++++++++++++++++++++++++::::::::::::::::::
##########################++++++++++++++++++++++++::::::::::::::::::::
#########################++++++++++++++++++++++:::::::::::::::::::::::
########################+++++++++++++++++++++:::::::::::::::::::::::::
#######################++++++++++++++++++++:::::::::::::::::::::::::::
######################++++++++++++++++++++::::::::::::::::::::::::::::
#####################+++++++++++++++++++::::::::::::::::::::::::::::::
####################+++++++++++++++++++::::::::::::::::::::::::.......
####################++++++++++++++++++::::::::::::::::::::::..........
###################+++++++++++++++++++::::::::::::::::::::............
###################++++++++++++++++++:::::::::::::::::::..............
###################+++++++++++++++++:::::::::::::::::::...............
##################++++++++++++++++++::::::::::::::::::................
##################++++++++++++++++++:::::::::::::::::.................
##################++++++++++++++++++:::::::::::::::::.................
Entrada de amostra 4
59
1
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>|,.-#+!$%&/()=?*'_:;
Saída de amostra 4
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCAzyxwutsrqonmljihgfdcba abcdfghijl
!+#-,|><87654210ZYWVUTRQPONLKJIHFEDCBzyxwutsrqonmlkjhgfedcbbbcdefghjkl
!+#-,|><97654310ZYXVUTSQPONMKJIHGEDCBAyxwvutrqponmkjihgffeedeeffghijkm
$+#-.|><98654320ZYXWUTSRQONMLKIHGFEDBAzyxwutsrqponmlkjihhggggghhijklmn
$!#-.,|<987643210YXWVUSRQPONLKJIHGEDCBAzywvutsrqponmllkjjjiiijjjkllmno
$!+#.,|><87654210ZYXVUTSRQONMLKJHGFEDCBAzywvutsrrqponnmmlllllllmmnnopq
%!+#-.|><987543210YXWVUTRQPONMLJIHGFEDCBAzyxwvutsrrqppooonnnnnoooppqrr
%$!+-.,|><87654310ZYXWVTSRQPONMLJIHGFEDCBAzyxxwvuttssrrqqqqqqqqqrrsstt
&%!+#-.,><987643210ZYXVUTSRQPONMLKJIHGFEDCBAzyyxwvvuutttssssssstttuuvv
&%$!+#.,|><986543210ZYWVUTSRQPONMLKJIHGFEDDCBAzzyyxwwwvvvuuuuuvvvwwwxy
/&%$!#-.,|><976543210ZYXVUTSRQPONMLKKJIHGFEEDCBBAAzzyyyxxxxxxxxxyyyzzA
(/&%!+#-.,|><876543210ZYXWVUTSRQPONMLKJJIHGGFEEDCCBBBAAAzzzzzzzAAABBBC
)(/%$!+#-.,|><876543210ZYXWVUTSRQPPONMLKKJIIHGGFFEEDDDCCCCCCCCCCCDDDEE
=)(&%$!+#-.,|><986543210ZYYXWVUTSRQPPONMMLKKJIIHHGGGFFFEEEEEEEEEFFFGGG
?=)(&%$!+#-.,|><9876543210ZYXWVVUTSRRQPOONMMLLKJJJIIIHHHHHHHHHHHHHIIIJ
*?=)(/%$!+#-.,|><98765432210ZYXWWVUTSSRQQPOONNMMLLLKKKJJJJJJJJJJJKKKLL
'*?=)(/&%$!+#-.,|><98765432110ZYXXWVUUTSSRRQPPOOONNNMMMMMLLLLLMMMMMNNN
_'*?=)(/&%$!+#-.,|><988765432210ZYYXWWVUUTTSSRRQQQPPPOOOOOOOOOOOOOPPPQ
:_'*?=)(/&%$!+##-.,|><9877654332100ZYYXXWVVUUTTTSSSRRRRQQQQQQQQQRRRRSS
;;:_'*?=)(/&%$!+#-.,,|><98876554322100ZZYYXXWWVVVUUUTTTTTTTTTTTTTTTUUU
;;;:_'*?=)(/&&%$!+#-.,,|><9987665443321100ZZYYYXXXWWWWVVVVVVVVVVVWWWWX
;;;;;:_'*?=)(/&%$$!+#-..,|>><9887665544322211000ZZZYYYYYYYYYYYYYYYYYZZ
;;;;;;:_'*??=)(/&%%$!+##-.,,|><<99877665544333222111100000000000001111
;;;;;;;;:_'*?==)(/&&%$!++#--.,,|>><<9887766655544433333322222223333334
Uma semana se passou. É hora de desvendar os comprimentos da solução do concurso da nossa universidade:
167 - Python
189 - Haskell
203 - C
210 - VB.NET
219 - C
E nossas próprias soluções:
91 - GolfScript
125 - Ruby
157 - PowerShell
Respostas:
Ruby 1.9,
116 114 108101 caracteresfonte
Brainfuck - 1286
Esta é uma das minhas criações favoritas ainda. Inclui uma função de raiz quadrada funcional (para algumas definições de funcionamento).
A saída está um pouco desativada devido a erros de arredondamento, mas ainda reconhecível. O ponto flutuante está além do meu nível de habilidade atual. Infelizmente, isso funcionará apenas com células de 16 bits, o que significa que o cão ficará lento.
Saída 1:
Saída 2:
fonte
Python - 141 caracteres
fonte
Delphi, 200 (e 185)
Desde que eu gosto de ascii-art aqui uma versão Delphi deste código golf:
Não é muito impressionante em termos de caracteres, pois tive que usar a unidade matemática para vincular a função Min (). Além disso, ReadLn () de alguma forma não lê números inteiros e seqüências de caracteres em uma chamada, o que também é bastante caro. A nova linha também precisa de muitos caracteres. Além disso, o Delphi precisa de muito espaço em branco em torno de suas palavras-chave. Não muito orgulhoso deste.
De qualquer forma, a saída da amostra 4 me fornece:
Se você aceitar uma saída recuada, essa versão será um pouco mais curta, alterando a nova linha para uma recuo que leva a um agrupamento de 80 caracteres (simulando uma nova linha nos consoles 80x25 padrão):
(isso salva 15 caracteres, para um total de 185 caracteres). Sua saída para "0 0 XXXX" é:
(Você pode ver o recuo ?! ;-))
fonte
APL (74)
O motivo pelo qual ele está envolvido em uma função é que a modificação
⎕IO
não se aplica ao restante do sistema.Explicação:
L←⍴⊃C Y X⎕IO←⍞⎕⎕0
: Defina⎕IO
como0
(criando matrizes com base em 0 em vez de com base em 1), defina X como⎕
(leitura de primeira linha), defina Y como⎕
(leitura de segunda linha), defina C como⍞
(leitura de terceira linha, sem formatação) e defina L ao comprimento (⍴
) deC
.25 70
: as dimensões da matriz.¨⍳⍵
: para cada elemento da matriz em que cada elemento tem suas próprias coordenadas ...⍵-Y X
: diferença entre o ponto atual e o ponto central1 2÷⍨
: divida a coordenada X por 2 (porque um caractere tem a metade da largura e a altura).5*⍨+/2*⍨
: pegue a raiz quadrada da soma dos quadrados35÷⍨
: dividir por 35⌊L⌊
: pegue o mínimo da quantidade de caracteres e o valor atual e arredonde-o para baixo,/
: Os valores ainda estão agrupados em uma lista (de apenas um elemento) e isso criará espaçamento na saída, portanto, libere os valores de suas listas.C[
...]
: use o valor que encontramos como índice na lista de caracteres⎕←
: agora temos uma matriz onde cada elemento (x, y) é o caractere para (x, y), portanto, produza a matriz.fonte
Perl 5.10, 103 caracteres
fonte
Perl, 120 caracteres
fonte
abs
está lá por uma razão.$x,$y=<>,<>;
.Windows PowerShell, 157
Nada digno de nota. Já espancado até a morte:
fonte
C, 176
Aqui está uma tradução da minha solução Delphi para C, salvando 24 caracteres:
Você pode testar esse código aqui: http://www.ideone.com/oTvHt
fonte
main()
eu acho e salvar um ponto e vírgula dessa maneira.Lisp comum, 173 caracteres
O único truque real que eu uso aqui é usar
como um caractere de nova linha literal
fonte
scala 223 (204 sem App-Wrapper)
Ter colunas e linhas (70, 25) definidas dinamicamente permitiria gradientes de preenchimento de tela.
fonte
C # 311
Pensei em fazer um longo programa para fazer os outros se sentirem melhor:
A entrada é obtida do console, uma linha por vez (duas linhas para as coordenadas e uma para os caracteres de gradiente).
Obrigado a Joey pelas dicas.
Amostra 1: http://ideone.com/X0jIZ
Amostra 2: http://ideone.com/RvICt
fonte
int
vez defloat
, as expressõesx-i
e passamos ay-j
ser do tipoint
. Devido a isso, o `int Math.Abs (valor int) será chamado em vez do float, levando a alguma perda de precisão. Eu tentei isso e tem arestas Som e: ideone.com/wQcMTint
economizam mais;)). Ah, e*.5
custa apenas um caractere.