(Inspirado en un primer borrador del desafío de línea fractal de PhiNotPi ).
Te dan un ancho W > 1
, una altura H > 1
y una cadena que consiste en 2(W+H-2)
caracteres ASCII imprimibles. La tarea es imprimir esta cadena envuelta alrededor de un rectángulo del ancho y alto dados, comenzando en la esquina superior izquierda, en sentido horario. El interior del rectángulo está lleno de espacios. Con suerte, los casos de prueba deberían dejar esto muy claro.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función, e imprimiendo el resultado en STDOUT (o la alternativa más cercana) o devolviéndolo como una cadena.
No debe haber espacios iniciales o finales (aparte de los que podrían estar en la cadena de entrada). Opcionalmente, puede generar una nueva línea final.
Este es el código de golf, por lo que gana el envío más corto (en bytes).
Casos de prueba
Cada caso de prueba es "String" W H
seguido por la salida esperada.
"Hello, World! "
5 4
Hello
,
!
dlroW
"+--+|||+--+|||"
4 5
+--+
| |
| |
| |
+--+
">v<^"
2 2
>v
^<
"rock beats scissors beats paper beats "
11 10
rock beats
s
s c
t i
a s
e s
b o
r
r s
epap staeb
Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~ O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando 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
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=47710;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Respuestas:
CJam, 27 bytes
Realmente no soy CJam, pero creo que esto supera a Martin. La principal diferencia es que empujamos una nueva línea antes de leer la entrada e imprimimos la primera línea inmediatamente, negando la necesidad de almacenar la altura.
Toma entrada en el orden
Pruébalo en línea.
fuente
Python 2, 95 bytes
Imprime la primera línea, luego las dos líneas verticales, luego la última línea.
Tiene que haber algo más corto que escribir
print
tres veces, pero todo lo que he intentado hasta ahora con guardar en una variable y'\n'.join
ha sido más largo.fuente
eval
en la entrada y poner entre corchetes las declaraciones de impresión.eval
en cuenta! El paréntesis no debería ser un gran problema ya queprint
en Python 2 necesita un espacio después. Pasar deprint blah
ap(blah)
todavía guarda 3 caracteres.CJam,
3130 bytesAnte la insistencia de Optimizer, aquí está mi propio intento. No soy fanático de ganar mis propios desafíos, así que cuento con la familia APL (o alguien mejor en CJam) para vencer esto. ;)
Toma información en el mismo orden que se da en la pregunta:
Pruébalo aquí.
Un byte guardado gracias a Optimizer.
Explicación
Originalmente, tuve una muy buena idea para comenzar con el rectángulo de espacios y luego, literalmente, envolver la cuerda alrededor de él mientras giraba la cuadrícula completa cuatro veces. Sin embargo, parece que no puedo lograr que funcione en caso de que el ancho o la altura o ambos lo sean
2
. Así que probé el enfoque ingenuo (imprimir arriba, bucle sobre los lados, imprimir abajo), y sorprendentemente resultó ser muy corto.fuente
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
ahorra 1 char.Pyth,
474645403736 bytesEste es el enfoque obvio implementado en Pyth. Imprime la primera línea indexando
0:width
y luego el medio, luego el final.Gracias a @Jakube por el consejo con el uso
z
yQ
por dos entradas y el usop
.Toma la entrada de stdin como una cadena y como una tupla de dimensiones, nueva línea separada:
y escribe a stdout.
Probar aquí .
fuente
z
para leer la cadena ahorra muchos caracteres. Tambiént_N
es lo mismo que-_N1
.++
usarp
y cambiar elzt_N
con*d-k2
.J, 61 bytes
Método:
Comenzando desde un
(height-2)*(width-2)
bloque de espacios, tomamos la cantidad necesaria de caracteres desde el final de la cadena y la agregamos al bloque actual. Repetimos esto 4 veces. El total de 5 estados ilustrados con el'Hello, World! ' 5 4
ejemplo (espacios reemplazados porX
s para facilitar la lectura):El código:
Definición explícita de funciones. La función de dos operandos toma una cadena como argumento izquierdo y una lista de dos enteros como argumento derecho.
Ejemplo de uso:
Pruébelo en línea aquí.
fuente
Pyth,
3837Originalmente tenía una solución 38 diferente, pero era básicamente una solución de golf de la respuesta de Maltysen. Así que decidí ir un poco diferente.
Pruébalo en línea .
fuente
_>z_ttH
es equivalente a<_zttH
.JavaScript (ES6),
110115Funciona con 3 parámetros, devolviendo una cadena
Chrome versión 119 : sin formato corto para funciones, sin parámetros predeterminados. No hay razón para usar,
for(of)
incluso si es compatibleES5 versión 126 : no para (of), no string.repeat
Sin golf
Prueba en la consola Firefox / FireBug
Salida
fuente
Python 2, 97 bytes
Tomando el enfoque directo.
fuente
Haskell,
164156bytesLa función
p
no imprime el resultado, pero lo devuelve como una cadena, por ejemplo,p 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Para una mejor visualizaciónputStr
:Cómo funciona: creo un bloque
w
xh
de espacios y reemplazo la primera línea con el comienzo de la cadena de entrada. Luego giro el bloque en sentido antihorario y repito reemplazando la primera línea otras tres veces.Para evitar volver a cortar el primer carácter después del turno 4, lo agrego a la cadena de entrada antes de comenzar.
Editar: encontró una mejor manera de resolver el problema de cortar el primer carácter después del turno # 4.
fuente
Postdata, 62 bytes
Por supuesto, esto usa tokens binarios, pero es equivalente a:
Aquí hay un hexdump del archivo (
xxd round.ps
):Correr como:
El resultado es realmente pequeño (como resultado de no escalar la fuente en absoluto), por lo que debe acercar un poco para verlo.
Esto aprovecha el
xyshow
operador para escribir la cadena utilizando espacios de caracteres personalizados. En este caso, uso el espaciado vertical negativo para escribir, luego el espacio horizontal negativo para escribir hacia atrás, luego el espacio vertical positivo para escribir hacia arriba. Debido a esto, no necesito usar ningún tipo de manipulación de cadenas.fuente
> <>,
8280 + 3 = 83 bytesPágina de Esolang para> <> (Pescado)
Esto resultó ser más corto de lo que esperaba. Utiliza el enfoque directo de imprimir la primera línea, luego las columnas rellenadas con los espacios centrales, luego la última línea.
Ingrese la cadena a través de STDIN y la altura y el ancho a través de la línea de comando con la
-v
bandera, así:Explicación
fuente
Bash + coreutils, 124
Un script de shell para comenzar:
Pase la entrada como argumentos de línea de comando:
fuente
JavaScript,
161160158 bytesEl método que se me ocurrió resultó demasiado largo, pero bueno, ha sido una práctica. (Además, lo deletreé
r+o[u]+'\n':d
).Para una entrada que no tiene sentido, la salida no está definida (literalmente, y muchas veces), pero funciona para todos los casos de prueba.
fuente
slice
es más corto quesubstr
, no es exactamente lo mismo, pero en este caso puede usarloGroovy, 140
llamada:
salida:
fuente
K
5554 bytesUsando el mismo enfoque que la implementación J de randomra; Comience con un bloque de espacios y agregue desde la cola de la cuerda hasta el borde mientras gira cuatro veces:
Y algunos ejemplos:
Desglosándolo un poco para facilitar la lectura,
Generar un bloque NxM:
Gire 90 grados usando transpose (
+
) y reverse-each (|:'
):Entonces, si tenemos un bloque de espacios
t
y una cadenas
, podemos anteponer una porción de la cola des
at
:Usamos el formulario
4 {[x] ... }/( ... )
para aplicar repetidamente una función a una tupla que consiste en la cadena y la matriz que estamos construyendo. Cada vez que hacemos este paso de rotación y concatenación, también cortamos la cadena.editar:
Otra idea es intentar dividir la cadena de entrada en los fragmentos que queremos en cada rotación, lo que simplifica el cuerpo principal del programa. Desafortunadamente, esto resulta ser un poco más largo a 56 bytes:
Si hay una mejor manera de calcular esos puntos divididos, estoy abierto a sugerencias.
edit2:
Reorganizar ligeramente me permite eliminar un par de paréntesis. 54 bytes!
fuente
K,
8068 bytesReducido de 80 gracias a @JohnE.
Original:
Apenas sé cómo funciona esto.
Ejemplo de uso:
Hay algunas optimizaciones posibles, pero sigo haciendo Kona segfault ...
fuente
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 caracteres por mi cuenta.R, 178
Esta es una función sin nombre que toma
s, w, h
como parámetros. Desearía que hubiera una mejor manera de dividir la cuerda.Sin golf
Prueba de funcionamiento
fuente
T-SQL, 307
Aunque todavía es terriblemente largo, resultó ser bastante más fácil (y más corto) de lo que pensaba en una consulta. Implementado como una función con valores de tabla en línea para T-SQL.
Esto se repite a través de la cadena @h veces. La primera recursión recorta @ W caracteres de la cadena. Las recursiones medias toman el último y el primero de la cadena restante con relleno de cadena entre ellas. La última recursión invierte lo que queda. Hay algunos caracteres perdidos relacionados con la forma en que SQL Server trata los espacios finales en VARCHARS.
Prueba de funcionamiento
fuente
Pyth, 33 bytes
Demostración.
fuente
MATLAB, 101
fuente
C ++, 398 bytes
Compilador utilizado - GCC 4.9.2 con
-std=c++14
banderaPruébalo aquí.
Explicación
fuente
char[][]
lugar?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
es un poco más corto quechar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195bytesEstoy seguro de que esto se puede mejorar mucho. Soy un novato. >, <
fuente
Java 11, 180 bytes
Pruébelo en línea (NOTA:
String.repeat(int)
se emularepeat(String,int)
para el mismo recuento de bytes, porque Java 11 aún no está en TIO).Explicación:
fuente
Carbón , 4 bytes
Pruébelo en línea (detallado) o pruébelo en línea (puro) .
Explicación:
Básicamente, una construcción para este desafío. Tome las dos primeras entradas enteras como ancho y alto, e imprima un cuadro con la tercera cadena de entrada como borde:
fuente