Moi pense qu'il n'y a pas assez de questions faciles ici que les débutants peuvent essayer!
Le défi: Avec une chaîne d'entrée aléatoire composée de 1 et de 0 tels que:
10101110101010010100010001010110101001010
Ecrivez le code le plus court qui produit l'inverse en bits, comme suit:
01010001010101101011101110101001010110101
=&'0'
fonctionne pour le même nombre d'octets.GolfScript , 5 octets
Essayez-le en ligne.
Comment ça fonctionne
GolfScript lit l'intégralité de l'entrée de STDIN et la place sur la pile en tant que chaîne.
{}%
parcourt tous les caractères de la chaîne et exécute le bloc de code pour chacun d'eux.1^
calcule le OU exclusif des caractères du code ASCII avec 1. «0» correspond au code ASCII 48, «1» au code ASCII 49.Depuis
48 ^ 1 = 49
et49 ^ 1 = 48
, cela transforme les 0 en 1 et les 1 en 0.Une fois terminé, GolfScript imprime la chaîne modifiée.
la source
CJam - 4
Chaque caractère de
ce x est composé de 1. À la différence de l'autre réponse de CJam, je ne suppose pas que l'entrée est déjà sur la pile.
Essayez-le sur http://cjam.aditsu.net/
la source
f
.Code machine x86 sous DOS -
141311 octetsEh bien, il est devenu plus court encore! Après avoir écrit une solution pour un défi sans rapport , j'ai remarqué que le même truc pouvait être appliqué même ici. Alors on y va:
Assemblée commentée:
Solution précédente - 13 octets
Je pense que ça ne devient pas beaucoup plus court que ça.En fait, ça l'a fait! Merci à @ninjalj pour avoir supprimé un octet de plus.Cette version propose une interactivité avancée ™ - après son exécution à partir de la ligne de commande, elle crache les caractères "inversés" tant que vous écrivez les chiffres saisis (qui ne sont pas répercutés). pour sortir, faites juste un Ctrl-C.
Contrairement à la solution précédente, cela ne fonctionne pas correctement dans DosBox. DosBox ne prenant pas correctement en charge la combinaison de touches Ctrl-C , vous êtes obligé de fermer la fenêtre DosBox si vous souhaitez quitter. Dans une machine virtuelle avec DOS 6.0, il s'exécute comme prévu.
Source NASM:
Ancienne solution -
272522 octetsCela acceptait sa saisie depuis la ligne de commande; fonctionne correctement en tant que fichier .COM dans DosBox.
Entrée NASM:
la source
xchg dx,ax
est 1 octet plus court quemov dl,al
Bash + coreutils, 8 octets
Prend l'entrée de STDIN.
Ou
sed, 8 octets
la source
y 01 10
tr
...CJam , 4 octets
Suppose que la chaîne d'origine est déjà sur la pile. Imprime la chaîne modifiée.
Essayez-le en ligne en collant le code suivant :
Comment ça fonctionne
:~
évalue chaque caractère de la chaîne, c'est-à-dire qu'il remplace le caractère 0 par l' entier 0.:!
calcule le NON logique de chaque entier. Cela transforme les 0 en 1 et les 1 en 0.la source
Brainfuck (
7071)Explication:
la source
a
pour11
.PHP - 19 octets
Oui, pas vraiment original, je suppose!
la source
Pile de crêpes , 532 octets
Cela suppose que l’entrée se termine par un caractère nul. La stratégie est la suivante:
1
de celle-ci.0
(donnant un1
si nous avions0
, ou un0
si nous avions1
)0
luila source
C: 29
Essayez-le en ligne ici .
Merci d'avoir signalé l'astuce XOR, Dennis.
la source
i(char*s){while(*s)*s++^=1;}
while
avec unfor
résultat fixe d'une longueur de 28 caractères.Python 2.7 - 34 *
Oh, combien ce premier est nul. Assez moche, celui-ci est. 63 caractères.
Celui-ci est un peu mieux mais toujours pas aussi sophistiqué. 44 caractères.
Depuis
int(x) and 1
renvoieint(x)
si ce n'est pas 0 et sinon Faux. La solution peut encore être réduite à 36 caractères.Depuis
join()
prend un générateur, les supports peuvent être supprimés. 32 caractères.Et les backticks peuvent être utilisés à la place de
str()
Réduit à 44 contre 34 grâce aux indications de @TheRare
Trouver son complément est difficile en python puisque
bin(-int)
renvoie -0bxxx d’où ce qui précède.la source
(int(x) and 1) == int(x)
'' == False
et'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
pour x <maxint est égal àstr(x)
Perl, 9 caractères
Le 9ème caractère est le drapeau 'p'
Usage:
la source
y/10/01/
mais un caractère plus court car il n'a pas besoin de drapeauxJavascript ( ES6 ) 36
la source
s
, ils.replace(/./g,x=>x^1)
y a 22 caractères.p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
et c'est la même longueur.Labyrinthe , 6 octets
(Le labyrinthe est plus récent que ce défi, donc cette réponse n'est pas concurrente - ce n'est pas qu'elle gagne de toute façon ...)
Ce code suppose que STDIN ne contient que les chiffres (en particulier, pas de nouvelle ligne).
Le pointeur d'instruction (IP) commence dans le coin supérieur gauche en allant à droite. Alors qu'il y a des chiffres à lire, il parcourt en boucle étroite le bloc 2x2 de gauche:
1
appuyez sur un 1,,
lisez un chiffre,$
XOR avec 1 pour alterner le dernier bit,.
imprimez le résultat. L'IP prend cette boucle parce que le haut de la pile est positif après le XOR, de sorte qu'il tourne à droite. Quand nous touchons EOF,,
retourne à la-1
place. Ensuite, le XOR va céder-2
et avec cette valeur négative l’IP tourne à gauche@
et le programme se termine.Cette solution devrait être optimale pour Labyrinth: vous avez besoin
,
et.
pour une boucle d'E / S et@
pour terminer le programme. Vous avez besoin d'au moins deux caractères (ici1
et$
) pour basculer le dernier bit. Et vous avez besoin d'au moins une nouvelle ligne pour une boucle pouvant être terminée.Sauf si ... si nous ignorons STDERR, c'est-à-dire, si nous terminons par une erreur, nous pouvons enregistrer le fichier
@
et nous n'avons également besoin d'aucun moyen de basculer entre deux chemins. Nous continuons simplement à lire et à imprimer jusqu'à ce que nous essayions accidentellement d'imprimer une valeur négative (la-2
). Cela permet au moins deux solutions de 5 octets:la source
Rubis: 23
la source
Code machine de Turing, 32 octets (1 état - 3 couleurs)
Utilisation de la syntaxe de table de règles requise par ce simulateur de MT en ligne. Emprunté à un article que j'ai publié il y a quelques mois sur mon blog d'utilisateur Googology Wiki.
Vous pouvez également tester cela en utilisant cette implémentation Java.
la source
Python 2.x - 44 octets
Pourquoi le rendre complexe, ou utiliser des variables tricheuses?
la source
print''.join('1-int(x)'for x in'input()')
. Je ne pouvais pas obtenir les backticks dans le code de commentaire, donc les substitué par '.`a\`b`
->a`b
.R, 27 caractères
Usage:
la source
APL (Dyalog Unicode) , SBCS 7 octets
Programme complet. Invite stdin.
Essayez-le en ligne!
⍞
invite stdin⍎¨
exécuter chaque personnage~
pas logique⍕¨
formater chaque caractère en texte∊
ε nlist (aplatir)la source
PHP> 5.4 - 37 caractères
$s
est l'entréeTry it online
la source
<kbd>
balise.TI-BASIC, 7 octets
Il s'agit d'une fonction qui prend une chaîne binaire (de bout en bout
Ans
) en entrée et renvoie la sortie sous forme de chaîne inversée (non inversée), comme spécifié. Pour plus d’aide, vous pouvez consulter l’application de listenot(
sur le wiki TI-BASIC. J'utilise la version compilée car elle est plus petite:En hex:
Explication
»*r
- Prendre la fonction entrée sous forme de chaîne et convertir en liste>
- Pipe liste donnée aux opérateurs suivantsÕ¸r
- Retourne l'inverse de la listela source
»*r>Õ¸r
?expr(Ans:Returnnot(Ans
: 2.{
Etant donné que la chaîne n'est pas séparée par des virgules et qu'elle ne commence pas par un , elle sera évaluée en un entier tel que 1000010011 et non en une liste. 3.Return
ne fonctionne pas comme vous l'avez écrit; 4. Cela donne la sortie sous forme de liste, pas de chaîne.Haskell, 22 octets
J'ai été surpris par le manque de solutions Haskell à ce défi, alors en voici une. Il est évalué à une fonction qui prend une chaîne et renvoie son inverse.
Explication
Rien d'extraordinaire ici.
la source
Befunge 93, 25 octets
En supposant que la pile vide et EOF lisent -1.
0
pousse un \ 0 en tant que terminateur nul>~1+:#v_
est une boucle d’entrée, lit ascii, ajoute 1, vérifie si EOF + 1 = 0,^ -1<
sinon, soustrait 1 et laisse la valeur ascii poussée sur la pile.$>:#,_@
dépose la copie supplémentaire de zéro en haut de la pile, puis imprime la chaîne binaire de haut en basSi la pile vide lit 0, sauvegardez 2 octets avec
Une version d'environ 15 octets est possible en utilisant le même algorithme si EOF = 0, mais je ne dispose pas d'une telle implémentation pour tester.
la source
Javascript ES6, 26 caractères
la source
Befunge-98 (PyFunge) , 7 octets
Pour chaque caractère,
c
dans l'entrée, il imprime le caractère avec une valeur ascii de94 - c
, où 94 est la valeur de '0' + '1' ou 'a'Essayez-le en ligne!
la source
Python3, 39
Methinks Python n’est pas le meilleur langage pour cela. :)
Si vous souhaitez avoir une nouvelle ligne après la sortie, voici une alternative à 43 caractères:
la source
end=''
juste,
fera :) - à moins que vous souciez d'être là sans espaceprint
fonction de Python3 nécessite de modifier leend
paramètre pour supprimer une nouvelle ligne à la fin de chaque impression. De plus, selon les spécifications de OP, je pense que je tiens à l'absence d'espaces. :) Merci pour le commentaire, cependant!J - 11 caractères
Les valeurs booléennes en J sont représentées par les nombres entiers
0
et1
, qui sont bien sûr aussi des indices valides dans les tableaux (dans ce cas, le tableau à 2 caractères'01'
)la source
C #, 131 octets
Un peu tard pour la fête, mais voici le mien. :)
la source
MATLAB, 13 octets
Après avoir exécuté ce qui précède, appelez simplement la fonction avec votre chaîne d’entrée pour obtenir la chaîne inversée. Par exemple en cours d'exécution:
impressions:
la source
Moteur Bot , 4x8 = 32
Non compétitif car la langue postdate la question.
Avec en surbrillance:
la source