Isso está relacionado tangencialmente à minha busca por inventar uma linguagem de programação esotérica .
Uma tabela dos números binários 0 .. 15 pode ser usada para implementar uma Função Binária Universal usando operações de indexação. Dadas duas entradas de 1 bit X e Y, todas as 16 funções possíveis podem ser codificadas em um código de operação de 4 bits.
X Y F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- - - - - - - - - - - - - - - - - -
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
- - - - - - - - -
0 ~X ~Y ^ & Y X | 1
ZERO NOT-Y AND OR
NOT-X XOR ONE
Portanto, este conjunto de 16 funções pode ser aplicado a entradas binárias como a função
U (f, x, y): (f >> ((x << 1) | y)) & 1 ,
ou
U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,
ou com indexação ou particionamento de matriz.
Será útil conhecer a maneira mais compacta de representar ou gerar uma tabela de valores para quaisquer idiomas possíveis a serem construídos sobre esse tipo de operação binária.
O objetivo:
Gere esta saída de texto exata:
0101010101010101
0011001100110011
0000111100001111
0000000011111111
É isso aí! O código mais curto vence.
fonte
Respostas:
J, 10 (13?) Caracteres
Lista de números:
para binário:
Transpor:
Marcha ré:
Precisamos remover os espaços? Olhando para a outra resposta J parece que não por isso vamos precisar adicionar 3 caracteres e emprestar o
1":
da resposta de Jan .fonte
Python 2, 40
fonte
APL (14)
Supondo
⎕IO=0
(essa é uma configuração):Explicação:
⍳16
: números [0,16)(4⍴2)⊤
: codifique cada número na base 2 usando 4 dígitos⊖
: reverso horizontal (para que o MSB fique no topo)⎕D[
...]
: selecione esses valores a partir dos⎕D
quais é a sequência0123456789
. (Uma matriz numérica é exibida com espaços entre os valores, uma matriz de caracteres não é. Portanto, isso converte cada bit numérico em um dos caracteres'0' '1'
).fonte
(4⍴2)⊤
→2⊥⍣¯1
Gelatina ,
427 bytes (não concorrente)Experimente online!
Agradeço ao Dennis por sua ajuda. Aqui está a primeira mensagem, aqui está a última (outras discussões também ocorreram). Com a ajuda dele, aparentemente (quase) enraíze a pontuação.
fonte
/// , 51 bytes
Experimente online
fonte
GolfScript (
18 1715 caracteres)(Com agradecimentos a Howard)
Eu não entendo por que o 10-char
não funciona; Suspeito que um erro no intérprete padrão esteja resultando em tipos não suportados na pilha.
Uma alternativa de 18 caracteres que eu entendo completamente é:
Uma abordagem mais matemática é um pouco mais longa, com 28 caracteres:
Muito disso é para conversão de base e preenchimento zero. Sem eles, cai para 19 caracteres,
com saída
fonte
16,zip{n}/
funcionar então?16,zip{','-~n}%
zip
deve retornar uma matriz de matrizes, mas na verdade parece retornar uma matriz de matrizes Ruby (é o meu melhor palpite). Quaisquer que sejam os elementos, aplicar `` `` `a eles não afeta a maneira como eles imprimem, o que é diferente de qualquer um dos quatro tipos de dados GolfScript. Você está certo que','-
parece transformá-los em matrizes normais: bom truque.CJam - 16
Código java equivalente (como explicação):
fonte
Javascript (ECMA6), 67
Para usar isso, ligue
Bitshift!
E também XOR e um pouco de recursão.
A primeira coisa a notar é que, se pegarmos qualquer linha e você a deslocar (# de 0's contínuos) / 2 restantes, obteremos um bom XOR para obter a próxima linha.
Por exemplo,
XOR estes bit a bit nos dão
qual é a próxima formação (linha 3).
Aplicando o mesmo processo para a linha 3, mude 2 para a esquerda e obteremos ...
XOR'ed dá
que é a linha 2.
Observe que a quantidade que mudamos diminui pela metade a cada vez.
Agora, simplesmente chamamos essa função recursivamente, com 2 argumentos. O valor inteiro dessa linha, e N, que é quanto precisamos mudar. Quando repetimos, apenas passamos o valor XOR'ed alterado e n / 2.
é preencher 0's no início de cada linha, porque toString remove 0's iniciais.
fonte
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 caracteres
i.16
é uma lista de 0..152^i.4
é uma lista (1,2,4,8)%~/
produz a tabela de divisões onde o argumento esquerdo forma linhas, mas é o argumento certo para divisão2|
calcula o restante depois de dividir [cada célula] por dois<.
pisos com valor 0 ou 11":
formata a tabela com um caractere por célulafonte
floor
não deveria ser necessário. O domínio de2|
já é 0 ou 1, certo?|
opera em carros alegóricos .2|3.25
é1.25
. Nós não queremos isso.GolfScript, 19 caracteres
Outra abordagem GolfScript
fonte
Rubi (44)
Aborrecido e longo: basta imprimir as representações binárias preenchidas com 0 dos números.
fonte
Postscript
108177126777470Reverteu os valores para um simples mo- off método.
151131119Aplicando uma abordagem mais APL . edit: substituição de corte de cordas e fechamento de array por indexação e for-loops.
Recuado:
Reimplementar as funções usadas na resposta J vencedora leva a isso (com muito código de suporte ).
i
Aqui está o vetor baseado em 1 descrito nas Funções Elementares de Iverson , daí o-1 ... +
para produzir0 .. 15
.fonte
Perl (36 + 1)
+1 para
say
, como sempre. o duplo0
não é um erro de digitação :)fonte
say
.perl -e'...'
é padrão e isso requerperl -E'...'
, sem aumento na contagem de bytes. Enfim, acho que foi decidido no Código Golf Meta que-M5.01
é gratuito.JavaScript (ECMA6), 108
Tentando uma abordagem diferente aqui. Embora tenha sido incentivado a usar operadores binários, me permiti enviar essa solução, pois o desafio também é de complexidade kolmogorov e eu estava pensando - como posso reduzir a quantidade de código que representa esses valores ...? Bases .
(Quebra de linha por conveniência).
É uma pena que tive que mexer no preenchimento com zeros à esquerda, mas o ponto desse código é simplesmente representar o resultado binário de destino na Base 36, que são exatamente esses
gut, a43, 2z3, 73
valores.Nota: Sei que não chegará nem perto da resposta vencedora, mas apenas por uma questão de idéia ...
fonte
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. Essa abordagem usa novas linhas em vez de quatroalert()
s.Sprects , 44 bytes
A resposta de Cedric foi enviada para Sprects.
fonte
MATL ( não concorrente ), 8 bytes
Experimente online!
Explicação
fonte
CJam ( não concorrente ),
109 bytesObrigado a @Dennis por 1 byte de desconto!
Experimente online!
Explicação
fonte
JavaScript (ES6),
5852 bytesConstrói a string recursivamente.
Como funciona
Essa recursão é baseada no fato de que o padrão é feito da representação binária vertical dos nibbles 0x0 a 0xF:
Portanto, cada posição (X, Y) em este padrão pode ser expressa como o Y-th pouco de X:
X & (1 << Y)
. Nós também podemos isolar este bit com:(X >> Y) & 1
. Ao invés de manter o rasto dos símbolos X e Y, iteramos em uma única variáveln
que varia de 0 a 63. Assim, torna-se a fórmula:(n >> (n >> 4)) & 1
. Na verdade, é mais fácil iterar de 63 para 0, para que a sequência seja construída na ordem inversa. Em outras palavras, o caractere n-1 é anexado à esquerda do caractere n .Como uma observação lateral, a recursão não traz nada aqui, exceto código mais curto.
Sem as quebras de linha, o código tem 35 bytes:
Precisamos de mais 17 bytes para inserir as quebras de linha. Isso pode ser reduzido para 14 bytes se uma quebra de linha principal for aceitável.
Demo
fonte
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 bytes).replace(/.{16}/g,"$0\n")
tem o mesmo comprimento. Que pena.Bash + coreutils, 65 bytes
Não é o mais curto, mas também o mais longo:
(O último caractere é um espaço)
Experimente online .
fonte
NARS2000 APL, 22
Derivado da resposta do APL de marinus, que parece não funcionar no NARS2000.
Gerar vetor
Alterar para baseado em zero
Gerar forma para codificação
Codificar
Ajustar para indexação baseada em 1
Eixo primário reverso
Índice
fonte
C, 73 caracteres
Esta é apenas uma solução geral para gerar 64 bits em quatro blocos de 16 bits; você só precisa alterar o número
0xFF0F0F33335555
para gerar uma outra sequência de bits.simplificado e não destruído:
fonte
Haskell, 73
Caramba, 73 caracteres! Não posso, pelo amor de Deus, diminuir ainda mais isso.
A parte realmente triste disso é que, se você repetir a saída usando o bash, precisará apenas de 74 caracteres.
fonte
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
fonte
inca2 ,
332724Isso se baseia na resposta de Jan Dvorak . O inca2 pode executar isso a partir das correções de ontem. Tecnicamente inválido, pois a linguagem foi inventada após a pergunta, mas a invenção de uma língua fazia parte do meu objetivo em fazer a pergunta. Então, aqui está uma recompensa em gratidão pelas outras respostas. :)
Explicação:
Alguns dos parênteses devem ser desnecessários, mas, aparentemente, ainda existem alguns problemas com minha interpretação da gramática. E "ravel => map => remodelar" é realmente desajeitado: o mapa precisa ser mais inteligente. Edit: correções de erros permitem a eliminação de parênteses.
Fatorar a conversão de base em uma função separada
N:x|y%.x^~1+[]/x.y
produz esse19Versão de 16 caracteres.E, embora eu esteja trapaceando de qualquer maneira aqui, fui adiante e tornei isso uma função interna. Mas, mesmo que seja uma função niládica (sem exigir um argumento), não há suporte para funções niládicas e ela deve ser fornecida com um argumento fictício.
inca2, 2
fonte
Pitão 24/26
O método mais curto foi a resposta do grc traduzida para Pyth, que achei barata, então fiz o meu próprio método:
Minas: 26 caracteres
grc: 24 caracteres
fonte
C ++ 130
Converte hexadecimal em binário
fonte
Haskell (Lambdabot), 47 bytes
Meio barato porque usa transpose de Data.List e replicateM de Control.Monad, no entanto, ambos são carregados por padrão no Lambdabot.
Além disso, tenho certeza de que há espaço para melhorias, só queria compartilhar a ideia
fonte
Julia (39 bytes)
Segundo roteiro que já escrevi em Julia, tenho que admitir que estou gostando de Julia, ela é uma fera bonita.
Devoluções
Explicação:
bin(x,4)
- Converter int em número inteiro binário com preenchimento para 4 caracteres.collect(_)
- Dividir string em matriz de caracteres.map(x->_,0:15)
- Faça isso pelos 16 primeiros dígitos do intervalo.hcat(_...)
- Splat e concatenar horizontalmente em uma matriz.fonte
C
8377767471Bem direto.
fonte
?:
e outra economia de 1 movendo a++
.main
paraf
. lolR,
5341 bytesUma tradução da resposta python do @ grc. Retirou 12 bytes da tradução original através do uso de
rep()
'seach
elength
argumentos (e correspondência parcial de argumentos) e lembrando que isso0:1
é equivalente ac(0,1)
.Você também pode tentar uma tradução da resposta J de @ Gareth, algo como isto (34 bytes):
No entanto, ele usa uma função que não faz parte da base R e gera uma matriz que é difícil de formatar no texto impresso exato, como na especificação.
fonte