Soit f
la fonction qui mappe un champ binaire ( {0 1}
) de taille n+1
sur un champ binaire de taille n
en appliquant XOR
aux bits i
th et i+1
th et en écrivant le résultat dans le nouveau champ binaire.
Exemple: f("0101") = "111"
Calcul informel:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Soit f_inverse
la fonction inverse de f
. Étant donné que l'inverse n'est pas unique, f_inverse
renvoie une solution valide.
Entrée: champ de bits sous forme de chaîne (c'est-à-dire "0101111101011"
) et un nombre naturel donnék
Sortie: champ de bits sous forme de chaîne, de sorte que la chaîne contienne le résultat si f_inverse
est appliqué k
fois au champ de bits d'entrée. (ie f_inverse(f_inverse(f_inverse(input)))
)
Critères gagnants: le moins de personnages
Prime:
-25
Les caractères f_inverse
ne sont pas appliqués de manière récursive / itérative, mais la chaîne de sortie est directement calculée
Script de test:
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)
Vous pouvez par exemple le coller ici puis l'essayer.
{0-1}
-Bitfields? De plus, je ne comprends pas la définition def
, d'oùi
vient-il? Quel est le deuxième argument de XOR? comment pouvons-nous111
partir0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
n'explique rien: je sais comment fonctionne XOR, mais que sommes-nous exactement XORing et où stockons-nous le résultat?f([a,b,c,d]) = [a^b, b^c, c^d]
. Et il veut l'inverse de cette fonction, à savoir def'([x,y,z]) = [a,b,c,d]
telle sorte quea^b=x
,b^c=y
,c^d=z
.Réponses:
Pyth,
3330 - 25 = 5 octetsExécutez-le par entrée de stdin comme (interprète en ligne: https://pyth.herokuapp.com/ ):
et le résultat sera écrit sur stdout.
Il s'agit d'une traduction directe de:
Python 2,
12711879 - 25 = 54 octetsAppelez-le comme
i("111", 3)
et le résultat sera écrit sur stdout.Notez que nous nous attendons à ce que k ne soit pas trop grand, car à des fins de code-golf, la boucle intérieure fonctionnera pendant O (2 k ) fois.
Je pense que nous appelons généralement cette opération "xorshift" ou quelque chose. Si nous exprimons l'entrée sous forme d'entiers big-endian, alors la fonction f est simplement:
Si nous appliquons f deux fois, nous obtiendrons:
Cependant, appliquer 3 fois aura un schéma différent:
Appliquer 4 fois revient au formulaire de base:
Etc:
Notez que si nous choisissons un 2 k assez grand , alors (x ≫ 2 k ) = 0, signifiant f 2 k (x) = x, et l'inverse est trivialement la fonction d'identité!
Ainsi , la stratégie pour trouver f -k (x) sans appeler f -1 (x) tout est:
Trouvez K tel que:
Express f -k (x) = f -K + (Kk) (x) = f -K (f K-k (x)) = f K-k (x)
Ainsi, le résultat est
f
appelé Kk fois25 caractères: p
Mise à jour 1 : représentation octale utilisée au lieu de binaire afin que nous puissions utiliser le
%
formatage pour enregistrer de nombreux octets.Mise à jour 2 : exploiter la structure périodique de
f
. Retiré la version itérative car la version non itérative est plus courte même sans le bonus de -25 octets.Mise à jour 3 : réduction de 3 octets de Pyth, merci isaacg!
la source
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 octetsPrend l'entrée comme
Testez-le ici.
Explication
Le résultat est imprimé automatiquement à la fin du programme.
Je dis "chaîne / tableau", parce que je commence par une chaîne (qui n'est qu'un tableau de caractères), mais je continue de prendre des XOR entre eux et entre les nombres également.
Character Character ^
donne un entier (basé sur le XOR des points de code)Character Integer ^
etInteger Character ^
donne un caractère (basé sur le XOR du nombre avec le point de code - interprété comme un point de code). EtInteger Integer ^
bien sûr, donne juste un entier.Donc, les types volent partout, mais heureusement, chaque fois que j'ai un entier, c'est soit
0
ou1
et chaque fois que j'ai un caractère, c'est soit'0
et'1
et le résultat est toujours celui souhaité (dans l'un ou l'autre type). Étant donné que les chaînes ne sont que des tableaux de caractères, le mélange de caractères avec des nombres n'est pas du tout un problème. Et à la fin, lorsque tout est imprimé, les caractères ne reçoivent aucun délimiteur spécial, de sorte que la sortie n'est pas affectée par le bit représenté sous la forme d'un nombre ou d'un caractère.la source
J, 17 caractères
Toujours en utilisant 0 comme premier chiffre.
À partir de l'état 128 1 de la ligne supérieure (à gauche) et d'un état aléatoire (à droite), montrant les 128 derniers chiffres jusqu'à la première 129 itération.
la source
APL 11
Explication:
Essayez sur tryapl.org
la source
≠\
ne fonctionnerait pas à la place de2|+\
?((0,≠\)⍣⎕)⎕
j'obtiens un jeton non valide. Tryapl ne peut pas gérer les entrées?CJam, 25 - 25 = 0 octet
Ceci est juste un port CJam direct de la réponse GolfScript ci-dessous, car, après avoir lu la réponse de Martin Büttner , j'ai réalisé que je pouvais économiser un octet grâce à la gestion par CJam des types d'entiers et de caractères. (Fondamentalement, CJam n'a pas besoin de l'
1&
utilisé pour forcer les caractères ASCII en bits dans le code GolfScript, mais nécessite un préfixeq
pour lire l'entrée.) il vaut bien l'OMI.Dans tous les cas, ce programme fonctionne exactement comme le programme GolfScript d'origine ci-dessous, veuillez donc vous référer à sa description et à ses instructions d'utilisation. Comme d'habitude, vous pouvez tester la version CJam à l'aide de cet interprète en ligne .
GolfScript, 26 - 25 = 1 octet
Cette solution n'itère la chaîne d'entrée qu'une seule fois, donc je pense qu'elle est admissible au bonus de -25 octets. Il fonctionne en maintenant en interne un tableau à k éléments qui stocke le bit actuel de chacun des k pré-itérations.
L'entrée doit être donnée via stdin, au format
"1111111" 3
, c'est-à-dire sous la forme d'une chaîne de caractères0
et de guillemets1
, suivie du nombre k . La sortie sera vers stdout, comme une chaîne de bits sans guillemets.Testez ce code en ligne. (Si le programme arrive à expiration, essayez de le relancer; le serveur Web GolfScript est connu pour les délais d'expiration aléatoires.)
Voici une version étendue de ce programme, avec des commentaires:
Fondamentalement, comme la plupart des solutions itératives, ce code peut être compris comme appliquant la récurrence
b i , j : = b i , ( j -1) ⊕ b ( i -1), ( j -1) ,
où b 0, j est le j- ème bit d'entrée (pour j ≥ 1), b k , j est le j- ème bit de sortie, et b i , 0 = 0 par hypothèse. La différence est que, alors que les solutions itératives, en fait, calculent la récurrence "ligne par ligne" (c'est-à-dire d'abord b 1, j pour tout j , puis b 2, j , etc.), cette solution la calcule plutôt "colonne par colonne "(ou, plus précisément," diagonale par diagonale "), calculant d'abord b i , i pour 1 ≤ i≤ k , puis b i , i +1 , puis b i , i +2 , etc.
Un avantage (théorique) de cette approche est que, en principe, cette méthode peut traiter une chaîne d'entrée arbitrairement longue en utilisant uniquement le stockage O ( k ). Bien sûr, l'interpréteur GolfScript lit automatiquement toutes les entrées en mémoire avant d'exécuter le programme de toute façon, annulant principalement cet avantage.
la source
Python,
9478Sera exécuté au moins une fois et donne donc le même résultat pour
n=0
etn=1
Ancienne version qui convertit la chaîne en un tableau numérique et "intègre" le modulo 2
la source
Python 2, 68
Une solution totalement récusive. Il est plus facile à comprendre s'il est divisé en deux fonctions
où
f
calcule les différences successives etg
composef
avec lui-même n fois.La fonction
f
calcule les sommes XOR cumulées del
, qui est l'opération inverse des différences XOR successives. Puisque l'entrée est donnée sous forme de chaîne, nous devons extraireint(l[0])
, mais le faire plus court avec la comparaison de chaînesl>='1'
.Python 2, 69
Une solution itérative utilisant une
exec
boucle s'est avérée 1 caractère plus longue.Il existe peut-être un moyen plus court de gérer la chaîne. Si nous pouvions avoir des entrées / sorties sous forme de listes de nombres, cela économiserait 5 caractères
la source
Perl 5, 34
Paramètres donnés sur l'entrée standard séparés par un espace.
la source
Javascript ES6, 47 caractères
Au fait, il n'y a pas d'effets secondaires :)
la source
C # -
178161115 caractèresNon golfé avec harnais
la source
CJam, 20 octets
L'entrée est comme
"111" 3
Essayez-le en ligne ici
la source