Meus desafios tendem a ser um pouco difíceis e pouco atraentes. Então, aqui, algo fácil e divertido.
A sequência de Alcuin
A sequência de Alcuin A(n)
é definida pela contagem de triângulos. A(n)
é o número de triângulos com lados inteiros e perímetro n
. Esta sequência é chamada após Alcuin de York.
Os primeiros elementos desta sequência, começando com n = 0
são:
0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...
Por exemplo A(9) = 3
, porque os únicos triângulos com lados inteiros e perímetro 9
são 1 - 4 - 4
, 3 - 3 - 3
e 2 - 3 - 4
. Você pode ver os três triângulos válidos abaixo.
Há algum padrão bastante interessante nessa sequência. Por exemplo A(2*k) = A(2*k - 3)
.
Para mais informações, consulte A005044 no OEIS.
Desafio
Mas seu desafio é sobre a representação binária desses números. Se convertermos cada número de sequência em sua representação binária, colocá-los em vetores de coluna e alinhá-los, cria uma imagem binária bastante interessante.
Na figura a seguir, você pode ver a representação binária dos números de sequência A(0), A(1), ..., A(149)
. Na primeira coluna, você pode ver a representação binária de A(1)
, na segunda coluna, a representação de A(1)
e assim por diante.
Você pode ver algum tipo de padrão de repetição nesta imagem. Até parece meio fractais, se você olhar, por exemplo, a imagem com os números de sequência A(600), A(601), ..., A(899)
.
Seu trabalho é gerar essa imagem. Sua função, seu script receberá dois números inteiros 0 <= m < n
e deve gerar a imagem binária da sequência de Alcuin A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)
. Então a entrada 0, 150
gera a primeira imagem, a entrada 600, 900
a segunda imagem.
Você pode usar qualquer formato gráfico popular que desejar. Digamos que todos os formatos que podem ser convertidos para png usando image.online-convert.com . Como alternativa, você pode exibir a imagem na tela. Nenhuma linha branca inicial é permitida!
Isso é código-golfe. Portanto, o código mais curto (em bytes) vence.
fonte
white=1 and black=0
ou o contrário?white=0 and black=1
. Então, o contrário.A(0)
produz uma coluna branca,A(9)=3
produz uma coluna branca com 2 pixels pretos na parte inferior.0,0,0,1,0,2
enquanto a lista no início da pergunta diz0,0,0,1,0,1
.Respostas:
J (
5245 (página de código 437))Isso seria permitido (eu acho)
Hex dump
(Nada realmente especial, o quadrado preto é DB 16 ou 219 10 na página de código 437.)
Uso
Isso resulta da seguinte maneira (as tags de código estragam tudo adicionando espaço entre as linhas):
No console J padrão, não há espaçamento entre as linhas, então chamo a regra 'Como alternativa, você pode exibir a imagem na tela'. (Em nenhum lugar foi dito que essa imagem precisava ser representada internamente como um formato de imagem sensível)
EDIT: Jconsole (ao contrário de JQT) usa a página de códigos 437 como padrão e renderiza os retângulos corretamente ao usá-los a partir de uma sequência.
fonte
Mathematica,
12612212189 bytesIsso define uma função sem nome, tendo os dois números inteiros como parâmetros e exibindo a imagem na tela. Ele plota cada quadrado como um único pixel, mas se você quiser, pode aumentar o zoom.
Agora estou usando uma fórmula explícita dada no artigo da OEIS (primeira na seção Mathematica, obrigado a David Carraher por apontar isso). Também é incrivelmente rápido agora.
Aqui está o código recuado com alguns comentários:
Aqui está a saída para
0, 600
:fonte
Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
CJam (
56 5553 caracteres) / GolfScript (64 caracteres)CJam:
GolfScript:
Ambos produzem saída no formato NetPBM e são essencialmente portas um do outro.
Dissecação
Agradecimentos ao Optimizer para CJam 56 -> 53.
fonte
'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Pitão -
1016059Saídas a
.pbm
. Provavelmente pode ser jogado mais.Altamente não-destruído, porque eu vou traduzir para Pyth.Explicação a seguir. Agora, observe o código Python equivalente.Ele usa o algoritmo OEIS para calcular a sequência e depois converte em binário, preenche os números, faz uma rotação de matriz e formata-a em uma
pbm
imagem. Como não estou usando força bruta, é incrivelmente rápido.Aqui está o
600,900
exemplo:Experimente aqui online .
fonte
R -
127125Não tenho certeza se isso está de acordo com as regras totalmente. Ele não gera uma imagem em um arquivo, mas cria uma varredura e a plota em um dispositivo de saída.
Eu encontrei a mesma fórmula que Martin, mas aqui .
Ele usa uma função sem nome.
Execute da seguinte maneira
Produz o seguinte gráfico
fonte
raster
ao espaço para nome, poisraster()
é a única coisa específica nesse pacote. Em vez disso, façaraster::raster(...)
.Python 2
+ PIL,255184Minha primeira versão usou o PIL para mostrar uma imagem:
A nova versão apenas produz uma imagem PPM em preto e branco no stdout:
fonte
for
. Você pode evitar parêntesesx%2
alterando a ordem parax%2*...
. É mais curto não definir impressão como uma função e apenas usar doisfor
loops aninhados ,print ...,
para evitar novas linhas e um espaçoprint
em branco para iniciar uma nova linha. Um truque para forçar expansões binárias a terem comprimentoh
semzfill
é adicionar e2**h
, em seguida, extrair os últimosh
dígitos.JAVASCRIPT - 291
Código:
Explicação:
Resultado:
Sim, o resultado está de cabeça para baixo, mas é porque
0,0
em umjs canvas
canto superior esquerdo. : 3Demo:
Demonstração sobre jsfiddle
fonte