Hay bastantes desafíos en este sitio que le piden que imprima una secuencia, y esta no es una excepción.
(La siguiente explicación de la secuencia para este desafío supone que los símbolos en la secuencia son 0
y 1
.)
La definición recursiva de la secuencia Thue-Morse es que
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Una definición más directa es que la secuencia de 0
a 2**m-1
y 2**m to 2**(m+1)-1
son complementos binarios. Entonces 0
es seguido por 1
, 01
seguido por 10
, 0110
seguido por 1001
, y, saltando un poco hacia adelante, 0110100110010110
seguido por 1001011001101001
.
El desafío es escribir un programa o una función que imprima la secuencia Thue-Morse para los primeros n
elementos, donde n
hay cualquier número entero no negativo. La salida puede usar cualquiera de los dos símbolos, como se muestra en los ejemplos a continuación.
Ejemplos
>>> tm_01(20)
01101001100101101001
>>> tm_ab(42)
abbabaabbaababbabaababbaabbabaabbaababbaab
>>> tm_paren(37)
())()(())(()())()(()())(())()(())(()(
>>> tm_space_star(12)
** * ** *
>>> tm_01(0)
# to show that this is a valid input
Reglas
La entrada será cualquier número entero no negativo. Puede asumir que todas las entradas son válidas.
La salida debe ser los primeros
n
elementos de la secuencia Thue-Morse, utilizando cualquier símbolo que sea conveniente. Si lo desea, también puede agregar un separador. En mis ejemplos, no tengo. Nota: Esta regla permite listas (como las de Python), ya que,
es un separador válido y no me importa los caracteres iniciales o finales, como[
y]
en la salida.Este es el código de golf, por lo que gana el menor número de bytes.
Como siempre, si el problema no está claro, hágamelo saber. ¡Buena suerte y buen golf!
Catalogar
var QUESTION_ID=65549;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#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="language-list"> <h2>Shortest Solution 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> <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> <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>
Respuestas:
Pyth, 6 bytes
Pruébelo en línea: demostración
Basado en la solución de @ThomasKwa y una variación de @FryAmTheEggman.
Se utiliza la siguiente formular: el
i
dígito-ésimo en la secuencia Thue-Morse es:xor(digits of i in base 2)
.Explicación:
fuente
CJam,
179 byteso
Pruébalo aquí.
Explicación
Utiliza la definición alternativa dada en Wikipedia, basada en la paridad del número de
1
s en la representación binaria den
.La solución alternativa se utiliza
,
para convertirn
explícitamente en un rango[0 ... n-1]
antes de usar operadores infijos para calcular las representaciones binarias y el XOR sin necesidad de un bloque.Soluciones de bonificación
Aquí hay algunas soluciones basadas en otras definiciones. Si hay dos soluciones, la más corta explotará la memoria muy rápidamente (porque la precomputación genera
2^n
bits antes de truncarn
).Como un sistema L con
0 --> 01
y1 --> 10
:Al negar y agregar la parte anterior:
Usando la relación de recurrencia dada en el desafío, usando
divmod
y XOR para distinguir entre las dos definiciones recursivas:(Aunque, por supuesto, esta relación de recurrencia es solo una forma diferente de expresar la secuencia Thue-Morse como la paridad de los 1 bits en la representación binaria de
n
).fuente
42
(suponiendo un conjunto de bits) sería bastante irracional.:^
me hace feliz. En otra nota, santa mierda, ese es un algoritmo genial.:^}
?Dyalog APL,
87 bytesEste es un tren monádico que espera un origen de índice de 0 (
⎕IO←0
). La función no tren equivalente es{≠⌿(⍵⍴2)⊤⍳⍵}
.Explicación:
La salida es una lista separada por espacios de
0
y1
. Probarlo aquí .fuente
Mathematica,
3521 bytes¡Mathematica tiene incorporado una secuencia Thue-Morse!
Respuesta original:
fuente
LabVIEW, 15 primitivas de LabVIEW
ahora como gif súper elegante con una sonda
fuente
J,
1211 bytes@ MartinBüttner guardó un byte.
Esta es una función monádica (que significa unario), que se utiliza de la siguiente manera:
Explicación
Estoy usando la definición alternativa de que T n es la paridad del número de 1 bits en la representación binaria de n.
fuente
{.(,-)^:]
funciona para 9 bytes con cierta extensión de la regla ( que se ha permitido ). Por ejemplo, para5
que salga5 _5 _5 5 _5
. (Agregado solo como un comentario debido al estiramiento de la regla.)Pyth,
1110 bytesSalidas como una lista de estilo Python.
fuente
F
porque busqué 'reducir'. Podrías publicar como CW ...Japt ,
2911 bytesPruébalo en línea!
Salidas directamente como una matriz, que ahorra unos 4 bytes.
Sin golfos y explicación
Editar: ahora puede usar el siguiente código de 8 bytes (no válido; característica publicada después de este desafío):
fuente
Haskell,
393635 bytesPruébalo en línea!
Cómo funciona: comenzar con
[0]
y aplicar losx ++ invert x
-Funciónn
veces. Tome los primerosn
elementos de la lista resultante. Gracias a la pereza de Haskell, solon
se calculan los primeros elementos. Nota: el primero<*>
está en contexto de función, el segundo en contexto de lista.Con GHC v8.4 (que no estaba disponible en el momento del desafío) hay una solución de 34 bytes:
Editar: -3 resp. -4 bytes gracias a @Laikoni. -1 byte gracias a @ Ørjan Johansen.
fuente
(\x->x++map(1-)x)
puede ser acortado a([id,(1-)]<*>)
o(id<>map(1-))
con GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 bytes
Menos compacto que la solución de nimi, pero no quería negarle esta ofuscación de código funcional. Funciona para cualquier par de objetos; Por ejemplo, puede reemplazar
(f 0.f 1)
por(f 'A'.f 'B')
.Según la definición de que los primeros 2 n dígitos van seguidos de la misma secuencia de dígitos invertidos. Lo que hacemos es construir dos listas una al lado de la otra; uno para la secuencia, uno para el inverso. Continuamente agregamos partes cada vez más largas de una lista a la otra.
La implementación consta de tres definiciones:
La función
t
acepta cualquier número y devuelve la secuencia Thue-Morse de esa longitud. Las otras dos funciones son ayudantes.f
representa cualquier lista;f 0
es para la secuencia,f 1
para el inverso.g
se encarga de agregar repeticiones cada vez más largas de una lista a la otra.Violín: http://goo.gl/wjk9S0
fuente
Pari / GP , 33 bytes
Pruébalo en línea!
fuente
Burlesque, 21 bytes
Ejemplos:
Explicación:
Sin la
jri.+
parte, se quedará sin memoria (porque calculará la secuencia Morse de longitud increíblemente enorme ). Pero como Burlesque es perezoso, solo pedir el primer elemento n funcionará de todos modos.fuente
K5,
2713 bytesCalcular la secuencia es bastante fácil, el problema es evitar calcular demasiado. Podemos reconocer que la fácil expansión de la secuencia nos da una secuencia de cadenas que son potencias sucesivas de dos de longitud. Tomar la base de registro 2 de la entrada y redondear nos dará suficiente para trabajar y luego podemos reducirlo al tamaño apropiado:
Editar:
Una solución basada en la paridad:
En acción:
Tenga en cuenta que, dado que K5 no tiene una primitiva arbitraria de conversión a binaria, debo especificar, por ejemplo, una decodificación de 64 bits. K5 no utiliza matemática de precisión arbitraria, por lo que habrá un límite para el tamaño de las entradas que podemos tratar en cualquier caso.
fuente
Octava,
3331 bytesGuardado 2 bytes gracias a Thomas Kwa.
fuente
Perl 5,
6249 bytesSí, no es el mejor idioma para este, pero todavía me gusta cómo salió. Requiere 5.14+ para
/r
ysay
.Usando la definición de paridad, requiere 5.12+ para
say
:fuente
Prólogo (SWI), 115 bytes
Código:
Explicado:
Ejemplo:
Pruébalo en línea aquí
fuente
Retina ,
7069 bytesUsando la definición como un sistema L con palabras iniciales
0
y producciones0 --> 01
y1 --> 10
.La entrada se toma en unario .
Puede ejecutar el código desde un solo archivo con la
-s
bandera. O simplemente pruébelo en línea.Explicación
Precede
0;
a la entrada, donde0
está la palabra inicial y;
es solo un separador.El
(
indica que este es el comienzo de un ciclo (que se repite hasta que el ciclo deja de cambiar la cadena). Esta etapa en sí se convierte en0
y1
ena
yb
respectivamente (porqued
se expande a0-9
). Lo hace siempre que la palabra actual (cuya longitud se mide(.)+
sea más corta que la entrada (es decir, siempre que no podamos leer el final de la cadena haciendo coincidir tantos1
s como tenemos en la palabra).Reemplace
a
(suplente0
) con01
.Reemplace
b
(suplente1
) con10
. Este es también el final del ciclo. El ciclo termina una vez que la condición en la etapa de transliteración falla, porque entonces todos0
los1
sys permanecerán sin cambios y las otras dos etapas no encontrarán nada que coincida.El último paso es truncar la palabra a la longitud de la entrada. Esta vez medimos la longitud de la entrada con
(.)+
anticipación. Luego emparejamos esa cantidad de caracteres desde el comienzo de la cadena.fuente
Rubí, 33
Llame así:
Utiliza el hecho de que la paridad de los números binarios forma la secuencia thue-morse.
El carácter separador es nueva línea. Convierte el número
i
en una cadena binaria, luego calcula la suma de todos los códigos ASCII, módulo 2.Si la nueva línea no es un separador aceptable, lo siguiente no tiene separador para 2 bytes adicionales:
fuente
MATL , 9 bytes
Este lenguaje fue diseñado después del desafío .
Enfoque 1: 13 bytes
Esto construye la secuencia concatenando copias negadas de bloques de tamaño creciente.
Ejemplo
Explicación
Enfoque 2: 9 bytes
Utiliza el mismo enfoque que la respuesta de Alephalpha .
Ejemplo
Explicación
fuente
C,
8883 bytesCalcula la paridad para cada posición individual.
Violín: http://goo.gl/znxmOk
fuente
Jalea , 4 bytes
Tenga en cuenta que este desafío es más antiguo que Jelly.
Pruébalo en línea!
Cómo funciona
fuente
Matlab, 42
Estoy usando el hecho de que es lo mismo que comenzar
0
y luego repetir el paso de agregar el complemento de la serie actual,n
veces.fuente
𝔼𝕊𝕄𝕚𝕟, 11 caracteres / 23 bytes (no competitivo)
Try it here (Firefox only).
Los círculos son fuertes con este.
fuente
Bash,
7166 bytesSegún la definición de que los primeros 2 n dígitos van seguidos de la misma secuencia de dígitos invertidos.
$1
como parámetro es el número deseado de dígitos.Violín: http://goo.gl/RkDZIC
fuente
Lote, 115 + 2 = 117 bytes
Basado en la respuesta Bash.
Necesita un extra
/V
en la invocación para permitir el uso de!
s.fuente
ES6, 53 bytes
La recursión parecía más simple que un bucle.
fuente
Par , 8 bytes
Explicación:
Produce algo como:
fuente
Matemáticas ++ , 86 bytes
Usos
0.0\n
para 0 y1.0\n
para 1fuente
Arcyóu ,
5055 bytesTuve que agregar 5 bytes para que funcione correctamente :(
Explicación (con pseudocódigo Pythonesque a lo largo del lado:
fuente
Lisp común , 50 bytes
Pruébalo en línea!
fuente