Parece una tarea imposible ¿verdad? Bueno, en realidad no es tan difícil. Si escribimos la palabra Infinity
como código ASCII binario de 8 bits, obtendremos:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Esto se puede concatenar y convertir al valor decimal 5291279215216915577
. Ahora ese es un número con el que podemos trabajar ...
La forma en que contarás es:
- Salida de la cadena original como un número decimal (como se muestra arriba)
- Elimine los ceros a la izquierda en su representación binaria (si existe)
- Alternar los bits en la representación binaria (1-> 0, 0-> 1)
- Salida del número en decimal
- Repita los pasos 2-4 como hasta llegar a 0.
Desafío:
Cree un programa o función que tome una cadena como entrada y envíe (en cualquier formato adecuado) los números que obtendrá al realizar el procedimiento anterior.
Caso de prueba:
Creo que el desafío será bastante fácil de entender, aunque solo sea un caso de prueba. Lo usaré en Inf
lugar de Infinity
mantener esto bastante corto.
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
Su código debe admitir cadenas que se puedan representar como un número binario hasta el límite de su idioma. Todas las cadenas solo contendrán caracteres ASCII imprimibles de 32-126 (espacio para tilde).
Tabla de clasificación
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
Respuestas:
Jalea ,
1510 bytes-5 bytes gracias a @Dennis (convertir directamente desde la base 256 después del reparto ordinal)
TryItOnline!
¿Cómo?
fuente
Oḅ⁹
.Python 2,
8982777675 bytesPruébalo en Ideone .
Cómo funciona
Después de inicializar n a 0 , la segunda línea realiza la conversión de cadena a entero especificada en los desafíos de la siguiente manera.
En cada paso, n se desplaza 8 unidades hacia la izquierda, luego bit a bit O con el punto de código del siguiente carácter c . Para la entrada Inf , esto es como sigue.
Ahora estamos listos para generar la salida. Para invertir los bits de n , procedemos de la siguiente manera.
Primero, calculamos los bits en la representación binaria de n sin ceros a la izquierda. Llamemos al resultado k . Luego, calculamos la potencia k k de 2 , que tiene k + 1 dígitos binarios: un solo 1 , seguido de k 0 's. Restamos 1 del resultado, produciendo un número compuesto por k unos, que luego XOR con n para invertir sus bits. Para la entrada inf esto es como sigue.
Un obstáculo adicional en la implementación es que tenemos que imprimir n antes del primer paso, después del último paso y en todos los pasos intermedios. Python no tiene bucles do-while y una sola declaración de impresión cuesta 8 bytes, por lo que hacemos lo siguiente.
En la implementación directa del paso de actualización, es decir,
reemplazamos el bucle con uno infinito (
while 1
) y calculamos el1
en el bucle comon/n
. Esto es equivalente mientras n> 0 .Una vez que n = 0 , nos mantenemos informados, imprimimos el estado una vez más y luego intentamos actualizarlo. Sin embargo,
0/0
desencadena un ZeroDivisionError , saliendo del bucle y saliendo con un error. Tenga en cuenta que esto provoca una salida perdida a STDERR, que está permitido de forma predeterminada .fuente
-n/n
truco :-)n/n
truco? Probablemente se haya explicado en otra respuesta en alguna parte, pero no la he encontrado. Que hace aquiJavaScript, 82 bytes
Guardado un byte gracias a @Arnuald
Una de las pocas veces en que un programa completo supera a una función (y ES6 no supera a ES5) ...
Lo anterior admite palabras de hasta 4 letras. Agregue 4 bytes para admitir palabras de hasta 6 letras:
fuente
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
Debería guardar un byte.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
guardaría otro byte, pero no se mostrará0
, lo que probablemente sea necesario.n<<8
antes, pero decidí que no funcionaría porque se rompería para n con más de 31 bits. Supongo que no importa ahora que ya lo he dividido entre una versión de 31 bits y una versión de 53 bits ... Y lamentablemente, no creo que pueda guardar nada en la alerta mientras alerta a los dos primeros iteración y el último.En realidad , 14 bytes
Pruébalo en línea!
Explicación:
fuente
05AB1E , 18 bytes
Utiliza la codificación CP-1252 .
Pruébalo en línea!
Explicación
fuente
MATL , 13 bytes
Pruébalo en línea!
Explicación
fuente
Mathematica, 99 bytes
Función anónima. Toma una cadena como entrada y devuelve una lista de números como salida.
fuente
Haskell,
10912311810297 bytes¡Gracias a @nimi por guardar 5 bytes!
Uso:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Garantizado para trabajar en números de hasta 29 bits por idioma, generalmente funciona con números de hasta 63 bits en sistemas de 64 bits. Utilice en su
map(fromIntegral.fromEnum)
lugar (+14 bytes) para admitir números arbitrariamente grandes.Funciona para el rango unicode
[0..255]
. Voltea recursivamente bits.fuente
takeWhile(>0)
confst.span(>0)
. Si no tiene puntos, puede soltar el nombref
, por lo que su función principal es(++[0]) ... map fromEnum
.f
.fromIntegral
? Del desafío: "debe admitir ... hasta 63 bits ... o el límite de su idioma", por lo queInt
debería estar bien. Si desea conservarlo, muévalo amap
, es decir, su versión anterior defoldl1
ymap(fromIntegral.fromEnum)
.PHP,
132126123120108107 bytesunpack
en lugar destr_split
volverseord()
obsoleto -> -3 bytes_
como separador guarda 3.bindec
en lugar deltrim
eliminar los ceros a la izquierda: -12echo
en el cuerpo del bucle ahorra 1 byte sobre laprint
cabeza del bucle.fuente
$n=$n*256+$i;for(print$n;$n;)
puede escribir comofor(print$n=$n*256+$i;$n;)
? Como la parte de la tarea se ejecutará una vez, esto debería funcionar. Y en lugar deecho _.$n=[...]
, debes usarecho _,$n=[...]
en su lugar. No guardará ningún byte, pero acelerará el código un poquito minúsculo y separará las declaraciones. Eso significa que, por ejemplo,echo _,$a?5:6;
se puede escribir en lugar deecho _.($a?5:6);
. Esto puede ser útil en el futuro.print
en este caso. Solo no vale la pena editarlo; pero gracias.foreach(unpack("C*",$argv[1])as$i)
... tonto ... Y sí, cambiar un punto para que una coma tenga el mismo efecto no vale la pena.Perl, 65 bytes
Código de 53 bytes + 12 para
-Mbigint -p
.Gracias a @ Dada por salvarme 13 bytes!
Enfoque bastante sencillo, solo diferente a la mayoría de estos es que el número se almacena como binario y se imprime en decimal. Estoy seguro de que se puede mejorar, tal vez con el almacenamiento de detalles en una matriz.
-Mbigint
Es un poco incómodo pero necesario.Uso
fuente
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(No tengo idea de cómo usar desempaquetar generalmente, tuve suerte al buscar en Google cómo convertir una cadena a binario ;-))unpack
la sintaxis que siempre me deja boquiabierto Voy a actualizar, gracias!echo -n
es el único otro cambio.Pyth, 12 bytes
Un programa que toma la entrada de una cadena entre comillas e imprime el resultado como una lista de enteros.
Verificar todos los casos de prueba
Cómo funciona
fuente
Python 3,
9995 bytesLa idea principal es convertir cadenas a bytes a números. Cada iteración imprime la salida y XOR con todos los 1 para avanzar hacia cero.
fuente
2**x.bit_length()-1
. El orden de las operaciones de potencia y sustracción es mayor que xor. Además, esowhile
puede estar en una sola línea.P=print
y luego usar enP()
lugar deprint()
Python 2,
117115bytesAhorro de 2 bytes gracias a Cyoce.
Asume una entrada entre comillas, p. Ej.
"Inf"
m
cuenta hasta el dígito más alto, por lo quem-1
es una máscara XOR para realizar la operación deseada. La parte más larga es convertir la entrada en la secuencia de bits inicial.Ejemplo:
fuente
-i-1
con~i
Ruby,
104101100818065 bytes¡19 bytes guardados gracias a @WayneConrad!
¡15 bytes guardados gracias a @philomory!
1 byte guardado gracias a @LeeW!
Toma entrada a través de argumentos de línea de comando.
Inspirado en la respuesta de Python de @ JimmyJohnson
fuente
i.to_s(2).rjust 8,'0'
con"%08b"%i
inject(:+)
se puede reemplazar conjoin
unpack
seguido por en[0]
lugar de jugar congsub
ahorrará 11 bytes. Cambiar a en$*[0]
lugar degets.chop
(usando un argumento de línea de comando en lugar de la entrada de la consola) guardará otros 9, la primera línea se conviertep n=$*[0].unpack('B*')[0].to_i(2)
.Laberinto ,
104103 bytesPruébalo en línea!
Explicación:
El puntero de instrucción comienza en el carácter no mural más superior izquierdo (los muros incluyen espacios y cualquier letra excepto
v
).Naranja:
Este bucle obtiene la entrada de un carácter a la vez como un código ASCII, agregándolo al valor actual y multiplicando el valor actual por 256.
'
No-op,
Empuje el código ascii del siguiente carácter de entrada a la parte superior de la pila o -1 si es EOF. En este punto, si se recibió una entrada, el código girará a la derecha (moviéndose hacia abajo) porque la parte superior de la pila está llena. De lo contrario, girará a la izquierda porque la parte superior de la pila es negativa.|
Haga estallar los dos primeros elementos de la pila y presione el resultado de un OR bit a bit._
Empuje cero256
Cada dígito visto aparecex
y empujax*10+digit
. Así que esto se combina con el empuje cero anterior empuje 256 a la parte superior de la pila.*
Popy
, popx
, pushx*y
. En este punto, dado que la parte superior de la pila es positiva, el código girará a la derecha para continuar alrededor del ciclo.Azul:
)
Incrementa la parte superior de la pila. Cuando se alcanza el final de la entrada, el código girará a la izquierda para llegar a este punto con un -1 en la pila que se incrementará a cero.256
Tener la parte superior de la pila 0 nos permite empujar este 256./
Popy
, popx
pushx/y
(división entera). Como estábamos multiplicando la entrada por 256 cada ciclo, necesitamos revertir la última multiplicación.:
Duplique la parte superior de la pila para que tengamos una copia del valor actual para más adelante.!
Haga estallar la parte superior de la pila e imprima el valor entero en STDOUT.\
Imprime una nueva línea._2
Empuja un dos a la parte superior de la pila.}
Mueva la parte superior de la pila a la parte superior de la pila auxiliar.Rojo:
Este bucle invierte los bits del valor actual por XOR con un valor particular calculado en el bucle interno (verde). Luego emite el valor actual y sale del programa si el valor actual es cero.
_
Empuje cero (flujo de control).;
Deseche la parte superior de la pila (flujo de control).:
Duplicar el valor actual. La copia se usará para calcular el XOR._
Empuje cero (flujo de control).$
Popy
, popx
, Pushx XOR y
.:!
Duplique el valor actual e imprima la representación entera.@
y terminamos .\
Imprime una nueva línea._2}
Presione 2 y muévase a la pila auxiliar._1
Empuje 1 (flujo de control).Verde:
Este bucle calcula el valor por el cual necesitamos XOR el valor actual. Esto se hace doblando repetidamente la parte superior de la pila auxiliar mientras reduce a la mitad una copia del valor actual en el tope de la pila principal hasta que llegue a 0.
_
Empuje cero (flujo de control).;
Descarte el valor actual que solo se usa para imponer el flujo de control._2
Presione 2 para reducir a la mitad el valor actual./
Dividir{
Mueva la parte superior de la pila auxiliar a la parte superior de la pila principal._2*
Doblar la parte superior de la pila}
Mueva la parte superior de la pila principal de nuevo a la pila auxiliar._1
Presione uno para controlar el flujo.;
Deseche la izquierda sobre cero para calcular el XOR.{
Mueva el XOR calculado a la pila principal.(
Resta uno del valor XOR.fuente
PowerShell v2 +, 158 bytes
Sí, entonces, convertir bases en PowerShell es realmente desagradable . Y podemos hacerlo dos veces aquí.
Bien, esto es solo un
for
bucle$a
activado, es decir, hacemos un bucle mientras$a
exista. Eventualmente llegaremos a una cadena vacía (que es falsey), así es como terminaremos.La configuración del bucle,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
toma la entrada$args[0]
, lachar
convierte como una matriz y recorre cada personaje. Usamos .NET[convert]::ToString(int,base)
para convertir cada uno en una cadena binaria. Sin embargo, eso no incluye ceros a la izquierda, por lo que debemos volver a emitir esa cadena como una[int]
y llamar a su.ToString()
método con8
ceros como máscara. Luego, esas cadenas se encapsulan en parens y se editan-join
juntas, luego se guardan en$a
.Dentro del bucle, debemos
[convert]::ToInt64(string,base)
convertir el número binario en un número decimal. Eso queda en la tubería y luego se vacía cuando el bucle se restablece (y, por lo tanto, se imprime implícitamente). La siguiente sección realiza los cálculos: eliminamos.TrimStart()
los ceros-split0
a la izquierda, dividimos los ceros y obtenemos unastring
serie de1
s,-replace
los que tienen ceros y finalmente-join
la matriz junto con1
s. Entonces, el ciclo comienza de nuevo.fuente
CJam ,
171618 bytesPruébalo en línea!
NOTA: La versión anterior de 16 bytes no se comportaba correctamente con cadenas vacías:
Además, gracias a Dennis por sugerir
p
qué ahorra 1 byte sobreN\
poner nuevas líneas en la pila.fuente
_p2b:!2b
Guarda un byte. Además, debes usarl
;r
fallará si la entrada contiene espacios.q
funcionará correctamente con cadenas vacías.J, 24 bytes
¡La explicación vendrá después!
fuente
Retina, 116 bytes
El recuento de bytes asume la codificación ISO 8859-1. La línea 5 contiene bytes no imprimibles. Es
T`\x00-\xFF
.Pruébalo en línea
No intente esto con una entrada de más de dos caracteres. (Se agota el tiempo usando el intérprete en línea). Tenemos que convertir el binario a unario antes del decimal. :RE
Desafortunadamente, hay un cero al final y un salto de línea, pero decidí asumir que estaba bien porque el resultado sigue siendo correcto.
Explicación
fuente
Ruby - 70 bytes
El programa sale con una excepción después de completar, pero entiendo que eso está bien siempre que la salida de error vaya a STDERR en lugar de STDOUT (lo que hace).
fuente
C,
147135133125122121117115103 bytes¡Guardado 5 bytes gracias a @Cyoce!
¡Ahorré 2 bytes gracias a @Cyoce y @cleblanc!
Guardado 12 bytes gracias a @ceilingcat
Sin golf:
fuente
int
declaracioneswhile
bucle en unfor
buclewhile(1)
afor(;;)
int
declaraciones en todas partes y obtuvegcc -std=89
errores. Pero gracias por elfor(;;)
consejo.int
i;main(c,v)char**v;{...}
). En el móvil ahora, así que no puedo estar seguroC,
129120117110107105 BytesProbado con
salida
fuente
i=0
a la declaración dei
y dejar enfor
blanco la sección de inicialización del cicloi
es int global implícito, debe inicializarse cada vez que se llama f (...).i
sea cero nuevamente, por lo que aún es reutilizable.C #,
360359 bytesPrograma completo:
fuente
var t="";var f="";
servar t="",f=""
en su lugar? Ahorra 5 bytes.