Ceci est basé sur xkcd # 153 .
Créez un programme ou une fonction nommée qui prend 2 paramètres, chacun étant une chaîne ou une liste ou un tableau d'octets ou de caractères. Le deuxième paramètre ne contiendra que des caractères tirés de lrfu
(ou les octets ASCII équivalents). Elle doit être interprétée comme une série d'instructions à exécuter sur une séquence de bits représentée par le premier paramètre.
Le traitement effectué doit être équivalent à ce qui suit:
- Convertissez le premier paramètre en une seule chaîne de bits formée en concaténant les bits de chaque caractère (interprété comme l'un des codes ASCII 7 bits, ASCII étendu 8 bits ou un codage Unicode standard). Par exemple, si le premier paramètre est
"AB"
alors ce serait l'un de 10000011000010
(7 bits), 0100000101000010
(8 bits ou UTF-8) 00000000010000010000000001000010
, ou 01000001000000000100001000000000
(UTF-16 dans les deux endiannesses), etc.
- Pour chaque caractère du deuxième paramètre, dans l'ordre, exécutez l'instruction correspondante:
l
fait tourner la chaîne de bits à gauche. Par exemple, 10000011000010
devient 00000110000101
.
r
fait tourner la chaîne de bits à droite. Par exemple, 10000011000010
devient 01000001100001
.
f
retourne (ou inverse) chaque bit de la chaîne de bits. Par exemple, 10000011000010
devient 01111100111101
.
u
inverse la chaîne de bits. Par exemple, 10000011000010
devient 01000011000001
.
- Convertissez la chaîne de bits en une chaîne ASCII qui utilise un caractère par bit. Par exemple,
10000011000010
devient "10000011000010"
. En effet, tous les ensembles de 7/8 bits n'ont pas de caractère attribué.
Exemple (en Python):
>>> f("b", "rfu")
01110011
Il se transforme "b"
en sa représentation binaire ASCII 8 bits 01100010
, le fait pivoter vers la droite ( 00110001
), retourne chaque bit ( 11001110
) et l'inverse ( 01110011
).
Souplesse
D' autres caractères peuvent être utilisés à la place des personnages l
, r
, f
et u
, mais ils doivent être clairement documentées.
Tableau d'affichage
Merci à @Optimizer avoir créé l'extrait de code suivant. Pour l'utiliser, cliquez sur "Afficher l'extrait de code", faites défiler vers le bas et cliquez sur "► Exécuter l'extrait de code".
var QUESTION_ID = 45087; var answers = [], page = 1;var SCORE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;function url(index) {return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=votes&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";}function getAnswers() {$.ajax({url: url(page++),method: "get",dataType: "jsonp",crossDomain: true,success: function (data) {answers.push.apply(answers, data.items);if (data.has_more) getAnswers();else process()}});}getAnswers();function shouldHaveHeading(a) {var pass = false;try {pass |= /^(#|<h).*/.test(a.body_markdown);pass |= ["-", "="].indexOf(a.body_markdown.split("\n")[1][0]) > -1;} catch (ex) {}return pass;}function shouldHaveScore(a) {var pass = false;try {pass |= SCORE_REG.test(a.body_markdown.split("\n")[0]);} catch (ex) {}return pass;}function getRelDate(previous) {var current = Date.now();var msPerMinute = 60 * 1000;var msPerHour = msPerMinute * 60;var msPerDay = msPerHour * 24;var msPerMonth = msPerDay * 30;var msPerYear = msPerDay * 365;var elapsed = current - previous;if (elapsed < msPerMinute) {return Math.round(elapsed/1000) + ' seconds ago';}if (elapsed < msPerHour) {return Math.round(elapsed/msPerMinute) + ' minutes ago';}if (elapsed < msPerDay ) {return Math.round(elapsed/msPerHour ) + ' hours ago';}if (elapsed < msPerMonth) {return 'approx. ' + Math.round(elapsed/msPerDay) + ' days ago';}if (elapsed < msPerYear) {return 'approx. ' + Math.round(elapsed/msPerMonth) + ' months ago';}return 'approx. ' + Math.round(elapsed/msPerYear ) + ' years ago';}function process() {answers = answers.filter(shouldHaveHeading);answers = answers.filter(shouldHaveScore);answers.sort(function (a, b) {var aB = +(a.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0],bB = +(b.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0];return aB - bB});answers.forEach(function (a) {var answer = $("#answer-template").html();answer = answer.replace("{{BODY}}", a.body).replace("{{NAME}}", a.owner.display_name).replace("{{REP}}", a.owner.reputation).replace("{{VOTES}}", a.score).replace("{{DATE}}", new Date(a.creation_date*1e3).toUTCString()).replace("{{REL_TIME}}", getRelDate(a.creation_date*1e3)).replace("{{POST_LINK}}", a.share_link).replace(/{{USER_LINK}}/g, a.owner.link).replace('{{img}}=""', "src=\"" + a.owner.profile_image + '"');answer = $(answer);if (a.is_accepted) {answer.find(".vote-accepted-on").removeAttr("style");}$("#answers").append(answer);});}
body { text-align: left !important}
<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="answers"></div><div id="answer-template" style="display: none"><div class="answer" ><table><tbody><tr><td class="votecell"><div class="vote"><span style="cursor: pointer;" title="Total Votes" itemprop="upvoteCount" class="vote-count-post ">{{VOTES}}</span><span style="display: none" class="vote-accepted-on load-accepted-answer-date" title="The question owner accepted this as the best answer">accepted</span></div></td><td class="answercell"><div class="post-text" itemprop="text">{{BODY}}</div><table class="fw"><tbody><tr><td class="vt"><div class="post-menu"><a href="{{POST_LINK}}" title="short permalink to this answer" class="short-link">share</a></div></td><td class="post-signature" align="right"><div class="user-info "><div class="user-action-time">answered <span title="{{DATE}}" class="relativetime">{{REL_TIME}}</span></div><div class="user-gravatar32"></div><div class="user-details"><br></div></div></td><td class="post-signature" align="right"><div class="user-info user-hover"><div class="user-action-time"></div><div class="user-gravatar32"><a href="{{USER_LINK}}"><div class="gravatar-wrapper-32"><img {{img}} alt="" height="32" width="32"></div></a></div><div class="user-details"><a href="{{USER_LINK}}">{{NAME}}</a><br><span class="reputation-score" title="reputation score " dir="ltr">{{REP}}</span></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div>
"rrfrburb"
? De plus, lorsque l'on décale ou inverse des bits, le fait-on pour chaque lettre individuelle ou pour la chaîne dans son ensemble? Plus de cas de test le rendraient plus clair.Réponses:
CJam,
3432 octetsIl utilise les caractères suivants pour les instructions:
L'entrée provient de STDIN avec le mot sur la première ligne et la chaîne d'instructions sur la deuxième ligne.
Testez-le ici.
Explication
Obtenir la chaîne de bits est vraiment juste une question d'interprétation des codes de caractères comme les chiffres d'un nombre en base 256 (et d'obtenir sa représentation en base 2). La chose délicate est que cette dernière conversion de base ne remplira pas le résultat avec des 0 à gauche. Par conséquent, j'ajoute un 1 de tête à l'entrée initiale, puis je le scinde à nouveau dans la représentation binaire. Par exemple, si l'entrée est
ab
, je la transforme en un tableau[1 'a 'b]
, interprète cela comme base-256 (les caractères sont automatiquement convertis en codes de caractères), ce qui est90466
et en base-2, qui l'est[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Maintenant, si je supprime simplement ce leader1
début, j'ai le train de bits que je recherche.C'est ce que fait cette partie du code:
Maintenant, je lis la liste des instructions et exécute un bloc pour chaque caractère de la chaîne d'instructions:
La première chose à faire est d'évaluer le caractère et les entiers réels
0
,1
,2
ou3
. Maintenant, la vraie magie du golf ... en fonction de l'instruction, je veux exécuter un court morceau de code qui implémente l'opération:Je pourrais les stocker dans un tableau de blocs et choisir le bon bloc à exécuter, mais les encoder dans une chaîne est en fait plus court:
Tout d'abord, j'utilise l'entier associé à l'instruction pour couper le début de la chaîne. Ainsi, pour la rotation à gauche, la chaîne est inchangée, pour la rotation à droite, le premier caractère est supprimé et ainsi de suite. Ensuite, je sélectionne chaque quatrième caractère de la chaîne, en commençant par le premier, avec
4%
. Remarquez comment les quatre extraits de code sont distribués dans la chaîne. Enfin, j'évalue simplement la chaîne en tant que code avec~
.La chaîne de bits est imprimée automatiquement à la fin du programme.
la source
1m<
plutôt que(+
? Vous travaillez sur un tableau plutôt que sur un nombre, n'est-ce pas?CJam, 34 octets
Une autre approche dans CJam.
Le texte saisi se trouve sur la première ligne et les instructions se trouvent sur la deuxième ligne.
Instructions:
la source
f~
n'est pas implémentée cependant, n'est-ce pas? ;)Pyth 33
Les usages:
Gythub Pyth
Essayez-le en ligne ici.
Il s'agit d'un programme qui prend la chaîne comme premier argument et la chaîne de commandes comme deuxième argument. Dans la version en ligne, vous devez donner les chaînes séparées par une nouvelle ligne, comme ceci:
Explication:
Quelque chose que je ne pouvais pas vraiment saisir: Pyth
reduce
utilise automatiquementG
la valeur précédente etH
la valeur suivante.la source
lrfu
, mais elles doivent être clairement documentées." (c'est moi qui souligne)Scala - 192
la source
Matlab (166 octets)
Cela utilise des lettres
abcd
au lieu delrfu
respectivement.Quelques astuces utilisées ici pour économiser de l'espace:
abcd
lettres me permet soustrais97
une fois, puis les lettres deviennent0
,1
,2
,3
. Cela économise de l'espace dans leswitch
-case
clauses .circshift
d'une fonction anonyme à une lettre économise également de l'espace, car elle est utilisée deux fois.D
compose de'0'
et de'1'
caractères (codes ASCII48
et49
), l'instructionD=char(97-D)
correspond à l'inversion entre les valeurs'0'
et'1'
. Notez que cela97
n'a rien à voir avec celui mentionné ci-dessus.'
est utilisée à la place de la transposition.'
.la source
Python 2 - 179
la source
C #, 418 octets
Formaté:
la source
J, 164
Formaté:
Exemple
la source
JavaScript (E6), 163
167Utilisant pleinement la flexibilité d'entrée, une fonction nommée avec 2 paramètres de tableau.
La fonction renvoie une chaîne de caractères composée de «1» et «0»
Exemple
f("b", "rfu")
traduit enF([98],[82,70,85])
, le résultat est0111001
Notez que l' utilisation de chaînes de caractères est beaucoup plus longue en javascript! Nombre d'octets 186
Exemple
F("b", "RFU")
, le résultat est à0111001
nouveaula source
Rubis, 151
Assez simple. Boucles à travers les personnages
s
et exécute une action pour l'un d'eux.la source
Python 2, 142
Semblable à ma réponse pyth en approche: je construis une liste de toutes les chaînes et l'indexer en fonction de la valeur de la chaîne d'instruction que j'itère en utilisant réduire.
Les usages:
la source