Escreva o código que recebe uma string como entrada e gera um valor de verdade ou falsey, dependendo se a string segue ou não estas regras:
Se você empilhar cada caractere um sobre o outro, converter em binário e somar cada coluna, todas as somas deverão ser idênticas. Você pode assumir que a sequência de entrada contém apenas caracteres ASCII imprimíveis (pontos de código 32 - 126).
Como um exemplo:
A entrada O5vy_+~
deve retornar um valor verdadeiro, pois sua representação binária é:
1001111 | O
0110101 | 5
1110110 | v
1111001 | y
1011111 | _
0101011 | +
1111110 | ~
-------
5555555 <- Sum of bits in each column. Should give a truthy value.
A entrada PPCG
deve retornar um valor falsey, pois sua representação binária é:
1010000 | P
1010000 | P
1000011 | C
1000111 | G
-------
4020122 <- Should give a falsey value
A questão é: seu código deve retornar um valor verdadeiro se for usado como entrada para sua função / programa. Ou seja, o código deve seguir as mesmas regras acima (seu código pode conter caracteres que não sejam ASCII 32-126).
Seu programa / função precisa apenas manipular ASCII imprimível como entrada. Se o seu código contiver outra coisa, codificação de 8 bits, 16 bits, Unicode, um conjunto de caracteres personalizado (ou outra coisa), a representação binária dele deverá aderir às mesmas regras, mas seu código não precisará lidar com isso como entrada.
Isso é código-golfe , então as regras padrão se aplicam.
fonte
Respostas:
JavaScript (ES6),
123122120110 bytesAbaixo está um hexdump com somas de bits.
Demo
Mostrar snippet de código
fonte
MATL ,
109 bytesEntrada é uma cadeia de caracteres entre aspas simples (se a entrada contiver qoutes simples, escape-as duplicando).
A saída é
3
tão verdadeira e nada (saída vazia) como falsa.Experimente online!
O código em binário é o seguinte:
Explicação
fonte
Geléia ,
1110 bytesExperimente Online! Ou consulte testes e entrada automática (o código é todo ASCII imprimível, que tem os mesmos valores na página de códigos do Jelly, como visto abaixo).
Quão?
fonte
Geléia ,
1110 bytesNão usa no-ops ou comentários.
Experimente online!
Divisão binária
Como funciona
fonte
OBUSE
porque pareceABUSE
.Mathematica, 88 bytes
Contém muitos caracteres não imprimíveis entre as aspas. Possui 49 de cada bit.
Aqui está o hexdump:
fonte
Oitava,
5352 bytesFazer uma reescrita completa me ajudou a obter o código de 5 bytes, mas tive que adicionar mais no-ops, tornando-o uma economia de rede de apenas 1 byte.
Não consigo adicionar um link TIO, pois nenhum dos intérpretes online implementou a caixa de ferramentas de comunicação necessária
de2bi
. Mudá-lo para emdec2bin
vez disso custaria 4 bytes (2 para código ativo e duas não operacionais).Não encontrei nenhuma maneira de evitar nenhuma das 27 no-ops. Todos os nomes de funções e parênteses estão entre abaixo de 64 ou superior a 96, significando que todos os caracteres "necessários" têm um 1 na 6ª posição (da direita, 2 ^ 5). Eu tinha uma solução com apenas 23 no-ops, mas o código em si era mais longo. O código real é 25 bytes e possui a seguinte soma da coluna ao contar os bits do equivalente binário:
Existem 22 bits na 6ª posição da direita (2 ^ 5) e apenas 6 bits na 4ª posição da direita (2 ^ 3). Isso significa que precisamos adicionar pelo menos 16 bytes para obter 6 e 22. Agora, o caractere de comentário
%
adiciona um pouco à 6ª posição, aumentando-o para 23. Todos os caracteres ASCII imprimíveis precisam de pelo menos um dos dois top bits para ser1
. Portanto, adicionar 17 bytes nos dará pelo menos 27 bits em cada um dos dois "pontos principais" (2 ^ 6 e 2 ^ 5). Agora, temos 27 bits nos dois primeiros lugares e 22 no resto. Para obter um equilíbrio, precisamos adicionar 10 bytes, para obter 32 bits em cada posição.Uma explicação do novo código (52 bytes):
Um vetor contendo apenas 1s (verdadeiro) é avaliado como verdadeiro no Oitava, e um vetor contendo pelo menos um zero é avaliado como falso no Oitava.
Uma explicação do código antigo (53 bytes):
Um vetor contendo apenas 1s (verdadeiro) é avaliado como verdadeiro no Oitava, e um vetor contendo pelo menos um zero é avaliado como falso no Oitava.
fonte
JavaScript (ES6),
139111107 bytesContém
816361 de cada bit.fonte
Scala, 149 bytes
Uso:
Hexdump:
Ungolfed:
Explicação:
fonte
J , 45 bytes
Experimente online! Inclui casos de teste para a maioria dos envios enviados, juntamente com o código fonte.
fonte
Haskell , 118 bytes
Experimente online! Uso:
_Z "some string"
retornaTrue
ouFalse
.Existem alguns caracteres não imprimíveis no comentário da última linha, então aqui está uma sequência do programa usando caracteres de escape:
Cada bit ocorre 68 vezes.
O código mais curto que eu criei era 82 bytes:
No entanto, as somas dos bits desse código são
[33,28,41,48,20,79,46]
, portanto,79 - 20 = 59
não haverá mais operações, além de 2 bytes para iniciar um comentário, além de serem necessários, totalizando 143 bytes.Ao reorganizar o programa, descobri que usar letras maiúsculas como nomes de variáveis ajuda a nivelar as somas porque elas não têm o bit na 6ª posição definida. Como o Haskell não permite que os nomes de variáveis iniciem com uma letra maiúscula, eles precisam ser anexados com o
_
que também não define o sexto bit.Ao fazer isso, terminei com a solução acima, que possui 97 bytes antes de adicionar as no-ops e a soma bist para
[50,47,56,56,48,68,60]
, portanto(68 - 47) = 21
, apenas 21 bytes precisam ser adicionados no comentário.fonte
PHP,
959391 bytesEstou tão feliz que nomes de função PHP não diferenciam maiúsculas de minúsculas!
onde
*
deve ser substituído por ASCII 151 (0x97). (O PHP reclamaria de qualquer caractere de controle no código - além de\r
e\n
, mas eu preciso de algo com o bit 4 definido, então adicionei 128.)+1 byte para ASCII imprimível puro: use em
_7
vez disso.Execute
echo '<input>' | php -nR '<code>'
ou teste on-line . A saída é1
para verdade, vazia para falsidade.fonte
Python 2, 117 bytes
Todos os "espaços" são tabulações para reduzir o número de 0x20 bits.
Contém 66 de cada bit. (Não há
'%07b'
como explicado nesta edição .)Despejo hexagonal:
fonte