Let f
Ser a função que mapeia um bitfield ( {0 1}
) de tamanho n+1
para bitfield de tamanho n
aplicando XOR
ao i
th th e i+1
th bit e gravando o resultado no novo bitfield.
Exemplo: f("0101") = "111"
Cálculo informal:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Let f_inverse
Ser a função inversa de f
. Como o inverso não é exclusivo, f_inverse
retorna uma solução válida.
Entrada: campo de bits como string (ou seja "0101111101011"
) e um número natural especificadok
Saída: campo de bits como sequência, para que a sequência contenha o resultado se f_inverse
for aplicada k
vezes ao campo de bits de entrada. (ie f_inverse(f_inverse(f_inverse(input)))
)
Critérios para ganhar: menos caracteres
Bônus:
-25
Caracteres se f_inverse
não é aplicada de forma recursiva / iterativa, em vez da cadeia de saída está diretamente calculado
Teste:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Você pode colá-lo, por exemplo, aqui e tentar.
{0-1}
-Bitfields? Também não entendo a definição def
, de ondei
vem? Qual é o segundo argumento do XOR? como é que vamos111
partir0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
não explica nada: eu sei como o XOR funciona, mas o que exatamente nós estamos usando e onde estamos armazenando o resultado?f([a,b,c,d]) = [a^b, b^c, c^d]
. E ele quer o inverso dessa função, ou seja,f'([x,y,z]) = [a,b,c,d]
de tal forma quea^b=x
,b^c=y
,c^d=z
.Respostas:
Pyth,
3330 - 25 = 5 bytesExecute-o com a entrada de stdin como (intérprete online: https://pyth.herokuapp.com/ ):
e o resultado será gravado em stdout.
Esta é uma tradução direta de:
Python 2,
12711879 - 25 = 54 bytesChame assim
i("111", 3)
, e o resultado será gravado em stdout.Observe que esperamos que k não seja muito grande, pois, para fins de golfe com código, o loop interno será executado por O (2 k ) vezes.
Eu acho que geralmente chamamos essa operação de "xorshift" ou algo assim. Se expressarmos a entrada como números inteiros big-endian, a função f é simplesmente:
Se aplicarmos f duas vezes, obteremos:
No entanto, a aplicação de 3 vezes terá um padrão diferente:
Ao aplicar 4 vezes, volte ao formulário básico:
E assim por diante:
Observe que se escolhermos 2 k grandes o suficiente , então (x ≫ 2 k ) = 0, ou seja, f 2 k (x) = x, e o inverso é trivialmente a função de identidade!
Assim, a estratégia para encontrar f k (x) sem chamar f -1 (x) em tudo é:
Encontre K tal que:
Expresse f -k (x) = f -K + (Kk) (x) = f -K (f K-k (x)) = f K-k (x)
Assim, o resultado é
f
chamado Kk vezesLucro de 25 caracteres: p
Atualização 1 : representação octal usada em vez de binária, para que pudéssemos usar a
%
formatação para economizar muitos bytes.Atualização 2 : Explorar a estrutura periódica de
f
. A versão iterativa foi desativada, já que a não iterativa é mais curta, mesmo sem o bônus de -25 bytes.Atualização 3 : Redução de 3 bytes do Pyth, obrigado isaacg!
fonte
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 bytesToma entrada como
Teste aqui.
Explicação
O resultado é impresso automaticamente no final do programa.
Eu digo "string / array", porque começo com uma string (que é apenas uma matriz de caracteres), mas continuo tendo XORs entre eles e também entre números.
Character Character ^
fornece um número inteiro (com base no XOR dos pontos de código)Character Integer ^
eInteger Character ^
fornece um caractere (com base no XOR do número com o ponto de código - interpretado como um ponto de código). E,Integer Integer ^
claro, apenas fornece um número inteiro.Portanto, os tipos estão voando por todo o lado, mas, felizmente, sempre que eu tenho um número inteiro, é um
0
ou outro1
e sempre que tenho um caractere, é um'0
e'1
e o resultado é sempre o desejado (em qualquer tipo). Como cadeias de caracteres são apenas matrizes de caracteres, misturar caracteres com números não é um problema. E no final, quando tudo é impresso, os caracteres não recebem delimitadores especiais; portanto, a saída não é afetada pelo bit que é representado como um número ou um caractere.fonte
J, 17 caracteres
Sempre usando 0 como o dígito inicial.
A partir do estado dos 128 1 da linha superior (esquerda) e de um estado aleatório (direita), mostrando os últimos 128 dígitos na primeira iteração 129.
fonte
APL 11
Explicação:
Experimente em tryapl.org
fonte
≠\
não funcionaria em vez de2|+\
?((0,≠\)⍣⎕)⎕
, recebo um token inválido. Tryapl não pode lidar com entradas?CJam, 25 - 25 = 0 bytes
Esta é apenas uma porta CJam direta da resposta GolfScript abaixo, pois, depois de ler a resposta de Martin Büttner , percebi que poderia salvar um byte devido ao manuseio de tipos inteiros e de caracteres por CJam. (Basicamente, o CJam não precisa do
1&
usado para forçar caracteres ASCII em bits no código GolfScript, mas requer um prefixoq
para ler a entrada.) Normalmente, consideraria essa porta trivial um truque barato, mas atingir uma pontuação zero IMO vale a pena.De qualquer forma, este programa funciona exatamente como o programa GolfScript original abaixo; portanto, consulte as instruções de descrição e uso. Como de costume, você pode testar a versão do CJam usando esse intérprete online .
GolfScript, 26 - 25 = 1 byte
Essa solução repete a string de entrada apenas uma vez, então acredito que se qualifica para o bônus de -25 bytes. Ele funciona mantendo internamente uma matriz de elementos k que armazena o bit atual de cada uma das k pré-iteradas.
A entrada deve ser fornecida via stdin, no formato
"1111111" 3
, ou seja, como uma seqüência de caracteres0
e citada1
, seguida do número k . A saída será stdout, como uma cadeia de bits sem aspas.Teste este código online. (Se o programa atingir o tempo limite, tente executá-lo novamente; o servidor Web GolfScript é notório por intervalos aleatórios.)
Aqui está uma versão expandida deste programa, com comentários:
Basicamente, como a maioria das soluções iterativas, esse código pode ser entendido como aplicando a recorrência
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
onde b 0, j é o j- ésimo bit de entrada (para j ≥ 1), b k , j é o j- ésimo bit de saída e b i , 0 = 0 por suposição. A diferença é que, enquanto as soluções iterativas, na verdade, calculam a recorrência "linha por linha" (ou seja, primeiro b 1, j para todos os j , depois b 2, j , etc.), essa solução a computa "coluna por coluna "(ou, mais precisamente," diagonal por diagonal "), primeiro calculando b i , i para 1 ≤ i≤ k , então b i , i +1 , então b i , i +2 , etc.
Uma vantagem (teórica) dessa abordagem é que, em princípio, esse método pode processar uma sequência de entrada arbitrariamente longa usando apenas armazenamento O ( k ). Obviamente, o intérprete GolfScript lê automaticamente toda a entrada na memória antes de executar o programa, negando essa vantagem.
fonte
Python,
9478Será executado pelo menos uma vez e, portanto, fornece o mesmo resultado para
n=0
en=1
Versão antiga que converte a string em uma matriz numérica e "integra" o módulo 2
fonte
Python 2, 68
Uma solução totalmente recusativa. É mais fácil entender se dividido em duas funções
onde
f
calcula diferenças sucessivas eg
compõef
consigo mesmo n vezes.A função
f
calcula as somas XOR cumulativas del
, que é a operação inversa para diferenças XOR sucessivas. Como a entrada é fornecida como uma string, precisamos extrairint(l[0])
, mas faça isso mais curto com a comparação de stringsl>='1'
.Python 2, 69
Uma solução iterativa usando um
exec
loop resultou em 1 caractere a mais.Talvez haja uma maneira mais curta de lidar com a corda. Se pudéssemos ter entradas / saídas como listas de números, economizaria 5 caracteres
fonte
Perl 5, 34
Parâmetros dados na entrada padrão separados por um espaço.
fonte
Javascript ES6, 47 caracteres
By the way, não há efeitos colaterais :)
fonte
C # -
178161115 caracteresUngolfed with harness
fonte
CJam, 20 bytes
Entrada é como
"111" 3
Experimente online aqui
fonte