Aquí hay un desafío relativamente simple para ti.
Dada una cadena de longitud N , envíe la cadena hacia adelante, luego hacia atrás, luego hacia adelante, luego hacia atrás ... etc. N veces. Por ejemplo, si su entrada fue
Hello!
Deberías generar:
Hello!!olleHHello!!olleHHello!!olleH
Opcionalmente, también puede generar una nueva línea final.
Su envío puede ser un programa completo o una función, y puede tomar entradas y salidas en cualquier formato razonable . Por ejemplo, puede tomar IO de STDIN / STDOUT, argumentos de función y valor de retorno, de un archivo, etc. Puede asumir con seguridad que la cadena de entrada no estará vacía y solo contendrá ASCII imprimible. Usted debe enviar la nueva cadena en una sola línea. Entonces, por ejemplo, si el resultado del último ejemplo fue
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
¡Esta no sería una solución válida!
Aquí hay algunos casos de prueba más:
Input:
a
Output:
a
Input:
abcd
Output:
abcddcbaabcddcba
Input:
OK!
Output:
OK!!KOOK!
Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184
Input:
PPCG
Output:
PPCGGCPPPPCGGCPP
Input:
42
Output:
4224
Tablas de clasificación
Dado que este es un desafío de código de golf , las lagunas estándar están prohibidas, ¡y la respuesta más corta en bytes gana! Sin embargo , esta también es una competencia para tener la respuesta más corta en cualquier idioma en particular. Si bien es poco probable que una respuesta de Java supere a una respuesta en perl, o en algún lenguaje de golf, sigue siendo muy impresionante tener la respuesta de Java más corta. Entonces, puedes usar esta tabla de clasificación para ver ambos
La respuesta más corta de todos los idiomas, y
La respuesta más corta en cada idioma individual.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=93261,OVERRIDE_USER=31716;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>
olleH
, noelloH
?Respuestas:
Vim,
39, 34 pulsaciones de teclas¡5 bytes guardados gracias a @Lynn!
Aquí hay un gif de suceder en vivo: (Tenga en cuenta que este gif es de una versión anterior ya que no he tenido tiempo de volver a grabarlo).
Y aquí hay una explicación de cómo funciona:
En una nota al margen,
Y
toma una nueva línea adicional, que generalmente es una característica desagradable. ¡Esta es probablemente la primera vez que realmente ha guardado varios bytes!fuente
:%s/\n<cr>
, puede hacerv{gJ
para guardar tres bytes.@q
está vacío al principio, ¿verdad? o@q
antes de detener la grabación haría algo arbitrario. (Esto me lleva a mi vim trivium favorito que se me ocurrió: todos saben que salir de vim es tan fácil como:q<CR>
, pero ¿cómo cierras y guardas todos tus archivos? ¡Fácil: soloqqqqqZZ@qq@q
!)@q
estar vacío. ¿Por qué no simplemente hacer en su:wqa
lugar? ¿También quieres saber cómo generar un fractal en vim?qqqqq<C-w>v<C-w>n@qq@q
: DPython, 40 bytes
Una función recursiva. Antepone la cadena de entrada
s
a la función del reverso hasta que el contadori
exceda la longitud des
.fuente
lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]
por un byte.f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])
pero es de 136 bytessys.sizeof
, curiosamente, es del mismo tamaño quef = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Cerebro-Flak ,
418378228 bytesEsta es mi obra maestra Brain-Flak. Puede que no esté bien jugado, pero el desafío es el más difícil que he encontrado.
Pruébalo en línea!
Explicación
Esta explicación ahora está un poco desactualizada pero todavía hace un buen trabajo al explicar el programa.
Esta explicación va a ser un poco diferente de mi proceso de explicación habitual. Voy a explicar cómo llegué a este resultado en lugar de explicar el resultado en orden. Aquí va:
Rodillo
Después de trabajar un poco en el problema, se me ocurrió este código:
Este código (donde n es el literal para algún número, por ejemplo
()()
) tomará el elemento en la parte superior de la pila y lo moverá hacia abajo n pasos. Con n como la altura de la pila, se realizará un "roll" de la pila. es decir, mover el elemento superior al final de la pila. Así es como funciona:Ponemos el lugar donde queremos mover el elemento a menos uno en la pila. ¿Por qué menos uno? No sé, simplemente funciona de esa manera.
Luego realizamos un ciclo hasta que este número llegue a cero, manteniendo el seguimiento del ciclo con a
()
.Cada vez que hacemos un bucle, recogemos el elemento superior y lo movemos debajo de él a la otra pila. Esto pone el número en la parte superior en su lugar.
Todo lo que tenemos que hacer ahora es poner los números que retrocedimos. Cambiamos a la pila apagada y empujamos el número de corridas realizadas por el ciclo.
Hacemos un bucle decrementando el número recién empujado hasta que llegue a cero. Cada vez que retrocedemos un número.
Marcha atrás
Luego modifiqué el rollo para hacer una pila completa inversa:
Una vez más, n representa la profundidad del reverso. Es decir, los n elementos principales de la pila se revertirán. Cómo funciona:
El reverso es solo un rodillo envuelto lujosamente. Simplemente rodamos la parte superior de la pila n veces disminuyendo la profundidad del rollo en uno cada vez.
Duplicar
En el lugar, la duplicación es difícil. Realmente difícil. Después de descubrir cómo invertir la pila, todavía me costó mucho trabajo encontrar el algoritmo de duplicación.
Aquí está:
Es un poco grande, pero así es como funciona:
Comience presionando n. n es la profundidad del duplicado. También abrimos dos paréntesis. Estos nos permiten almacenar el valor de la n en el ámbito hasta que sea necesario nuevamente.
A continuación, hacemos un bucle n veces cada vez que empujamos el valor superior de la pila a la pila dos veces. Esto hace que los duplicados iniciales para cada número en la pila.
Ahora tenemos dos copias de cada número en la pila. Necesitamos separarlos en dos grupos.
Entonces cambiamos a la pila y recuperamos una de las ns que guardamos al principio.
Hacemos bucles n veces.
Cada vez que movemos una copia al mainstack.
Y rodar una copia al final de la pila. (Esto supone que la pila estaba vacía para comenzar haciendo que este duplicado no se apile)
Una vez hecho esto, hemos dividido el original en dos grupos, el "original" y una copia en la pila (la copia está en realidad al revés). Entonces, simplemente movemos la copia a la pila principal y podemos terminar con ella.
Programa esqueleto
Ahora que he hecho todas las piezas del programa, solo tengo que insertarlas en un marco.
El marco duplica el texto una vez menos que la altura de la pila usando el duplicado.
Y luego invierte la pila en incrementos decrecientes de la altura inicial de la pila de n ^ 2-n a 0.
fuente
Gelatina ,
43 bytesPruébalo en línea! o Verificar todos los casos de prueba.
Salvó un byte gracias a @ Maltysen .
Explicación
fuente
L
PHP,
5452 bytes(49 bytes, pero no funcionan si la cadena contiene '0')
(52 bytes)
(54 bytes)
fuente
str_pad
. ¡Buena esa!2sable , 3 bytes
Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
Ruby, 39 bytes
Le chupo a Ruby. Ayuda de golf es apreciada.
Ruby es un lenguaje muy agradable para esto debido a
.reverse!
Explicación
Esperaba que fuera algo simple como:
pero debido a la restricción repetitiva / desafío es más largo.
Lo que
s.reverse!
es muy útil.s.reverse!
es básicamentes = s.reverse!
, lo que significa que también mutas
.Lo que hace cada sección del programa se describe a continuación:
Lo bueno de
s.reverse!
eso es que cada vez que se evalúa la cadena se voltea. Entonces, ya que reemplaza la cadena.s
¡es modificado!fuente
-p
bandera puede guardar 4 bytes:$_.reverse!;gsub(/./){$_.reverse!}
.chomp
sobre el$_
? parece incluir la nueva línea en este momentoruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txt
dóndefile.txt
está una línea sin la nueva línea final: V De todos modos, si decides no hacer eso, no necesitas parens en el lambda, así que->s
funcionas.gsub(/./){s.reverse!.reverse}
Perl, 24 bytes
Incluye +2 para
-lp
Dar entrada en STDIN:
rev.pl
:Sorprendentemente, esto no utiliza el
reverse
operador incorporado . Ese nombre es tan largo, todas las soluciones que se me ocurrenreverse
son al menos 1 byte más largas.fuente
J,
138 bytes¡Ahorró 5 bytes gracias a millas!
Este es un tren de 5 con los siguientes verbos:
La bifurcación interna se compone de
]
(identidad),;
(enlace) y|.
(reverso). Observar:Los dos verbos externos forman el resto del tren.
#
es, en este caso, el tamaño del argumento, es decir, la longitud. El verbo que une estos es;@$
, oravel
terminadoreshape
. Observar:Antigua solución
Suficientemente simple.
|.
es inverso y^:
es una conjunción de potencia, que repite su verbo izquierdo (mano derecha) # de veces. Cuando el argumento correcto es un verbo, ese verbo se llama al argumento. El verbo correcto en este caso es el rango de cero (i.
) a la longitud (#
). Cuando se eleva a una matriz, los resultados intermedios se mantienen. Todo lo que hay que hacer es aplanar la matriz con,
.Resultados intermedios
fuente
<@#
#;@$];|.
que encajona el inicio y el reverso, da nueva forma a las cadenas en caja y las arrasa juntasJavaScript (ES 6),
5950 bytes9 Bytes gracias a Hedi y Huntro.
función recursiva.
Invertir la cadena toma casi la mitad del tamaño (
2522 bytes!) ...¿Por qué no hay una forma nativa para eso?
fuente
s[n]?...
intead den<s.length?...
[...s]
lugar des.split``
f=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)
que también sería mejor con una mejor función para el rangoSyntaxError: Unexpected token )
JS no tiene reversión de cadena nativa.SyntaxError: Invalid or unexpected token
para su segunda sugerencia ¿En qué navegador funciona eso?Minkolang , 17 bytes:
Pruébalo aquí!
Explicación
fuente
8088 Assembly, IBM PC DOS,
2928 bytesMontado,
xxd
volcado:Listado sin ensamblar:
Programa ejecutable independiente de DOS para PC. Cadena de entrada a través de la línea de comando, la salida es la consola.
fuente
Pip ,
1110 bytesPruébalo en línea!
Explicación:
fuente
Haskell,
403632 BytesEjemplo:
Aún más corto (crédito a Damien):
s >> [s, reverse s] cycles ["abc", "cba", ...] que está comprimido al tamaño correcto y concatMap'ped con fst
fuente
q s=zip(s>>[s,reverse s])s>>=fst
(>>=fst).(iterate reverse>>=zip)
Perl 6 ,
3130 bytesAhorre un byte por mal uso
.ords
, lo que devuelve una lista de ordinales, luego implícitamente conviértalo en un número para crear un rango.Explicación:
Uso:
fuente
Vim + coreutils, 32 pulsaciones de teclas
Nunca puedes tener demasiadas respuestas Vim.
Explicación
fuente
MATL,
13128 bytesEmpuja todos los elementos, combina al final.
Pruébalo en línea!
Versiones antiguas:
Enfoque completamente diferente, basado en
fprintf
:Versión basada en revertir una cadena de plantilla
fuente
td
!tnq:"
Primero tuve lo obvio , perotn:"
es un poco un olor a código (vea este consejo de golf de Matlab), así que pensé que tambiéntnq:
podría ser más compacto.Scala,
737271 bytesEste es mi primer intento de golf de código, así que estoy seguro de que hay innumerables mejoras.
Actualizar:
Golfed 1 byte quitando los soportes.
Gracias a Destructible Watermelon por su sugerencia, afeitado un byte.
fuente
i%2==1
ai%2>0
?Cubix , 52 bytes
En un cubo:
Este fue divertido; Todavía hay bytes por jugar, pero esto definitivamente funcionará.
Pruébalo en línea!
explicación:
Entrada de
ABC
/A
: ir al norte y leer todas las entradas como caracteres;-1
estará en la parte inferiorp\;.
: eliminar el-1
de la pilau#
: empuje la longitud de la cadena (número de elementos en la pila)\:\:qq
: duplica la longitud de la cadena dos veces, empuja dos copias al final de la pilalazo:
soq(?/<u
: intercambie la parte superior de la pila, salga de la parte superior de la pila como ASCII, presione la parte superior (letra) hacia abajo, disminuya la parte superior de la pila, gire a la derecha si no lo hizo, luego mueva la IP al lugar correcto.C B A 3 3 0
;u
: pop top of stackC B A 3 3
B
: pila inversa3 3 A B C
p(
: mover de abajo hacia arriba y disminuir3 A B C 2
?
si la parte superior es cero, vaya directamente@
y terminepsq:uq
: mover de abajo hacia arriba, intercambiar de arriba hacia arriba y mover de arriba hacia abajo dup, y mover de arriba hacia abajo3 2 A B C 3
$u
: saltaru
<
nos vuelve a poner en el circuito.Interprete
fuente
C (gcc) ,
888785836866838278 bytes-1 gracias a ceilingcat
Versión antigua
Pruébalo en línea!
Versión más corta (ligeramente rota)
Refiriéndose al enfoque de 76 bytes de ASCII, solo en los comentarios, y -1 byte de su ajuste de mi ajuste.
Editar: esta versión está ligeramente rota, ya que supone que cada cadena está precedida por un byte NULL, que no siempre es cierto. (Ver último caso de prueba en el enlace). Volviendo a la versión de 83 bytes por ahora.
Pruébalo en línea!
fuente
Java,
12711188 bytesPrograma de prueba sin golf
fuente
(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};
( 88 bytes ). Además, especificaría que esto es Java 8.R, 53 bytes
Asume que la entrada está separada por espacio o nueva línea para cada carácter.
Algunos casos de prueba:
fuente
PowerShell v2 +, 57 bytes
No hay una forma realmente limpia de obtener longitudes de cadena o invertirlas, por lo que esto es bastante largo.
Toma entrada
$a
, recorre desde1
hasta$a.length
(almacenado$x
para su uso posterior). Cada iteración usamos un pseudoternario para indexar en una matriz de uno$a
o$a[$x..0]
(es decir, invertido), en función de si nuestro número de entrada es impar / par[$_%2]
. Todos estos están encapsulados en parens y editados-join
juntos para formar una sola cadena. Eso queda en la tubería, y la salida es implícita.fuente
Java, 151 bytes
}
Sin golf:
fuente
public static
antes de su método. Puede eliminar los espacios entret=new StringBuffer
. Puede eliminar los paréntesis y paréntesis innecesarios. Y puede cambiar la verificación del módulo de==1
a<1
(que es equivalente a==0
para números no negativos). Además, puede moveri++
al último uso dentro del ciclo for.void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}
( 105 bytes )C #, 94 bytes
76 bytes para el método + 18 bytes para la importación LINQ.
Cómo funciona:
fuente
CJam , 10 bytes
Pruébalo en línea!
Explicación
fuente
Octava,
3935 bytesExplicación:
Guardado 4 bytes gracias a Luis.
~x
en lugar de0*x
guardar un byte (funciona porque todos los elementos de x no son cero. enflip
lugar deflipud
guardar otros dos bytes (no sabía queflip
existían).fuente
bash + util-linux,
685853 bytesExplicación
Dos cosas con el
for
bucle:for
bucles donde uno reemplaza las palabras clavedo
ydone
con llaves{
y}
. El espacio después del primer paréntesis es necesario, y el punto y coma al final también es necesario.for
bucles de "estilo C" , puede simplemente inicializar con eni;
lugar de usari=0;
.${#1}
parte de la condición sei < ${#1}
refiere a la longitud de nuestra entrada (el primer parámetro$1
). En general, puede usar${#foo}
para recuperar el tamaño de la cadena$foo
.Adicionalmente:
rev
es la herramienta en util-linux que invierte una cadena.-n
bandera paraecho
deshacernos de las nuevas líneas.rev<<<$y
se llama here-string (consulte esta página relevante de tldp.org ), que pasa la variable$y
a la entrada estándar derev
.fuente
do
ydone
palabras clave en unfor
bucle, que en realidad no necesita ese espacio!y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}
... guardó un par de bytesJapt , 11 bytes
Pruébalo en línea!
fuente
î
nuevo, ¿no?05AB1E , 7 bytes
Pruébalo en línea!
Continuará trabajando en ello. Realmente no me gusta la parte "v}", probablemente pueda guardar un byte allí.
Explicación
fuente
vÂ}\J
5 bytes es lo mismo que su código, pero con los componentes que estaba buscando. :)Â
es Bifurcado (abreviatura de Duplicar e Invertir, que es exactamente lo que estás haciendo).\
elimina el elemento superior en la pila.