Esto se basa en xkcd # 153 .
Cree un programa o función con nombre que tome 2 parámetros, cada uno de los cuales es una cadena o una lista o matriz de bytes o caracteres. El segundo parámetro solo contendrá caracteres extraídos de lrfu
(o los bytes ASCII equivalentes). Debe interpretarse como una serie de instrucciones que deben realizarse en una secuencia de bits representada por el primer parámetro.
El procesamiento realizado debe ser equivalente al siguiente:
- Convierta el primer parámetro en una sola cadena de bits formada concatenando los bits de cada carácter (interpretado como uno de ASCII de 7 bits, un ASCII extendido de 8 bits o una codificación Unicode estándar). Por ejemplo, si el primer parámetro es
"AB"
, este sería uno de 10000011000010
(7 bits), 0100000101000010
(8 bits o UTF-8) 00000000010000010000000001000010
, o 01000001000000000100001000000000
(UTF-16 en las dos endianidades), etc.
- Para cada carácter en el segundo parámetro, en orden, ejecute la instrucción correspondiente:
l
gira la cadena de bits a la izquierda. Por ejemplo, se 10000011000010
convierte 00000110000101
.
r
gira la cadena de bits a la derecha. Por ejemplo, se 10000011000010
convierte 01000001100001
.
f
voltea (o invierte) cada bit en la cadena de bits. Por ejemplo, se 10000011000010
convierte 01111100111101
.
u
invierte la cadena de bits. Por ejemplo, se 10000011000010
convierte 01000011000001
.
- Convierta la cadena de bits en una cadena ASCII que utiliza un carácter por bit. Por ejemplo, se
10000011000010
convierte "10000011000010"
. Esto se debe a que no todos los conjuntos de 7/8 bits tienen un carácter asignado.
Ejemplo (en Python):
>>> f("b", "rfu")
01110011
Se convierte "b"
en su representación binaria ASCII de 8 bits 01100010
, la gira hacia la derecha ( 00110001
), voltea cada bit ( 11001110
) y la invierte ( 01110011
).
Flexibilidad
Otros caracteres se pueden utilizar en lugar de los caracteres l
, r
, f
, y u
, pero deben ser claramente documentados.
Marcador
Gracias a @Optimizer por crear el siguiente fragmento de código. Para usar, haga clic en "Mostrar fragmento de código", desplácese hasta la parte inferior y haga clic en "► Ejecutar fragmento de código".
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"
? Además, cuando uno cambia o invierte bits, ¿lo hace para cada letra individual, o la cadena como un todo? Más casos de prueba lo aclararían.Respuestas:
CJam,
3432 bytesUtiliza los siguientes caracteres para las instrucciones:
La entrada está tomando de STDIN con la palabra en la primera línea y la cadena de instrucciones en la segunda línea.
Pruébalo aquí.
Explicación
Obtener la cadena de bits es solo una cuestión de interpretar los códigos de caracteres como los dígitos de un número base 256 (y obtener su representación base 2). Lo complicado es que la última conversión de base no rellenará el resultado con 0s a la izquierda. Por lo tanto, agrego un 1 inicial a la entrada inicial, y luego divido ese 1 nuevamente en la representación binaria. Como ejemplo, si la entrada es
ab
, la convierto en una matriz[1 'a 'b]
, interpreto eso como base-256 (los caracteres se convierten automáticamente en códigos de caracteres), que es90466
y a base-2, que es[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Ahora, si solo elimino ese liderazgo1
, tengo el flujo de bits que estoy buscando.Eso es lo que hace esta parte del código:
Ahora leo la lista de instrucciones y ejecuto un bloque para cada carácter en la cadena de instrucciones:
Lo primero que debe hacer es evaluar el carácter y números enteros reales
0
,1
,2
o3
. Ahora, la verdadera magia del golf ... dependiendo de las instrucciones, quiero ejecutar un código corto que implemente la operación:Podría almacenarlos en una matriz de bloques y elegir el bloque correcto para ejecutar, pero codificarlos en una cadena es en realidad más corto:
Primero, uso el número entero asociado con la instrucción para cortar el comienzo de la cadena. Entonces, para la rotación hacia la izquierda, la cadena no cambia, para la rotación hacia la derecha se descarta el primer carácter y así sucesivamente. Luego selecciono cada cuarto carácter de la cadena, comenzando por el primero, con
4%
. Observe cómo se distribuyen los cuatro fragmentos de código en toda la cadena. Finalmente solo evalúo la cadena como código con~
.La cadena de bits se imprime automáticamente al final del programa.
fuente
1m<
lugar de(+
? Estás trabajando en una matriz en lugar de un número, ¿no?CJam, 34 bytes
Otro enfoque en CJam.
El texto de entrada está en la primera línea y las instrucciones están en la segunda línea.
Instrucciones:
fuente
f~
no se implementa, ¿no? ;)Pyth 33
Usos:
Pyth github
Pruébelo en línea aquí.
Este es un programa que toma la cadena como primer argumento y la cadena de comandos como segundo argumento. En la versión en línea, debe dar las cadenas separadas por una nueva línea, así:
Explicación:
Algo que no pude comprender: Pyth's
reduce
usa automáticamenteG
el valor anterior yH
el siguiente.fuente
lrfu
, pero deben estar claramente documentadas". (énfasis mío)Scala - 192
fuente
Matlab (166 bytes)
Esto usa letras en
abcd
lugar delrfu
respectivamente.Algunos trucos utilizados aquí para ahorrar espacio:
abcd
las letras me permite restar97
una vez, y luego se convierten en las letras0
,1
,2
,3
. Esto ahorra espacio en losswitch
-case
cláusulas.circshift
como una función anónima de una letra también ahorra espacio, ya que se usa dos veces.D
consta de'0'
y'1'
caracteres (códigos ASCII48
y49
), la declaraciónD=char(97-D)
corresponde a inversión entre'0'
y'1'
valores. Tenga en cuenta que esto97
no tiene nada que ver con lo mencionado anteriormente.'
se usa en lugar de la transposición.'
.fuente
Pitón 2 - 179
fuente
C #, 418 bytes
Formateado:
fuente
J, 164
Formateado:
Ejemplo
fuente
JavaScript (E6), 163
167Utilizando completamente la flexibilidad de entrada, una función con nombre con 2 parámetros de matriz.
La función devuelve una cadena de caracteres compuesta por '1' y '0'
Ejemplo
f("b", "rfu")
traducir aF([98],[82,70,85])
, el resultado es0111001
¡Tenga en cuenta que el uso de cadenas de caracteres es mucho más largo en javascript! Cuenta de bytes 186
Ejemplo
F("b", "RFU")
, el resultado es0111001
nuevamentefuente
Rubí, 151
Bastante sencillo. Recorre los caracteres
s
y realiza una acción para cualquiera de ellos.fuente
Pitón 2, 142
Similar a mi respuesta de pyth en el enfoque: construyo una lista de todas las cadenas e indexo en él en función del valor de la cadena de instrucciones que itero usando reducir.
Usos:
fuente