Meu colega de trabalho e eu trabalhamos em um software legado que odiamos às vezes. Sempre que você o executa, as declarações de depuração vêm voando por toda parte, e nunca é uma garantia de que algo funcione. A motivação para esta rodada de código de golfe veio do meu colega de trabalho dizendo o seguinte sobre o nosso software .
"É como se toda vez que você executasse este programa, você concordasse com alguns termos de serviço que afirmam que todo décimo sétimo bit do seu disco rígido será transformado em 1"
Objetivo: escreva um programa que faça uma cópia exata de um arquivo e transforme cada 17º bit de um arquivo de texto em 1
- Você NÃO pode transformar CADA bit do arquivo em um 1. ou seja, seu programa deve mostrar alguma inteligência de que está direcionado apenas a cada 17 bits
- Você NÃO pode gravar no arquivo original de nenhuma forma ou forma
- O vencedor é o menor envio de programa no final do mês
Divirta-se com este! Vai!
code-golf
, ou seja, o código mais curto em bytes ganha. Acode-challenge
precisa de um sistema de pontuação bem especificado. 2. Transformar cada 18 bits de um disco rígido em 1 só é possível escrevendo diretamente na unidade. Isso não pode ser conseguido criando e / ou modificando arquivos. 3. Isso fará com que toda a unidade seja inutilizada; portanto, uma solução compatível será destrutiva. Eu não sei o quão bem a comunidade vai receber um pedido para escrever malwares ...:/
Respostas:
CJam, 22 bytes
Experimente online.
Toca a cada 17º bit, contando desde o último.
Eu usei STDIN e STDOUT desde que o CJam não possui E / S de arquivo. Se isso não for permitido, o programa pode ser agrupado em um script Bash ao custo de 24 bytes extras:
Como funciona
fonte
Perl 59
substituição de expressões regulares em cadeias de bits:
uso:
fonte
b
eB
nospack
modelosC, 125
Assume números inteiros big-endian e 16 bits .
Funciona aplicando um OR bit a bit em cada dois bytes.
O arquivo de entrada é
y
, a saída éz
.Ungolfed
fonte
00000000 00000001 00000000 00000000 10000000 00000000
portanto,a
deve ser zero em determinados pontos. A máquina deve usar big endian (ou você teria em00000000 10000000
vez disso10000000 00000000
, o que daria o valor errado).c = __builtin_bswap16(c);
corrigido.Python 2, 112 bytes
Isso define cada 17º bit big endian, começando no 17º desde o início. Ele não usa bibliotecas. Ele funciona convertendo o arquivo de entrada em um
n
número inteiro de bits gigantesco e com ORing bit a bit2**n/(2**17 - 1) == 0b10000000000000000100000000000000001…
.fonte
C - 139
Lê de um arquivo chamado "i", gera um arquivo chamado "o".
Com quebras de linha:
Conta os bits de entrada e usa uma máscara de bits flutuante para definir cada décimo sétimo bit.
fonte
Java - 247
Usa um
BitSet
e um loop simples em vez de manipular / mascarar os bytes manualmente. É claro que, sendo java, o clichê é metade do programa, portanto não é exatamente curto.Ainda assim, não por último! : D
Versão sem rolagem:
fonte
Python - 98 bytes
Leia de i, escreva para o. Usa a biblioteca bitarray https://pypi.python.org/pypi/bitarray
destroçado
fonte
a[::17]=1
?from bitarray import*
ea=bitarray()
.Cobra - 308
Toda vez que faço um desses desafios de "manipular os bits individuais de algo", desejo que o Cobra ou a biblioteca padrão do .NET possuam um
binary string => integer
conversor.fonte
Javascript (+ HTML5), 282
Provavelmente não é o mais curto, mas é fácil de usar: D
É um navegador cruzado, mas parece que o chrome é o único que permite quando o arquivo html é um arquivo local (= acessar com
file://...
). Para os outros navegadores, você precisa colocá-lo em um servidor web.O arquivo de saída deve ser salvo no diretório de download padrão, talvez com um prompt de arquivos (dependendo da sua configuração).
Versão não destruída:
fonte
Python 3-187 bytes
Lê
i
e escreve parao
.Código:
Ungolfed:
fonte
Python 3-103 caracteres
Mude
f
para o caminho do arquivo que você deseja ler eo
para o caminho do arquivo em que deseja gravar.fonte