O XKCD # 99 , com o título "Coração binário", mostra uma imagem simples de uns e zeros, com alguns dígitos em vermelho.
O coração vermelho é visível a olho nu, mas a mensagem oculta na sequência binária não é. Se você remover todos os espaços e novas linhas e interpretar a sequência binária como código ASCII de 8 bits, você terminará com a mensagem:
iloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOv
Bonito né?
Pssst ... A corda não é uma repetição pura de corda.
Seu desafio é criar essa imagem binária com 21 dígitos e 23 dígitos abaixo. Deve haver exatamente um espaço entre cada dígito em cada linha e uma nova linha para cada nova linha. Observe que os últimos bits são apenas o começo da letra e
, pois 21*23
não é divisível por 8. Você também precisa desses bits.
A função ou programa não deve receber nenhuma entrada. Espaços iniciais e finais e novas linhas são aceitos.
O resultado do seu código deve ficar assim:
0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1
1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1
1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0
1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0
1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0
1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1
0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1
0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1
0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0
1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1
0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0
1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1
0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1
0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1
1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0
0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0
1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1
1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0
0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0
0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0
1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1
0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Entre os melhores
fonte
O
s maiúsculos da string de saída ASCII!Respostas:
Geléia ,
363332 bytesGraças a @ JonathanAllan por jogar fora 3 bytes!
Experimente online!
Como funciona
O link principal
é executado niladicamente (ou seja, sem argumentos) quando o programa é executado. Seu valor de retorno será impresso implicitamente.
encontre os índices dos caracteres citados na página de códigos de Jelly e os interprete como dígitos de um número bijetivo de base 250. Isso gera o número inteiro 13021639057551959994 .
converte o número inteiro gerado em binário. Isso gera a matriz de bits 1011010010110110001001111011101100110010101111001010011110111010, que corresponde à codificação UTF-8 da string ilOveyOu , deslocada um bit para a esquerda.
A mudança é necessária porque
B
não é possível retornar uma matriz de bits com um 0 inicial . Outras opções incluem negar os dígitos binários ou calcular o quadrado ao contrário, mas essa abordagem economiza um byte.molda a matriz gerada como o intervalo de 1 a 484 , ou seja, repete o conteúdo da matriz quantas vezes for necessário para atingir um comprimento de 484 .
Isso é mais um pouco do que precisamos, para explicar a mudança. Nós podemos remover o primeiro bit agora, mas fazê-lo mais tarde significa que todos os bits que precisam ser trocados estão em índices pares, o que nos permite salvar o byte mencionado acima.
pega os pontos de código dos caracteres entre
“
e‘
( [10, 58, 74, 138, 154, 186] ) e, em seguida, "abre", ou seja, multiplica-os por 2 ( [20, 116, 148, 276, 308, 372 ] ).nega condicionalmente os bits nesses índices. Isso corresponde às variações de E / S no padrão original.
Finalmente,
desenfileire a matriz de bits (removendo o primeiro bit), divida a matriz restante em linhas de 21 elementos e imprima a matriz resultante como uma grade.
fonte
O
como padrão, eu acho que isso faz:“ỊḂr×C)ḃȯ’B¬ṁ483¬“Œ` ° @‘+\¤¦s21G
Geléia ,
41 40 3533 bytesObrigado a @Dennis por fazer o fim
ṖṖCG
! (complementoC
=1-x
no lugar de não lógico¬
)TryItOnline
Quão?
Versão "colorida", 77 bytes
TryItOnline
Jelly não tem saída de cores, mas isso é muito mais fácil para mim de qualquer maneira (eu sou daltônico) ...
Quão?
fonte
¬
, os últimos quatro bytes poderão se tornarṖṖCG
. :)complement
?Na verdade, 58 bytes
Experimente online!
Explicação
Existem três partes principais aqui, então eu vou decompô-lo adequadamente.
Parte 1: Construindo a sequência base-256
Na verdade, vamos construir a string binária invertida, aproveitar a estrutura baseada em pilha da Actually (LIFO) e evitar complicações com zeros à esquerda na string binária. Portanto, a cadeia binária de destino
110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
é equivalente a20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
decimal. Na base-256 (usando a tabela de caracteres CP437 para conversão), a sequência correspondente é♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Para construir a cadeia binária original, construímos a cadeia base-256 (aproveitando o padrão nela) e executamos conversões básicas em decimal e binário.A cadeia base-256 tem o seguinte formato (espaços e novas linhas adicionadas para maior clareza):
Assim, cada uma das 7 seções do meio pode ser formada usando o andaime
«%s₧ªn%s6û
e substituindo as%s
peças por≥
ou÷
.A sequência específica de
≥
s e÷
s que precisamos é≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Como precisamos disso como uma lista de strings de comprimento 1, a maneira ingênua de representá-lo seria"≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(empurre a string, faça-a em uma lista). No entanto, podemos fazer um pouco melhor. Ao interpretar essa sequência como um número binário (onde≥
representa1
e÷
representa0
), obtemos o13542
decimal. Ao converter isso de volta em binário (usando os tradicionais1
es0
) e indexar em uma cadeia de comprimento 2, podemos obter a lista usando um byte a menos que o método ingênuo.Parte 2: Convertendo em binário
Esta parte é muito mais direta. Se realmente tivesse a capacidade de converter diretamente base-256 em binário, usaríamos isso. Infelizmente, isso não acontece, então teremos que usar decimal como um formato intermediário.
O
,
código a seguir representa o código da Parte 1 - para fins explicativos, substituí o código da Parte 1 por,
para ler a saída da Parte 1 do STDIN. Não faz parte do código final real.Parte 3: Formatação
Se o desafio fosse apenas produzir a string binária como está, estaríamos prontos. No entanto, ainda temos alguma formatação a fazer para obter a sequência binária em um retângulo 21 x 23.
Como na Parte 2, o
,
representa a saída da parte anterior e não faz parte do código real.Para aqueles que acompanham em casa, este é o código Python 3 equivalente (481 bytes):
fonte
JavaScript (ES6),
169...136135 bytesEconomizou 2 bytes graças a Andrakis
Economizou 4 bytes graças a Hedi
Economizou
35 bytes graças a NeilVersão colorida, 249 bytes (237 bytes de JS + 12 bytes de CSS)
O código JS gera a arte ASCII com tags em negrito para o coração. São necessários 12 bytes de CSS para colorir em vermelho. (Essa contagem de bytes é justa?)
fonte
s=>s.replace(/./g,'$& ')
. Eu tenho trabalhado em uma solução praticamente idêntica.s.replace(/./g,'$& ')
possível substituir pors.split``.join` `
?[...s].join` `
replace(/./g,(c,i)=>c+=++i%21?' ':'\n')
(obviamente, usando uma nova linha literal lá) economiza mais um byte. Pode muito bem haver uma maneira ainda melhor de expressar essa idéia.05AB1E ,
775453444341 bytesUsa a codificação CP-1252 .
Explicação
Experimente online!
fonte
Sðý42ô»
toS21ô»
, já que»
une listas internas por espaços implicitamente (e•1žä¿*•
deve ser agora•Å¾$6•
, já que números inteiros são codificados na base 255 agora, em vez da base 214).CJam , 48 bytes
Colaboração com @MartinEnder, que tirou 3 bytes complicados com a
"uilvey"3/
string. Intérprete online .fonte
Javascript ES6 REPL ,
124121119113 bytesGuardado 6 bytes graças a @ETHproductions
Este é um programa completo que pode ser colado no REPL / console para produzir o resultado correto.
Mostrar snippet de código
Mais detalhado
Coração somente JavaScript colorido, 281 bytes
Isso funciona alternando cores a cada n bits e utiliza a capacidade console.log para registrar cores
Coração CSS colorido, 229 + 12 bytes
Se o uso de css for permitido, o coração colorido poderá ser reduzido ainda mais para 229 bytes de código JavaScript e 12 bytes de CSS
Mostrar snippet de código
fonte
a
e usarnum>>i/64&1
nos dois lugares, economizando 1 byte. Além disso,++i%21==0?newline:space
é o mesmo que++i%21?space:newline
.i=0,r=''
parai=r=''
;''
é coagido automaticamente a 0.MATL,
5655 bytesExperimente Online
Explicação
fonte
PowerShell v2 +, (UTF-16) 300 bytes
Contagem de bytes errados corrigida graças a @Mego
Não é a mais curta, mas uma abordagem diferente. Peguei manualmente cada linha e as cortei em pares cada (aproximadamente) 9 a 11 bits significativos de comprimento. Convertido cada um desses valores binários em um
char
(Observação: o PowerShell usa UTF-16 por padrão, não UTF-8) e transformou isso em uma sequência. Esse é'...'
o começo.Em seguida, fazemos
-split
isso em strings de comprimento 2 e passamos por cada par. Esses pares são divididos em umchar
-array via$_[0,1]
, e cada um deles é convertido como int+$_
e[convert]
ed em um binário (,2
)String
. Isso é-join
editado em uma única string,PadLeft
para obter o comprimento adequado, então cada elemento é-replace
d com ele e um espaço'$1 '
.Todas essas strings são deixadas no pipeline e a saída é implícita, com o padrão
Write-Output
colando uma nova linha entre os elementos.fonte
len("'ږƍƕ๓ƺ֥˄ϝӊ༭ǝ֥ţϝɥޔǮƱϝIJ˲ӷʴ˘ͻ֙ץŻŬɻˌʼֽ͖ҶɻŦʼʞݖɛĽƳ'-split'(..)'-ne''|%{(-join($_[0,1]|%{[convert]::ToString(+$_,2)})).PadLeft(21,'0')-replace'(.)','$1 '}".encode('utf-16be'))
/// , 237 bytes
Experimente online!
fonte
Python 3,
147144 bytesTeste em ideone
Inicializa
i
a0
na declaração da função, em seguida, repete este 23 vezes:faz toda a cadeia binária sem espaços (ver abaixo);
corta uma linha de dentro usando
[i:i+21]
;insere os espaços com
' '.join(...)
;impressões; e
incrementa
i
em 21 comi+=21
Para criar toda a cadeia binária:
repete
"ilOveyOu"
oito vezes;substitui
O
poro
onde for necessário (em índices[2,14,18,34,38,46]
);- - - isto é conseguido com
chr(j+30)in' ,0@DL'
para salvar 3 bytesconverte cada caractere em seu ordinal;
lança cada ordinal em uma string binária (
'0bxxxxxxx'
);remove a liderança
'0b'
de cada uso[2:]
;precede cada um com um
'0'
; ejunta a coisa toda com
''.join(...)
fonte
i=0\nexec(...)
oui=0;exec(...)
para 137 bytes.exec("...")
paraexec"..."
eprint(...)
paraprint...
PHP + HTML + CSS, 173 bytes coloridos 367 bytes
Somente CLI PHP 173 bytes
em conformidade com o tipo de conteúdo text / html da especificação de recompensa
b{all:unset;color:red}
em vez deb{all:unset;color:#911;background:red}
na primeira versãoPHP + HTML + CSS, 392 bytes
coração vermelho + preto que parece mais bonito
Talvez chame o número da cor na parte CSS
adicione isso antes que pareça melhor
Saída primeira versão, é o código HTML mais feio da minha vida
coração vermelho-preto
375 bytes para criar a página HTML diretamente com PHP
fonte
color:#911;background:red
porcolor:red;
faz com que esteja em conformidade com as especificações de recompensa, além de economizar alguns bytes.PowerShell, 110 bytes
Explicação:
A primeira linha do script pega as substrings e insere uma letra
O
entre elas. O resultado é a sequênciauiloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOvey
. Observe que o primeiro e o último caracteres são redundantes.O loop gera todos os
(8..490)
bits necessários a partir dos caracteres da string, bem como um espaço ou um avanço de linha.O enigma do destinatário da carta dos namorados
Pode-se ver que os pequenos e grandes símbolos
O
compõem a codificação de bits. Existem 15 símbolos (bits). Existe apenas uma partição nos bits para obter caracteres ASCII:oOOooOOO
+ooOoOOO[o]
. Tivemos que adicionar um pequeno emo
vez de0
no final. Estes símbolos ASCII são:g.
Quem é esse misterioso
g.
?fonte
PHP, 121 bytes
demolir
fonte
q / kdb +,
10793855553 bytesSolução:
Exemplo:
Explicação:
Notas:
fonte
Python 3, 199 bytes:
fonte
Python 3, 170 bytes
faz uma repetição de seqüência de caracteres "Il% svey% su", repete o número de vezes necessário e depois usa uma tupla para submarcar todos os o's. Depois, converte-o em binário, usa o módulo textwrap, converte cada item do novo lista a lista, junta-se ao espaço e depois adiciona 0 1 1 porque isso parece ser um esboço ou algo assim
fonte
Mathematica, 123 bytes (275 com cores)
Não tenho certeza se o uso em
Grid
vez da saída de uma string está OK (caso contrário, essa é uma entrada não concorrente).P / B
Cor
fonte
grid
em texto sem formatação e colá-lo no bloco de notas? Com o que se parece? Espaço separado (espaço único) com novas linhas, como mostra a figura?Ruby 142 bytes
(Um pouco mais) legível:
Ainda não encontrei uma maneira de condensar o texto original em uma forma mais sucinta no Ruby - ele tem ótimas funções de manipulação de String, mas todas as maneiras pelas quais tentei usar mais caracteres do que a própria string. Qualquer dica apreciada, este é o meu primeiro Code Golf no StackOverflow!
fonte
a
) e depoisa+a+a
...? Melhor ainda, se Ruby suportar multiplicação de stringsa*count
,!a+a+a
é a maneira)o
por maiúsculaO
!Ferrugem, 195 bytes
Ungolfed:
fonte
C (gcc) , 102 bytes
Atropelar
Experimente online!
fonte
K (oK) ,
5048 bytesSolução:
Experimente online!
Explicação:
Porta da minha solução Q / KDB + .
Notas:
fonte
2 14 18 34 38 46
->0x020e1222262e
Pitão, 47 bytes
Experimente online aqui .
fonte
/// , 220 bytes
Experimente online!
fonte
C ++ 11, não concorrente,
726687636 bytes (* limite NIX ou W10 2 necessário)Eu sei que isso pode ser jogado muito melhor. Eu quero ver uma resposta c ++ curta, droga!
Provavelmente também cometi alguns erros ao codificar a seção do coração.
Saída (cores fixas):
fonte
Python, 473 bytes
Colori!
fonte
str.translate
pode ser uma escolha melhorFEU , 360 bytes
Apenas compressão estúpida
fonte