Parece una tarea imposible ¿verdad? Bueno, en realidad no es tan difícil. Si escribimos la palabra Infinitycomo 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 Influgar de Infinitymantener 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∞..0Respuestas:
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 el1en 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/0desencadena 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/ntruco :-)n/ntruco? 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^=iguardaría otro byte, pero no se mostrará0, lo que probablemente sea necesario.n<<8antes, 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 queIntdebería estar bien. Si desea conservarlo, muévalo amap, es decir, su versión anterior defoldl1ymap(fromIntegral.fromEnum).PHP,
132126123120108107 bytesunpacken lugar destr_splitvolverseord()obsoleto -> -3 bytes_como separador guarda 3.bindecen lugar deltrimeliminar los ceros a la izquierda: -12echoen el cuerpo del bucle ahorra 1 byte sobre laprintcabeza 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.printen 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.
-MbigintEs 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 ;-))unpackla sintaxis que siempre me deja boquiabierto Voy a actualizar, gracias!echo -nes 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, esowhilepuede estar en una sola línea.P=printy luego usar enP()lugar deprint()Python 2,
117115bytesAhorro de 2 bytes gracias a Cyoce.
Asume una entrada entre comillas, p. Ej.
"Inf"mcuenta hasta el dígito más alto, por lo quem-1es 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-1con~iRuby,
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"%iinject(:+)se puede reemplazar conjoinunpackseguido por en[0]lugar de jugar congsubahorrará 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 cero256Cada dígito visto aparecexy 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.256Tener la parte superior de la pila 0 nos permite empujar este 256./Popy, popxpushx/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._2Empuja 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._1Empuje 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._2Presione 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._1Presione 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
forbucle$aactivado, es decir, hacemos un bucle mientras$aexista. 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], lacharconvierte 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 con8ceros como máscara. Luego, esas cadenas se encapsulan en parens y se editan-joinjuntas, 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-split0a la izquierda, dividimos los ceros y obtenemos unastringserie de1s,-replacelos que tienen ceros y finalmente-joinla matriz junto con1s. 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
pqué ahorra 1 byte sobreN\poner nuevas líneas en la pila.fuente
_p2b:!2bGuarda un byte. Además, debes usarl;rfallará si la entrada contiene espacios.qfuncionará 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
intdeclaracioneswhilebucle en unforbuclewhile(1)afor(;;)intdeclaraciones en todas partes y obtuvegcc -std=89errores. Pero gracias por elfor(;;)consejo.inti;main(c,v)char**v;{...}). En el móvil ahora, así que no puedo estar seguroC,
129120117110107105 BytesProbado con
salida
fuente
i=0a la declaración deiy dejar enforblanco la sección de inicialización del cicloies int global implícito, debe inicializarse cada vez que se llama f (...).isea 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.