Octave, 53 52 octets
Faire une réécriture complète m'a aidé à jouer au code 5 octets, mais j'ai dû ajouter plus d'opérations, ce qui en fait une sauvegarde nette de seulement 1 octet.
@(_)~diff(sum(de2bi(+_)))%RRPPPVVVW?????????________
Je ne peux pas ajouter de lien TIO, car aucun des interprètes en ligne n'a implémenté la boîte à outils de communication nécessaire pour de2bi
. Le dec2bin
remplacer à la place coûterait 4 octets (2 pour le code de travail et deux no-ops).
Je n'ai trouvé aucun moyen d'éviter l'un des 27 no-ops. Tous les noms de fonction et les parenthèses sont compris entre 64 et 96, ce qui signifie que tous les caractères "nécessaires" ont un 1 en 6ème position (à partir de la droite, 2 ^ 5). J'avais une solution avec seulement 23 no-ops, mais le code lui-même était plus long. Le code réel est de 25 octets et a la somme de colonnes suivante lors du comptage des bits de l'équivalent binaire:
15 22 6 15 10 9 13
Il y a 22 bits en 6ème position à partir de la droite (2 ^ 5), et seulement 6 bits en 4ème position à partir de la droite (2 ^ 3). Cela signifie que nous devons ajouter au moins 16 octets, pour obtenir le 6 jusqu'à 22. Maintenant, le caractère de commentaire %
ajoute un peu à la 6e position, en l'augmentant à 23. Tous les caractères ASCII imprimables ont besoin d'au moins l'un des deux bits supérieurs à être 1
. Par conséquent, l'ajout de 17 octets nous donnera au moins 27 bits dans chacun des deux "premiers spots" (2 ^ 6 et 2 ^ 5). Maintenant, nous avons 27 bits dans les deux premières places et 22 dans les autres. Afin d'arriver à un équilibre, nous devons ajouter 10 octets, pour arriver à un même 32 bits dans chaque position.
Une explication du nouveau code (52 octets):
@(_)~diff(sum(de2bi(+_)))
@(_) % An anonymous function that take a variable _ as input
% We use underscore, instead of a character, since it has the
% most suitable binary represetation
de2bi(+_) % Convert the input string to a binary matrix
sum(de2bi(+_)) % Take the sum of each column
diff(sum(de2bi(+_))) % And calculate the difference between each sum
~diff(sum(de2bi(+_))) % Negate the result, meaning 0 becomes true,
% and everything else becomes false
Un vecteur contenant seulement 1s (vrai) est évalué comme vrai en octave, et un vecteur contenant au moins un zéro est évalué comme faux en octave.
Une explication de l'ancien code (53 octets):
@(_)!((_=sum(de2bi(+_)))-_(1))%RRRFVVVVVVVVV_____????
@(_) % An anonymous function that take a variable _ as input
% We use underscore, instead of a character, since it has the
% most suitable binary represetation
! % Negate the result, meaning 0 becomes true, and everything else becomes false
de2bi(+_) % Convert the input string to a binary matrix
sum(de2bi(+_)) % Take the sum of each column
(_=sum(de2bi(+_))) % Assign the result to a new variable, also called _
% It's not a problem that we use the same variable name, due
% to the order of evaluation
((_=sum(de2bi(+_)))-_(1)) % Subtract the first element of the new variable _
% If all elements of the new variable _ are identical, then this
% should give us a vector containing only zeros,
% otherwise, at least one element should be non-zero
!((_=sum(de2bi(+_)))-_(1)) % And finally, we negate this.
Un vecteur contenant seulement 1s (vrai) est évalué comme vrai en octave, et un vecteur contenant au moins un zéro est évalué comme faux en octave.