Cela semble être une tâche impossible, non? En fait, ce n'est pas si difficile. Si nous écrivons le mot Infinity
sous forme de code ASCII binaire 8 bits, nous aurons:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Cela peut être concaténé et converti en valeur décimale 5291279215216915577
. Voilà un nombre avec lequel nous pouvons travailler ...
Le compte à rebours est:
- Afficher la chaîne d'origine sous forme de nombre décimal (comme indiqué ci-dessus)
- Supprimer les 0 premiers dans sa représentation binaire (le cas échéant)
- Basculer les bits dans la représentation binaire (1-> 0, 0-> 1)
- Affiche le nombre en décimal
- Répétez les étapes 2 à 4 jusqu'à ce que vous atteigniez 0.
Défi:
Créez un programme ou une fonction qui prend une chaîne en tant qu'entrée et génère (sous n'importe quel format approprié) les nombres que vous obtiendrez en effectuant la procédure ci-dessus.
Cas de test:
Je pense que le défi sera assez facile à comprendre, même s'il ne s'agit que d'un cas test. Je vais utiliser Inf
au lieu de Infinity
garder cela assez court.
Inf
4812390 (10010010110111001100110)
3576217 ( 1101101001000110011001)
618086 ( 10010110111001100110)
430489 ( 1101001000110011001)
93798 ( 10110111001100110)
37273 ( 1001000110011001)
28262 ( 110111001100110)
4505 ( 1000110011001)
3686 ( 111001100110)
409 ( 110011001)
102 ( 1100110)
25 ( 11001)
6 ( 110)
1 ( 1)
0 ( 0)
Input: Inf
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0
Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0
Votre code doit prendre en charge des chaînes pouvant être représentées sous la forme d'un nombre binaire dans la limite de votre langue. Toutes les chaînes ne contiendront que des caractères ASCII imprimables compris entre 32 et 126 (espace au tilde).
Classement
var QUESTION_ID=98274,OVERRIDE_USER=31516;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Inf:-1:0
∞..0
Réponses:
Gelée ,
15 à10 octets-5 octets grâce à @Dennis (converti directement à partir de la base 256 après la conversion ordinale)
TryItOnline!
Comment?
la source
Oḅ⁹
.Python 2,
8982777675 octetsTestez-le sur Ideone .
Comment ça fonctionne
Après l’initialisation de n à 0 , la deuxième ligne effectue la conversion de chaîne en entier spécifiée dans les défis comme suit.
À chaque étape, n est décalé de 8 unités vers la gauche, puis OR au bit près avec le point de code du caractère suivant c . Pour l'entrée Inf , ceci va comme suit.
Nous sommes maintenant prêts à générer la sortie. Pour inverser les bits de n , on procède comme suit.
Premièrement, nous calculons les bits dans la représentation binaire de n sans les zéros au début. Appelons le résultat k . Ensuite, nous calculons la k k puissance de 2 , qui a k + 1 chiffres binaires: un seul 1 , suivi de k 0 . Nous soustrayons 1 du résultat, ce qui donne un nombre composé de k unités, que nous avons ensuite XOR avec n pour inverser ses bits. Pour l'entrée inf, cela va comme suit.
Un obstacle supplémentaire à la mise en œuvre est que nous devons imprimer n avant la première étape, après la dernière étape et dans toutes les étapes intermédiaires. Python n'a pas de boucle do-while et une seule déclaration d' impression coûte 8 octets. Nous procédons donc comme suit.
Dans la simple mise en œuvre de l'étape de mise à jour, c'est-à-dire
nous remplaçons la boucle par un infini (
while 1
) et calculons la1
dans la boucle commen/n
. Ceci est équivalent lorsque n> 0 .Une fois que n = 0 , nous restons dans la boucle, imprimons l'état une fois de plus, puis essayons de le mettre à jour. Cependant,
0/0
déclenche une erreur ZeroDivisionError , qui se détache de la boucle et se termine avec une erreur. Notez que cela entraîne une sortie parasite vers STDERR, autorisée par défaut .la source
-n/n
astuce :-)n/n
truc? Cela a probablement été expliqué dans une autre réponse quelque part mais je ne l'ai pas trouvée. Que fait-il ici?JavaScript, 82 octets
Enregistré un octet grâce à @Arnuald
Une des rares fois où un programme complet surpasse une fonction (et ES6 ne surpasse pas ES5) ...
Ce qui précède prend en charge les mots de 4 lettres maximum. Ajoutez 4 octets pour prendre en charge les mots de 6 lettres maximum:
la source
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
devrait sauver un octet.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
économiserait un autre octet, mais vous n’affichez pas0
, ce qui est probablement nécessaire.n<<8
plus tôt, mais j'ai décidé que cela ne fonctionnerait pas, car cela cassait pour n avec plus de 31 bits. Je suppose que ça ne fait rien, maintenant que je l'ai déjà partagé entre une version 31 bits et une version 53 bits ... itération et le dernier.En fait , 14 octets
Essayez-le en ligne!
Explication:
la source
05AB1E , 18 octets
Utilise le codage CP-1252 .
Essayez-le en ligne!
Explication
la source
MATL , 13 octets
Essayez-le en ligne!
Explication
la source
Mathematica, 99 octets
Fonction anonyme. Prend une chaîne en entrée et renvoie une liste de nombres en sortie.
la source
Haskell,
10912311810297 octetsMerci à @nimi pour avoir économisé 5 octets!
Usage:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Garanti de travailler sur des nombres allant jusqu'à 29 bits en fonction de la langue, fonctionne généralement jusqu'à des nombres de 63 bits sur des systèmes 64 bits. Utilisation
map(fromIntegral.fromEnum)
plutôt (+14 octets) pour prendre en charge des nombres arbitrairement grands.Fonctionne pour la plage unicode
[0..255]
. Retourne les bits récursivement.la source
takeWhile(>0)
avecfst.span(>0)
. Si vous choisissez Pointfree, vous pouvez supprimer le nomf
. Votre fonction principale est alors(++[0]) ... map fromEnum
.f
.fromIntegral
? D'après le défi: "doit supporter ... jusqu'à 63 bits ... ou la limite de votre langue", çaInt
devrait aller. Si vous souhaitez le conserver, déplacez-le versmap
, c'est- à -dire votre ancienne version defoldl1
etmap(fromIntegral.fromEnum)
.PHP,
132126123120108107 octetsunpack
au lieu destr_split
rendord()
obsolète -> -3 octets_
comme séparateur enregistre 3.bindec
au lieu deltrim
supprimer les zéros de gauche: -12echo
in Loop corps économise 1 octetprint
dans la tête de boucle.la source
$n=$n*256+$i;for(print$n;$n;)
être écrit commefor(print$n=$n*256+$i;$n;)
? Puisque la partie assignation sera exécutée une fois, cela devrait fonctionner. Et au lieu deecho _.$n=[...]
, vous devriez utiliser à laecho _,$n=[...]
place. Cela ne sauvera aucun octet, mais accélérera le code un tout petit peu et séparera les déclarations. Cela signifie que, par exemple,echo _,$a?5:6;
peut être écrit à la place deecho _.($a?5:6);
. Cela peut être utile dans le futur.print
dans ce cas. Seul ne vaut pas une édition; mais merci.foreach(unpack("C*",$argv[1])as$i)
... stupide moi ... Et oui, changer le point pour qu'une virgule ait le même effet ne vaut pas la peine.Perl, 65 octets
Code 53 octets + 12 pour
-Mbigint -p
.Merci à @ Dada de m'avoir sauvé 13 octets!
Une approche assez simple, mais différente de la plupart d'entre eux, est que le nombre est stocké sous forme binaire et imprimé en décimal. Je suis sûr que cela peut être amélioré, peut-être en stockant les détails dans un tableau.
-Mbigint
est un peu gênant mais nécessaire.Usage
la source
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(Je ne sais pas comment utiliser unpack habituellement, je viens d'avoir de la chance en recherchant comment convertir une chaîne en binaire ;-))unpack
la syntaxe qui m'échappe toujours! Je vais mettre à jour, merci!echo -n
est le seul autre changement.Pyth, 12 octets
Un programme qui prend en entrée une chaîne entre guillemets et affiche le résultat sous forme de liste d'entiers.
Vérifier tous les cas de test
Comment ça fonctionne
la source
Python 3,
9995 octetsL'idée principale est de convertir une chaîne d'octets en nombre. Chaque itération imprime la sortie et XOR avec tous les 1 pour progresser vers zéro.
la source
2**x.bit_length()-1
. L'ordre des opérations pour la puissance et la soustraction est supérieur à xor. En outre, celawhile
peut être sur une seule ligne.P=print
, puis d'utiliser à laP()
place deprint()
Python 2,
117115 octetsEnregistrement de 2 octets grâce à Cyoce.
Suppose que les entrées sont entre guillemets, par exemple
"Inf"
m
compte jusqu'au chiffre le plus élevé, doncm-1
qu'un masque XOR pour effectuer l'opération souhaitée. La partie la plus longue convertit l’entrée en séquence de bits initiale.Exemple:
la source
-i-1
par~i
Ruby,
104101100818065 octets19 octets sauvés grâce à @WayneConrad!
15 octets sauvés grâce à @philomory!
1 octet enregistré grâce à @LeeW!
Prend la saisie via des arguments en ligne de commande.
Inspiré par la réponse de JimmyJohnson en Python
la source
i.to_s(2).rjust 8,'0'
par"%08b"%i
inject(:+)
peut être remplacé parjoin
unpack
suivi de[0]
plutôt que de jouer avecgsub
économisera 11 octets. Passer à la$*[0]
place degets.chop
(en utilisant un argument de ligne de commande au lieu d'une entrée de console) économisera un autre 9, la première ligne devientp n=$*[0].unpack('B*')[0].to_i(2)
.Labyrinth ,
104 à103 octetsEssayez-le en ligne!
Explication:
Le pointeur d'instruction commence au caractère non mur le plus en haut à gauche (les murs incluent des espaces et toute lettre sauf
v
).Orange:
Cette boucle récupère l’entrée caractère par caractère sous forme de code ASCII, en l’ajoutant à la valeur actuelle et en la multipliant par 256.
'
No-op,
Poussez le code ASCII du prochain caractère en entrée en haut de la pile ou -1 si EOF. À ce stade, si une entrée a été reçue, le code tournera à droite (en descendant) car le haut de la pile est actif. Sinon, il tournera à gauche car le sommet de la pile est négatif.|
Pop les deux premiers éléments de la pile et pousse le résultat d'un OU au niveau des bits._
Poussez zéro256
Chaque chiffre vu apparaîtx
et poussex*10+digit
. Donc, ceci combiné avec la poussée zéro précédente pousse 256 au sommet de la pile.*
Popy
, popx
, poussex*y
. À ce stade, puisque le haut de la pile est positif, le code tourne à droite pour continuer le tour de la boucle.Bleu:
)
Incrémenter le haut de la pile. Lorsque la fin de la saisie est atteinte, le code tourne à gauche pour atteindre ce point avec un -1 sur la pile qui sera incrémenté à zéro.256
Avoir le haut de la pile 0 nous permet de pousser ce 256./
Popy
, popx
pushx/y
(division entière). Puisque nous multiplions l'entrée 256 par chaque boucle, nous devons inverser la dernière multiplication.:
Dupliquez le haut de la pile afin d'avoir une copie de la valeur actuelle pour plus tard.!
Déposez le haut de la pile et imprimez la valeur entière sur STDOUT.\
Imprimer une nouvelle ligne._2
Poussez un deux en haut de la pile.}
Déplacez le haut de la pile vers le haut de la pile auxiliaire.Rouge:
Cette boucle retourne les bits de la valeur actuelle de XOR avec une valeur particulière calculée dans la boucle intérieure (verte). Il émet ensuite la valeur actuelle et quitte le programme si la valeur actuelle est zéro.
_
Appuyez sur zéro (flux de contrôle).;
Jeter le haut de la pile (flux de contrôle).:
Dupliquez la valeur actuelle. La copie sera utilisée pour calculer le XOR._
Appuyez sur zéro (flux de contrôle).$
Popy
, popx
, pushx XOR y
.:!
Dupliquez la valeur actuelle et imprimez la représentation entière.@
fichier et nous terminons.\
Imprimer une nouvelle ligne._2}
Appuyez sur 2 et passez à la pile auxiliaire._1
Appuyez sur 1 (flux de contrôle).Vert:
Cette boucle calcule la valeur par laquelle nous devons XOR la valeur actuelle. Pour ce faire, vous devez doubler de façon répétée le sommet de la pile auxiliaire tout en divisant par deux le nombre de copies de la valeur actuelle à l'arrêt de la pile principale jusqu'à atteindre 0.
_
Appuyez sur zéro (flux de contrôle).;
Ignore la valeur actuelle utilisée uniquement pour appliquer le flux de contrôle._2
Appuyez sur 2 pour réduire de moitié la valeur actuelle./
Diviser{
Déplacez le haut de la pile Aux vers le haut de la pile principale._2*
Double le sommet de la pile}
Déplacez le haut de la pile principale vers la pile Aux._1
Appuyez sur l'un pour contrôler le flux.;
Jeter la gauche au-dessus de zéro de calculer le XOR.{
Déplacez le XOR calculé vers la pile principale.(
Soustrayez un de la valeur XOR.la source
PowerShell v2 +, 158 octets
Ouais, donc, convertir des bases dans PowerShell est vraiment nul . Et nous avons le faire deux fois ici.
OK, il ne s’agit que d’une
for
boucle$a
- c’est-à-dire que nous bouclons tant qu’il$a
existe. Nous finirons par atteindre une chaîne vide (qui est falsey), c'est ainsi que nous terminerons.La configuration de la boucle,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
prend l’entrée$args[0]
, lachar
convertit en une matrice et parcourt chaque caractère. Nous utilisons le .NET[convert]::ToString(int,base)
pour convertir chacun en chaîne binaire. Cependant, cela n'inclut pas les zéros au début, nous devons donc la reformuler en tant que[int]
et appeler sa.ToString()
méthode avec les8
zéros comme masque. Ensuite, ces chaînes sont encapsulées dans des parens et éditées-join
ensemble, puis sauvegardées dans$a
.Dans la boucle, nous
[convert]::ToInt64(string,base)
convertissons le nombre binaire en nombre décimal. Cela reste sur le pipeline et est ensuite vidé lorsque la boucle est réinitialisée (et donc implicitement imprimée). La section suivante effectue les calculs - nous devons.TrimStart()
supprimer tous les zéros non significatifs ,-split0
les scinder en zéros et obtenir unstring
tableau de1
s,-replace
ceux contenant des zéros, et enfin-join
le tableau revenant avec1
s. Ensuite, la boucle recommence.la source
CJam ,
171618 octetsEssayez-le en ligne!
REMARQUE: l'ancienne version de 16 octets ne se comportait pas correctement avec des chaînes vides:
Merci également à Dennis d’ avoir suggéré ce
p
qui économise 1 octet par rapport à l’N\
ajout de nouvelles lignes à la pile.la source
_p2b:!2b
enregistre un octet. En outre, vous devriez utiliserl
;r
échouera si l'entrée contient des espaces.q
fonctionnera correctement avec des chaînes vides.J, 24 octets
L'explication viendra plus tard!
la source
Retina, 116 octets
Le nombre d'octets suppose un codage ISO 8859-1. La ligne 5 contient des octets non imprimables. C'est
T`\x00-\xFF
.Essayez-le en ligne
N'essayez pas cela avec une saisie de plus de deux caractères. (Il utilise plus tard l'interprète en ligne.) Il faut convertir le binaire en unaire avant la décimale. :RÉ
Malheureusement, il y a un zéro final et un saut de ligne, mais j'ai décidé de supposer que c'était correct parce que la sortie est toujours correcte.
Explication
la source
Ruby - 70 octets
Le programme se ferme avec une exception après avoir terminé, mais je crois comprendre que c'est correct tant que la sortie d'erreur est renvoyée à STDERR plutôt qu'à STDOUT (ce qui est le cas).
la source
C,
147135133125122121117115103 octets5 octets sauvés grâce à @Cyoce!
2 octets sauvés grâce à @Cyoce et @cleblanc!
Sauvegardé 12 octets grâce à @ceilingcat
Ungolfed:
la source
int
while
boucle enfor
bouclewhile(1)
àfor(;;)
int
déclarations partout et j'ai eu desgcc -std=89
erreurs. Mais merci pour lefor(;;)
tuyau. Je vais continuer d'essayer de supprimer lesint
déclarations :)))i;main(c,v)char**v;{...}
). Je suis sur mobile maintenant, donc je ne peux pas en être sûrC,
129120117110107105 octetsTesté avec
sortie
la source
i=0
à la déclaration dei
et laisser la section d'initialisation de lafor
boucle videi
est implicite, elle doit être initialisée à chaque fois que f (...) est appelé.i
zéro est à nouveau, elle est donc toujours réutilisable.C #,
360359 octetsProgramme complet:
la source
var t="";var f="";
être à lavar t="",f=""
place? Enregistre 5 octets.