Escriba un programa o función que duplique letras en una palabra, de modo que todas las letras duplicadas dispuestas de izquierda a derecha en la palabra formen la matriz de entrada.
Por ejemplo:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
Entrada
- La palabra inicial (p
chameleon
. Ej. )
- Una matriz de caracteres (
[c,a,l,n]
) o una cadena para representar una matriz ( caln
), o algo similar
- La entrada puede ser a través de parámetros de función, STDIN o equivalentes de lenguaje
- Todas las entradas serán letras minúsculas (az)
Salida
La palabra cambiada
Si hay varias soluciones, se puede imprimir cualquiera
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Puede suponer que la palabra de entrada (no necesariamente la matriz) tendrá las letras en la matriz (en orden)
También puede suponer que las entradas no tienen letras consecutivas que sean iguales (NO manzana, geek, verde, vidrio, puerta ...)
Ejemplos
input: abcdefghij, [a,b,c]
output: aabbccdefghij
input: lizard, [i,a,r,d]
output: liizaarrdd
input: coconut, [c,o]
ouput: ccooconut or coccoonut or ccocoonut
input: onomatopoeia, [o,o,a,o,o]
output: oonoomaatoopooeia
input: onomatopoeia, [o,a,o]
output: oonomaatoopoeia or onoomaatoopoeia or oonomaatopooeia etc.
¡El programa más corto gana!
Tabla de clasificación (gracias a Martin Büttner por el fragmento)
/* Configuration */
var QUESTION_ID = 51984; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
/* App */
var answers = [], page = 1;
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 getAnswers() {
jQuery.ajax({
url: answersUrl(page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
//console.log(a);
var answer = jQuery("#answer-template").html();
var num = headline.match(NUMBER_REG)[0];
var size = (headline.match(SIZE_REG)||[0])[0];
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
if (size != lastSize)
lastPlace = place;
lastSize = size;
++place;
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", user)
.replace("{{LANGUAGE}}", language)
.replace("{{SIZE}}", size)
.replace("{{LINK}}", a.share_link);
answer = jQuery(answer)
jQuery("#answers").append(answer);
languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) 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: 50%;
float: left;
}
#language-list {
padding: 10px;
width: 50%px;
float: left;
}
table thead {
font-weight: bold;
}
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>
[c,o,c,o]
, en lugar de[c,o]
.#answer-list
y#language-list
ancho50%
para evitar la superposición de columnas en su fragmento.bash
+sed
respuesta): ¿Es ilegal parabanana, na
=>baannana
? Creí que "Puede suponer que todas las entradas tendrán las letras en la matriz (en orden)" están destinadas a permitir , pero no requieren , respuestas para procesar ambas listas secuencialmente, pero @manatwork lo interpretó de manera diferente.Respuestas:
Pyth, 14 bytes
Demostración.
Estilo de entrada:
Explicación:
fuente
Brainfuck,
4645 (63 con caracteres imprimibles en la entrada)Compatible con bff de Alex Pankratov (intérprete de brainfuck usado en SPOJ e ideone) y BFI de Thomas Cort (usado en Anarchy Golf).
La versión imprimible toma la matriz primero como una cadena, seguida de una pestaña, seguida de la cadena inicial sin nueva línea final.
Demostración sobre ideona.
Podemos guardar algunos bytes utilizando
\x00
como separador en lugar de tabulador:fuente
CJam, 15 bytes
Pruébalo en línea.
Cómo funciona
fuente
C, 62 bytes
Bueno, esto es sorprendentemente competitivo.
Definimos una función
f(char*, char*)
que toma la cadena como su primera entrada y la matriz de caracteres para duplicar como su segunda entrada.Algún código de prueba:
Que imprime:
Pruébalo en línea !
Si es aceptable enviar una macro en lugar de una función, los siguientes
#define g(s,c)
son solo 58 bytes , pero requierens
yc
deben ser punteros reales:fuente
CJam, 15 bytes
Un enfoque alternativo de CJam. Pruébalo en línea
Explicación
Para cada personaje en la segunda cadena, hacemos dos cosas.
Dividir el sufijo actual de la cadena por el carácter, p. Ej.
"beeper" "e" -> ["b" "" "p" "r"]
Descomprime la primera cadena de la matriz, inserta dos de los caracteres y luego vuelve a unir el resto de la matriz con el carácter, por ejemplo
"b" "ee" "eper"
. La última cadena es el nuevo sufijo.fuente
Retina, 33 bytes
Más información sobre Retina.
Esto espera las dos cadenas en STDIN, separadas por una nueva línea.
Para fines de conteo, cada línea entra en un archivo separado,
\n
debe reemplazarse con un carácter de nueva línea real (0x0A). Si realmente quiere probar esto, es más conveniente poner esto en un solo archivo donde\n
permanece como está y luego invocar a Retina con la-s
opción antes de pasar el archivo.Explicación
(Anticuado ... logré deshacerme del marcador ... actualizaré esto más tarde).
Cada par de líneas es una sustitución de expresiones regulares (primera línea el patrón, segunda línea la sustitución).
Esto pone un
#
como marcador al comienzo de la cadena de entrada.Esto encuentra la primera letra en la entrada (después del marcador) correspondiente a la siguiente letra que se duplicará, duplica esa letra, mueve el marcador detrás de ella y suelta el primer carácter de la segunda cadena. El
+`
en el frente le dice a Retina que haga esto repetidamente hasta que la cadena deje de cambiar (en este caso, porque la segunda cadena está vacía y todas las letras requeridas se han duplicado).Finalmente, limpiamos la cuerda soltando el marcador.
fuente
Python, 61
Una solución recursiva codiciosa. Guarda
b
si la primera letra de la cadenas
es la primera letra de la cadenal
de letras que se duplica. Si es así, tome una de esas letras y añádala a la llamada recursiva con el resto des
, eliminando el primer elemento del
. Si nob
, haga lo mismo pero no duplique la letra y no la quitel
.Los controles de código
s[:1]==l[:1]
en lugar des[0]==l[0]
para evitar un error de índice de fuera de límites cuandos
ol
está vacía.fuente
Prolog,
95837956 bytesEjemplo:
devoluciones
Editar: Guardado 4 bytes gracias a Oliphaunt
Edit2: se guardaron 20 bytes utilizando el
put/1
predicado SWI-Prolog en desuso en lugar dewritef
. Se guardó un byte reemplazando el predicado final de recursiónd([],_).
end(_,_).
. Sind
embargo, no funcionará si se intercambia el orden de las dos definiciones de , pero eso no nos importa en el código de golf. Guardado otros 2 bytes eliminando el paréntesisH=[A|T],put(A),d(S,T)
fuente
H=[A|T]
. Además, ¿por qué no hacerlo más legible reemplazando los espacios con líneas nuevas?Python 2,
83747265 BytesNo hay trucos especiales reales aquí.
x
es la cadena,y
es la matriz de caracteres que se duplican.Para aclarar si esto no se copia correctamente, el primer nivel de sangría es un espacio, el siguiente es una pestaña.Edición 1: guardado 9 bytes mediante la manipulación de cadenas en lugar de pop ().
Edición 2: se guardaron 2 bytes al usar
-~
para incrementarg
en 1.Edición 3: ¡Guarde 7 bytes usando
y[:1]
truco, gracias a xnor por esto!Compruébalo aquí.
Formateado y explicado adecuadamente:
fuente
y[:1]
.y=y[g:]
, así que "bastantes" es una exageración.y[:1]==c
. ¿Eso funciona?Excel VBA, 110 bytes
Esta es mi primera entrada a CodeGolf, así que espero que esté bien.
Ingrese la palabra de entrada en A1 y luego las letras que se reemplazarán en B1 y la palabra resultante se muestra en un cuadro de mensaje.
fuente
Haskell, 42 bytes
Ejemplo de uso:
Cómo funciona:
Si una cadena está vacía, el resultado es la primera cadena. De lo contrario: si los primeros caracteres de las cadenas coinciden, tómalo dos veces y agrega una llamada recursiva con las colas de las cadenas. Si los caracteres no coinciden, tome el primer carácter de la primera cadena y agregue una llamada recursiva con la cola de la primera cadena y la misma segunda cadena.
fuente
Pyth,
1817 bytesDemo en vivo.
Guardado 1 byte gracias a @Jakube.
Explicación:
Versión original:
Demo en vivo para original.
fuente
Javascript, 47 bytes
Aprovechando algunas características de ES6.
fuente
onomatopoeia
,oao
?b.indexOf(d)==0
, intente~b.search(d)
search
solo es aplicable en cadenas. Tuve que cambiar b por una matrizPyth, 16 bytes
Pruébelo en línea: demostración
Esto es bastante hacky. Los lenguajes basados en pila pueden tener una ventaja aquí.
Explicación
fuente
JavaScript ES6, 47 bytes
Asume que
s
es una matriz["c","a","l","n"]
fuente
> <> (Pez) ,
6834 BytesPuede ejecutarlo en http://fishlanguage.com/playground ingresando la cadena como la pila inicial (con "marcas, es decir," camaleón ") y la matriz de letras adicionales como la pila de entrada (sin" marcas, es decir, caln).
No olvide presionar el botón Dar para sembrar la pila de entrada.
EDITAR: a la mitad! :)
fuente
R, 119
Según la respuesta de @ Alex , este es un par de bytes más corto:
Sin golf:
fuente
Perl,
73625956Un enfoque completamente nuevo produce resultados mucho mejores. Aún así, apuesto a que puede ser más corto.
Llamar como
f('coconut', ['c','o'])
.Para cada carácter de la matriz, encuentre la primera aparición y duplíquela, y convierta todo en mayúsculas. Luego devuelva la cadena completa, convertida a minúsculas.
EDITAR: afeitó un par de personajes más al deshacerse de
shift
ypop
.La versión anterior:
fuente
foreach
palabra clave es en realidad un sinónimo de lafor
palabra clave, por lo que puede usar cualquiera de ellos". - Foreach Loops .)for
pista. En realidad es más corto ahora.Rubí,
5247 bytesSolución:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Ejemplo:
p f.call('banana', ['n','a']) # => "bannaana"
Explicación:
Forma de proceso de un método que toma una cadena como primer argumento y una matriz de caracteres como segundo argumento. Asigna un bloque a una matriz de caracteres en el argumento de cadena, que comprueba cada carácter con el primer elemento de la matriz de comparación y, si hay una coincidencia, elimina el primer elemento de la matriz de comparación y lo duplica.
actualizar
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
fuente
s,a
. Y*''
es equivalente a.join
. Eso es 5 bytes guardan, pero todavía vencieron a usted por una (por ahora): DPerl, 51 bytes
La entrada se proporciona a través de STDIN. La primera entrada es la palabra inicial (p
chameleon
. Ej. ), La segunda entrada son las letras como una sola cadena (pcaln
. Ej .).Lo anterior es solo una forma ofuscada (léase "más bonita") de hacer lo siguiente:
A medida que avanzamos por cada letra, reemplazamos desde el comienzo de la palabra hasta la letra en la palabra fuente con solo la nueva letra, y agregamos la coincidencia (almacenada
$&
) a nuestro resultado. Como la coincidencia incluye la letra y luego se reemplaza con la letra, cada letra termina apareciendo dos veces.Debido a que STDIN agrega un nuevo carácter de línea a nuestras dos entradas, estamos garantizados para capturar los restos de la palabra completa en la última coincidencia, es decir, el nuevo carácter de línea.
fuente
REGXY, 24 bytes
Utiliza REGXY , un lenguaje basado en la sustitución de expresiones regulares. Se supone que input es la palabra inicial y la matriz, separados por espacios (por ejemplo, "camaleón caln")
El programa funciona haciendo coincidir un carácter en la primera cadena con el primer carácter después de un espacio. Si esto coincide, el carácter se repite en la sustitución y el carácter de la matriz se elimina (bueno, no se vuelve a agregar a la cadena). El procesamiento pasa a la segunda línea, que es solo un puntero a la primera línea, lo que hace que el procesamiento se repita en el resultado de la sustitución anterior. Eventualmente, no habrá caracteres después del espacio, en cuyo punto coincidirá la segunda rama de la alternancia, eliminando el espacio final del resultado. La expresión regular no coincidirá, se completará el procesamiento y se devolverá el resultado.
Si ayuda, los pasos iterativos de ejecución son los siguientes:
El programa compila y se ejecuta correctamente con el intérprete de muestra en el enlace anterior, pero la solución es quizás un poco descarada ya que se basa en una suposición en la imprecisión de la especificación del lenguaje. La especificación establece que el primer token en cada línea (antes de /) actúa como una etiqueta, pero se supone que un puntero de etiqueta nulo apuntará de nuevo al primer comando en el archivo con una etiqueta nula (o en otras palabras, ese 'nulo' es una etiqueta válida). Una solución menos descarada sería:
Que asciende a 27 bytes
fuente
JavaScript ES6, 72 bytes
Esta es una función anónima que toma 2 parámetros: la palabra inicial como una cadena y los caracteres para estirar como una matriz. Código no protegido que usa ES5 y prueba la interfaz de usuario a continuación.
fuente
Pitón 2, 77
Llamar como:
Es posible que el byte cuente horriblemente mal ... Usa una mezcla de espacios y pestañas.
fuente
rs, 39 bytes
Más información sobre rs.
Ya hay una respuesta de Retina, pero creo que esta usa un enfoque ligeramente diferente. También se crearon por separado: cuando comencé a trabajar en este, esa respuesta no se había publicado.
Además, este es 6 bytes más largo de todos modos. :)
Demostración en vivo y conjunto de pruebas.
fuente
JavaScript, 92 caracteres
Versión no ofuscada:
fuente
R,
136128122 bytesEsto crea una función sin nombre que acepta una cadena y un vector de caracteres como entrada e imprime una cadena en STDOUT. Para llamarlo, dale un nombre.
Ungolfed + explicación:
Ejemplos:
¡Ahorré 8 bytes gracias a MickeyT y otros 3 gracias a jja!
fuente
cat(p,sep='')
salida directa a STDOUT para un parmessage(p)
es más corto.message
, ¡eso es increíble! ¡Gracias! Editado para usar su sugerencia.Bash + sed, 51
Entrada de stdin; caracteres que se duplicarán como argumento único:
Esto funciona construyendo un programa sed
$2
y luego ejecutándolo$1
. El programa sed reemplaza la primera aparición de cada letra de reemplazo con dos copias de su versión en mayúsculas, y descarta todo el lote al final. Para el ejemplo anterior, el programa sed generado esbonito estampado:
Uso mayúsculas para marcar los caracteres procesados hasta ahora; Esto evita volver a duplicar los caracteres que ya se han duplicado, o aplicar una duplicación anterior a la anterior.
Versión anterior, antes de aclarar que el orden de la lista de reemplazo es significativo (44 caracteres):
fuente
strtech na <<< banana
produce "baannana", pero primero se debe duplicar una aparición en "n", solo después de eso aparece "a".Python,
5392 bytesEncontré que mi solución tenía la misma longitud en Python 2 y 3.
EDITAR: Hombre, arreglar ese caso al hacer múltiples reemplazos de la misma letra (mientras todavía se usa el mismo método) tomó un poco de trabajo.
Python 2:
Pruébalo aquí
Python 3:
fuente
Mathematica, 66 bytes
Ejemplo:
fuente
Lua,
767876755853 bytes¡Nueva solución completamente reelaborada con la ayuda de wieselkatze y SquidDev! vamos chicos, podemos vencer a brainfuck: P
Explicación que viene mañana. Pruébalo aquí.
Solución original: ¡Ahorré 2 bytes gracias a @ kirbyfan64sos!
Lua es un lenguaje bastante terrible para el golf, así que creo que lo hice bastante bien para este.
Explicación del código, junto con la versión sin golf:
Pruébalo aquí. (El código desactualizado pero el mismo concepto, solo que menos golfizado, actualizará mañana)
fuente
function f(x,y)
y despuésprint(x)
, ahorrándote dos bytes.