Você pode ter ouvido falar do "Hacker Logo", também chamado de "Hacker Emblem". Se parece com isso:
Este é um padrão de uma simulação matemática chamada Jogo da Vida. O planador é o padrão de vida mais simples que se move e o mais instantaneamente reconhecível de todos os padrões de vida.
O desafio
O desafio é bem simples: exiba o logotipo do hacker. Isso é definido como:
- Uma grade 3x3 com uma borda, um fundo branco e linhas de grade cinza.
- Cinco pontos pretos dispostos no padrão de planador GoL.
- Nada mais.
As regras
- Os pontos pretos devem preencher 40% - 80% de suas caixas de grade individuais.
- Você exibirá o emblema com saída gráfica, mas sem arte ASCII .
- A saída deve ter pelo menos 30x30 pixels .
- A saída deve ter apenas as cores cinza, preto e branco .
- Cada caixa de grade na grade terá o mesmo tamanho. A grade será um quadrado 3x3 regular .
- Você não pode retirar o logotipo da Internet ou do seu sistema de arquivos.
- Seu programa exibirá o logotipo em uma tela / janela vazia. Se terminar, deve fazê-lo normalmente.
- Observe que "pontos" não significa necessariamente "círculos". Um "ponto" é uma única forma geométrica centralizada no meio da caixa de grade com uma superfície. Por exemplo, enquanto um círculo ou quadrado se qualificar como ponto, dois triângulos ou um tabuleiro de xadrez não o serão.
O vencedor
Como se trata de código-golfe , a resposta mais curta em cada idioma vence!
Inclua uma captura de tela da saída do seu programa na sua resposta.
Respostas:
Mathematica, 62 bytes
Mathematica, 71 bytes
fonte
Graphics@Disk[]
como argumento.Rasterize@Grid[{{,●,},{,,●},{●,●,●}},Frame->All,FrameStyle->Gray]
. O ● é um caractere unicode de dois bytes. Como não precisa ser estritamente um círculo, talvez algum caractere ASCII possa funcionar para atender aos requisitos de 40% a 80%.Rasterize
ou semelhante para atender aos requisitos degraphical output but no ASCII art
como os símbolos ainda podem ser selecionados na grade como caracteres Unicode.CSS + HTML,
56 + 84 = 140 bytes52 + 84 = 136 bytesEconomizou 4 bytes incorporando sugestões dos comentários.
Isso usa o caractere UTF-8,
•
que tem 2 bytes de comprimento e aproveita a graça da sintaxe HTML.fonte
•
!line-height:.4;
, e outro omitindo o fechamento}
GLSL (fragment shader),
278235256 bytesVeja em ação: http://glslsandbox.com/e#40717.2
fonte
precision highp float;void main(){vec2 a=gl_FragCoord.xy/20.-.2;ivec2 b=ivec2(a);a-=vec2(b)+.5;gl_FragColor=vec4(vec3(a.x<-.5||a.y<-.5||a.x>.3||a.y>.3?.5:length(a+.1)<.4&&(b.x+b.y-3)*b.y==0?.0:1.)*float(b.x<3&&b.y<3),1.);}
Python 2 ,
169140 bytesO tamanho real, 61 por 61, plotado em uma tela muito maior de 300 por 400:
Mostrando a grade de pixels:
Os pontos usam 177 pixels na faixa de 40% a 80%, considerando o preenchimento branco de 19 por 19 (144,4-288,8) ou os 21 por 21, incluindo as duas bordas (176,4-352,8).
Nota: o programa termina e fecha a janela da tela assim que o desenho é concluído, para permitir o fechamento manual da janela acrescentando a linha
done()
.turtle
é um pacote Python desenvolvido para programação gráfica introdutória. Uma caneta começa nox,y=0,0
meio de uma tela de 300 por 400 pixels (por padrão),up
levanta a caneta,goto
move a caneta,shape
define a forma da caneta para uma forma nomeada ("square"
é uma forma predefinida com uma largura de pixel padrão de 21 ),color
define a cor, onde dois parâmetros definem traçado (com a largura padrão 1) e preenchimento; um byte é salvo usando a(r,g,b)
opção tupla para substituir"white"
pelo[1,1,1]
uso da multiplicação de lista[1]*3
. Por fim,dot
desenha um ponto com a largura especificada em pixels e cores. O valor da largura padrão do ponto é muito pequeno para se qualificar, assim como9
eu o tornei estético e qualificado15
. A cor do ponto pode ser"black"
mas a(r,g,b)
tupla descompactada0,0,0
é menor em dois bytes.A caneta deve se afastar de qualquer ponto no final, pois, caso contrário, a caneta cinza / branca oculta o ponto.
A grade é atravessada usando um div (
/
) e mod (%
)i
da partir de8
(i
é inicializado para9
, mas é diminuída no início dowhile
ciclo) e trabalhar até0
, compensando os resultados2,1,0
de-1,0,1
usar(1-...)
e escalar cada um até o tamanho da grade usando um fator 20 (observe que20-i/3*20
na verdade é um byte menor que20*(1-i/3)
, o mesmo vale para%
). Isso produz a ordem [inferior esquerdo, central esquerdo, superior esquerdo, inferior central, centro médio, superior médio, inferior direito, centro direito, superior direito] e requer uma "hasDot
" avaliação de[1,0,0,1,0,1,1,1,0]
, que é302
em binário assim pode ser acedida através da inspecção doi
th potência de dois componente de302
com o uso de um bit a bit - e302&2**i
,.fonte
turtle
.Applesoft BASIC ,
479476516515483482 bytes-32 usando nomes de variáveis ilegíveis: P
-1 porque a Apple decidiu ser mágica e deixe-me usar um GOTO implícito / inexistente
Aqui está o meu próprio programa (muito atualizável) para um exemplo de saída que não usa círculos:
Resultado:
fonte
Código de máquina IA-32,
8180 bytesHexdump:
É uma
fastcall
função chamadadoit
que retorna a imagem no formato PGM no buffer fornecido. Uso:Resultado:
Usei a resolução 256x256 porque
é legal,pois permite dividir o índice do pixelecx
automaticamente em coordenadasy
dentroch
ex
dentrocl
. Além disso, o formato de arquivo PGM requer o número 255 no cabeçalho da imagem.Os quadrados internos são 54x54 (41% da célula por área).
Código fonte (pode ser compilado pelo Visual Studio):
O padrão celular
pode ser representado por um bitmap "otimizado" de 7 bits.
Os bits são indexados pela expressão
y * 2 + x
, onde(x,y)
é o local da célula. Essa expressão fornece o mesmo índice para 2 pares de células. É uma coincidência de sorte que os valores de bits sejam os mesmos.fonte
42*42/85/85
ganho apenas 24,4%.HTML e CSS, 155 bytes
Acontece que o HTML realmente perdoa os erros de sintaxe.
1 byte salvo graças a @Octopus · 1 byte salvo graças a @Downgoat · 2 bytes salvos graças a @StephenS
2 bytes salvos graças a @Ryan · 3 bytes salvos graças a @styfle · 4 bytes salvos graças a @Ferrybig
13 bytes salvos graças a @SteveBennett
fonte
R (
130119113 bytes)fonte
axes=F
para substituirxaxt="n",yaxt="n"
. Se você dobrar todos os valores de coordenadas, economiza 4 bytes líquidos (mas não pode usar o1:3,2:3
truque).;box()
comoaxes=F
também remove o quadro. Além disso, comoaxes
é umplot
parâmetro e não repassados aospar
através...
comoxaxt
/yaxt
, ele não precisa mesmo de ser escrito completamente.c(1,7)
por uma variável (l=c(1,7)
); (2) substituindoann
poran
; (3) substituindo[xy]li
por[xy]li
; e (4) remoção do segundo argumento, redundante agrid
:grid(3,lt=1)
. De fato, tomei a liberdade de editar isso em (em revisão).Python 2.7,
214311309 bytesEsta é minha primeira tentativa aqui no código golf, por isso tenho certeza de que isso pode ser melhorado. Eu gostaria de não estabelecer os limites, mas parece que o matplotlib não consegue detectar que plotei círculos onde fiz. Sem definir xlim () e ylim (), ele mostra apenas os dois círculos inferiores.
Resultado:
Editar: corrigiu a cor das bordas e removeu os números dos carrapatos. Devo dizer que o matplotlib é muito denso e não muito amigável com a alteração das cores dos eixos.
Raspou 3 bytes graças a @DJMcMayhem
Edit: Retirou dois bytes, definindo meus ticks como uma tupla dentro das funções set_ticks.
fonte
for s in'xy':exec"x.set_"+s+"ticks(a);"+s+"lim(-.5,2.5);"
. (Ainda não testei isso, então não sou positivo)Bash + ImageMagick,
233226 caracteresSaída de amostra:
Bash + ImageMagick, 215 caracteres
O proprietário da pergunta ainda não respondeu à pergunta de anti-aliasing e algumas outras soluções também têm tons de cinza adicionais adicionados pelo anti-aliasing; portanto, por enquanto, essa mais curta também parece aceitável.
Saída de amostra:
fonte
Ruby,
144166164148144 bytesResultado:
Edit: Agora tem linhas de grade cinza.
fonte
d=d+1
possui uma forma mais curta (d+=1
) e==1
aqui é equivalente a>0
. Considere também o que acontece quando você definir c a uma Fixnum vez de uma matriz :-)[]
como se fosse uma matriz de bits (somente leitura, mas tudo bem aqui).g=[2,13,24]
parag=2,13,24
e substituireach
commap
.PNG,
105100 bytes(ou seja, este arquivo de imagem)
Considerando que HTML e outras linguagens que não são de programação são permitidas , fiquei curioso para ver o quanto eu poderia jogar uma imagem simples exibida pelo navegador para servir como uma comparação de linha de base. O resultado é compactado com as ferramentas de código aberto optipng (
-o7 -zm1-9 -strip all
) e pngwolf . Eu também experimentei o zopflipng , mas os resultados foram maiores. Outras ferramentas de compactação de código fechado podem ser capazes de economizar mais alguns bytes.Dados da imagem em base64:
Mostrar snippet de código
Editar Fiz os pontos tocarem a parte superior e inferior da célula, para causar mais repetitividade no padrão de pixels e, assim, melhorar a taxa de compressão. Mas não se preocupe, um ponto ainda preenche (7 * 9) / (9 * 9) ~ 78% de sua célula.
PNG não padrão, 88 bytes
Como apontado por @anatolyg , existe algum potencial de golfe removendo o bloco IEND (12 bytes). Tecnicamente, o IEND é exigido pelo padrão . No entanto, cada pedaço PNG inclui seu próprio tamanho e informações de soma de verificação. Portanto, não é absolutamente necessário ter um marcador final. E, de fato, todos os navegadores que testei podem exibir a imagem sem problemas.
Infelizmente (ou felizmente), essa imagem fora do padrão é rejeitada pelo imgur, então não posso carregá-la. Esta é a codificação base64:
Mostrar snippet de código
fonte
PNG
não é uma linguagem de programação.Oitava ,
127124 bytesRemovidos 3 bytes graças a Luis.
grid
é suficiente (em vez degrid on
).Saídas (após salvar):
Observe que a saída mostra linhas de grade cinza na janela de plotagem. Eles ficam pretos ao salvá-lo (por algum motivo).
Bem, isso foi longo e confuso! Tive que passar por muitas modificações para fazer com que isso aderisse às especificações.
Explicação e espero que algum golfe esteja chegando ...
fonte
'square'
para torná-lo quadrado em todas as plataformas.spy([0,1,0;0,0,1;1,1,1],'.k',80),set(gca,'XTick',.5:4,'XTickLabel','','YTick',.5:4,'YTickLabel',''),axis(.5+[0,3,0,3],'square'),grid on
.Processando,
212198 bytesBasicamente, estamos usando o Processamento simples para desenhar um plano de fundo branco, definindo a transparência dos retângulos usados para a grade e desenhando seus traços em cinza. Continuamos definindo o retângulo, definindo o valor de preenchimento novamente para preencher os círculos em preto e definindo cinco círculos.
Voilà!
Você poderia adicionar
ou mais para ver melhor a cor dos traços.
(Esse é o meu primeiro Code-Golf, espero que tenha feito tudo certo.)
EDIT: Obrigado a Kritixi Lithos! Removidas as novas linhas, alteradas para int f = 25 e usadas -1 em segundo plano (float)
fonte
float f=25;
paraint f=25;
e usando embackground(-1)
vez debackground(255);
Tikz,
193175170 bytesAqui está a saída:
fonte
MATL ,
7469686462 bytesExperimente no MATL Online! (Demora alguns segundos.)
Saída do intérprete online:
fonte
Processando, 134 bytes
Inspirado pelo @Zep, aqui está o meu one-liner de processamento (e também o meu primeiro código de golfe):
Obrigado por @Kritixi Lithos por suas dicas brilhantes sobre como poupar alguns bytes!
fonte
for(int i=0,x,y;...
para que você possa soltar oint
no corpo do loop. Além disso,fill(255);
pode se tornar apenasfill(-1);
+20
tempo definindo os valores dex
ey
, para poder alterarrect
pararect(x+5,y+5,30,30);
eellipse
paraellipse(x+20,y+20,23,23);
e salvar dois bytes.LaTeX + Tikz, 155 bytes
fonte
1/0
fazendo divisão?x
ey
coordenadas..5
se torne justo1
.[step=2]
) para produzir uma grade maior. Simplificar as coordenadas para o desenho dos círculos não economizaria bytes suficientes. (Você começa 157 bytes se você fazê-lo)SmileBASIC, 125 bytes
58081 (U + E2E1, que está no bloco "Área de uso particular") é o código de caractere para um símbolo de círculo. Colocá-lo em uma string também funcionaria, mas como é codificado como 3 bytes em UTF-8, ele teria o mesmo comprimento (e não aparecerá corretamente aqui).
fonte
C #, 333 bytes
Versão completa / formatada:
A idéia é simples: criamos um objeto gráfico a partir da imagem e usamos isso para deixar a imagem toda branca. Em seguida, faça um loop sobre cada quadrado da imagem desenhando o retângulo delimitador. Se é um dos locais para um ponto, também o desenhamos. Por fim, salvamos a imagem em um arquivo e deixamos que o Windows decida como abri-la. No meu caso, ela é aberta com o Windows Photo Viewer.
Usar a
Process
para mostrar a imagem e salvar no arquivo é muito mais curto do que criar formulários do Windows ou aplicativo WPF, devido a todas as diferentes classes e cotas extras necessárias para criá-las.Resultado:
fonte
PHP, 221 + 2 bytes
Salvar em arquivo; chamar no navegador. Se o seu navegador exibir sem sentido,
insira
header("Content-Type:image-png");
antesimagepng($i);
.Os pontos não são muito redondos; isso é devido às pequenas proporções.
demolir
Eu acho que se
0x4c4b40
qualifica como cinza aproximado. Caso contrário, adicione quatro bytes.fonte
R 313 236 bytes
O Código revisado, baseado principalmente nos comentários de @ user2390246, salvou 77 bytes. Aprecio muito a ajuda.
Além disso, deseja adicionar uma chamada à solução R mais curta por @mschilli. Ele mostra uma maneira elegante de abordar o problema dos padrões gráficos do R.
Resultado
Vai para um nome de arquivo "r". Omitir e extensão me salvou quatro bytes. Mas então eu tive que editar a extensão do arquivo de volta para "bmp" para fazer o upload. Então talvez eu não deva receber crédito por esses quatro bytes.
Comentário
Pensei comigo mesmo: "Esse gráfico não passa de um gráfico simples com cinco pontos. Deve ser uma questão simples de implementar em uma linguagem com recursos robustos de gráficos de dados. Vamos tentar em R." Mas então eu tive que gastar na ordem de 80% dos bytes apenas trabalhando em torno dos padrões gráficos de R.
Meio que a ferramenta errada para o trabalho ....
Não consegui encontrar uma maneira menos detalhada de garantir o tamanho e a proporção do gráfico do que chamar o construtor bmp e depois dev.off (). A combinação representa 25 bytes. Se sua sessão R estiver configurada corretamente, você poderá obter um gráfico mais ou menos correto sem gastar esses bytes, mas não é confiável ou consistente.
fonte
b
, apenas coloque os dois vetores sem nome diretamente naplot
função. Usec(l,3)
paraxaxp
eyaxp
. Você pode usar apenasF
para false, sem necessidade de defini-lo. E defina uma nova funçãoa(x,...)
que chame,axis(x)
mas tenha valores padrão para labels, tck, etc, para que você não precise especificá-los todos duas vezes.axes=F
vez dexaxt='n',yaxt='n'
. E você esqueceu de usar.5
ao definir,l
embora tenha usado esse truque mais tarde..5
completamente desses traquinas ?.bmp
extensão do arquivo, basta nomear o arquivor
.TI-BASIC,
218140137 bytesNota: essa contagem de bytes é um pouco inflada. O programa usa apenas 85 tokens, mas isso é salvo em 137 bytes. Além disso, se você estiver usando uma calculadora que não seja de cores, poderá salvar outros 4 tokens, porque não precisa especificar a cor (que é azul por padrão), mas não sei se as telas deles são grandes o suficiente para esse desafio porque eu não possuo um.
prgmHACKER (138 bytes, 86 tokens):
Para uma exibição adequada, este programa requer que Xmin = Ymin = 0, Xmax = Ymax = 3, Xscl = Yscl = 1. O dX também precise ser definido corretamente, mas a calculadora fará isso quando você definir qualquer outra variável da janela. Eu não conseguia ver quanto espaço essas variáveis usavam na RAM.
Além disso, as configurações de formato devem ser {RectGC, CoordOff, GridLine, GridColor: MEDGRAY, Eixos: OFF, ExprOff, BorderColor: 1, Background: OFF}, mas esses são valores alternados e não consomem espaço extra, dependendo da configuração.
fonte
{0,1,2,1,2}
e{0,0,0,2,1}
adicioná- los0.5
a cada item.L1
eL2
aL₁
eL₂
, desde que você já usá-los. Eu acho que você pode remover}
, eL₁(I)+.5→A
=>.5+L₁(I
eL₂(I)+.5→B
=>.5+L₂(I→B
.R,
119114111 bytes( Agradecimentos a @JayCe por me salvar 3 bytes)
Não é mais curto que a outra solução R , mas uma abordagem completamente diferente:
Usa um layout no qual as 4 primeiras plotagens são as células vazias e as 5 outras são aquelas com pontos.
fonte
Excel VBA, 180 bytes
Uma função de janela Imediata VBE anônima que não recebe nenhuma entrada e sai para o objeto de planilha padrão (
Sheet1
).Versão Comentada
Resultado
-6 bytes para usar
[{21,32,13,23,33}]
sobreSplit("21 32 13 23 33")
-2 bytes para usar
Mid(s,2)
sobreRight(s,1)
-3 bytes para usar
(s\10)
sobreLeft(s,1)
fonte
Oitava
10794103 bytesou
ambas as soluções são 103 bytes.
fonte
line([x1,x2],y)
você ter que fazerline([x1,x2],[y,y])
Apple Swift (iOS - CoreGraphics / QuartzCore) - 832 bytes
Desenhei a forma inteiramente usando o Quartz para um dispositivo Apple iOS. Infelizmente, essa não é uma linguagem atenta ao tamanho, de modo que o resultado é bastante grande, mas é o menor possível.
Uma versão mais legível para qualquer pessoa interessada:
Aqui está a saída produzida no iOS Simulator:
fonte
Rubi com sapatos, 118 caracteres
Bit verificação emprestado de RJHunter 's comentário feito sobre Mark Thomas ' s solução rubi .
Saída de amostra:
fonte
SVG + HTML,
146138135133 bytesGraças ao analisador de HTML branda, a
xmlns="http://www.w3.org/2000/svg"
declaração pode ser omitida, além de aspas de atributo e a tag de fechamento. Esta versão aborda alguns problemas de outras soluções HTML:Editar Raspado em 8 bytes, explorando o fato de que os subcaminhos não precisam ser fechados para serem preenchidos .
Editar De acordo com a gramática svg , não é necessário separar os não dígitos com uma vírgula (
.5,.5
). Também abandonei o preenchimento explícito, para poder alterar a direção do desenho de uma linha de negativa para positiva, salvando um traço. Por fim, ajustei a contagem para não incluir uma nova linha à direita, desculpe por esse erro de novato.Editar Aprendendo com outra resposta sobre codegolf, substituí a final
9 />
por9>
. Isso funciona bem em todos os navegadores testados.fonte
Python 3 + PyGame, 238 bytes
As constantes aparentemente arbitrárias são minhas tentando fazer a imagem o maior possível, sem sacrificar bytes.
Com caracteres não imprimíveis, 229 bytes
Substituí as listas por literais de bytes, o que economiza vários caracteres, mas os caracteres não imprimíveis não podem ser exibidos corretamente aqui. Substituí os caracteres não imprimíveis pelos seus equivalentes gráficos U + 2400-U + 2421 para fins de exibição.
fonte