(Inspirado por um rascunho inicial do desafio da linha fractal do PhiNotPi .)
Você recebe uma largura W > 1
, uma altura H > 1
e uma sequência que consistem em 2(W+H-2)
caracteres ASCII imprimíveis. A tarefa é imprimir essa sequência em volta de um retângulo da largura e altura especificadas, começando no canto superior esquerdo, no sentido horário. O interior do retângulo é preenchido com espaços. Esperamos que os casos de teste deixem isso muito claro.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função e imprimindo o resultado em STDOUT (ou alternativa mais próxima) ou retornando-o como uma sequência.
Não deve haver espaços à esquerda ou à direita (além daqueles que possam estar na cadeia de entrada). Opcionalmente, você pode gerar uma única nova linha à direita.
Isso é código de golfe, então a submissão mais curta (em bytes) vence.
Casos de teste
Cada caso de teste é "String" W H
seguido pela saída 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
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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>
Respostas:
CJam, 27 bytes
Eu realmente não CJam, mas acho que isso bate em Martin. A principal diferença é que pressionamos uma nova linha antes de ler a entrada e imprimimos a primeira linha imediatamente, negando a necessidade de armazenar a altura.
Recebe entrada na ordem
Experimente online.
fonte
Python 2, 95 bytes
Imprime a primeira linha, as duas linhas verticais e a última linha.
Tem que haver algo mais curto do que escrever
print
três vezes, mas tudo o que tentei até agora ao salvar em uma variável e'\n'.join
foi mais longo.fonte
eval
a entrada e colocar as instruções de impressão entre parênteses.eval
em conta! O parêntese não deve ser muito problemático, já queprint
no Python 2 precisa de um espaço depois dele. Passar deprint blah
parap(blah)
ainda salva 3 caracteres.CJam,
3130 bytesPor insistência do Optimizer, aqui está minha própria tentativa. Eu não sou fã de vencer meus próprios desafios, então estou contando a família APL (ou alguém melhor no CJam) para vencer isso. ;)
Recebe entrada na mesma ordem que a pergunta:
Teste aqui.
Um byte economizado graças ao Optimizer.
Explicação
Originalmente, eu tinha uma ideia muito boa de começar com o retângulo de espaços e, em seguida, literalmente enrolar a corda ao redor dela enquanto girava a grade inteira quatro vezes. No entanto, não consegui fazer isso funcionar no caso de largura, altura ou ambas
2
. Então, tentei a abordagem ingênua (parte superior de impressão, laço nas laterais, parte inferior de impressão) e, surpreendentemente, ela foi realmente curta.fonte
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
salva 1 caractere.Pitão,
474645403736 bytesEssa é a abordagem óbvia implementada no Pyth. Imprime a primeira linha indexando
0:width
e depois no meio e depois no final.Obrigado a @Jakube pela dica de usar
z
eQ
por duas entradas e usop
.Recebe a entrada do stdin como uma sequência e como uma tupla de dimensões, nova linha separada:
e escreve para stdout.
Experimente aqui .
fonte
z
para ler a string economiza muitos caracteres. Tambémt_N
é a mesma coisa que-_N1
.++
usarp
e alternezt_N
com*d-k2
.J, 61 bytes
Método:
Começando com um
(height-2)*(width-2)
bloco de espaços, pegamos a quantidade necessária de caracteres do final da string e a adicionamos ao bloco atual. Repetimos isso 4 vezes. O total de 5 estados ilustrados com o'Hello, World! ' 5 4
exemplo (espaços substituídos porX
s para facilitar a leitura):O código:
Definição de função explícita. A função de dois operandos usa uma string como argumento à esquerda e uma lista de dois números inteiros como argumento à direita.
Exemplo de uso:
Experimente online aqui.
fonte
Pyth,
3837Originalmente, eu tinha uma solução diferente, mas era basicamente a solução para o problema da resposta de Maltysen. Então eu decidi ir um pouco diferente.
Experimente online .
fonte
_>z_ttH
é equivalente a<_zttH
.JavaScript (ES6), 110
115Função com 3 parâmetros, retornando uma string
Chrome versão 119 : sem formato curto para funções, sem parâmetros padrão. Não há razão para usar,
for(of)
mesmo que seja suportadoES5 versão 126 : no for (of), no string.repeat
Ungolfed
Teste no console Firefox / FireBug
Saída
fonte
Python 2, 97 bytes
Tomando a abordagem direta.
fonte
Haskell,
164156 bytesA função
p
não imprime a saída, mas a retorna como uma sequência, por exemplop 4 5 "+--+|||+--+|||"
- ->"+--+\n| |\n| |\n| |\n+--+\n"
. Para melhor visualização, useputStr
:Como funciona: crio um bloco
w
xh
de espaços e substituo a primeira linha pelo início da string de entrada. Depois, giro o bloco no sentido anti-horário e repito substituindo a primeira linha mais três vezes.Para impedir o corte do primeiro caractere novamente após o turno # 4, anexe-o à string de entrada antes de iniciar.
Edit: encontrou uma maneira melhor de resolver o problema do cut-off-first-character-after-turn- # 4.
fonte
Postscript, 62 bytes
Obviamente, isso usa tokens binários, mas é equivalente a:
Aqui está um hexdump do arquivo (
xxd round.ps
):Correr como:
A saída é realmente pequena (como resultado de não ter escalado a fonte), portanto, é necessário aumentar o zoom um pouco para vê-la.
Isso tira vantagem do
xyshow
operador para escrever a sequência usando espaçamento de caracteres personalizado. Nesse caso, eu uso o espaçamento vertical negativo para escrever, depois o espaço horizontal negativo para escrever para trás, depois o espaço vertical positivo para escrever para cima. Por causa disso, não preciso usar nenhum tipo de manipulação de string.fonte
> <>,
8280 + 3 = 83 bytesPágina Esolang para> <> (Peixe)
Isso acabou sendo mais curto do que eu esperava. Ele usa a abordagem direta de imprimir a primeira linha, depois as colunas preenchidas com os espaços centrais e depois a última linha.
Insira a string via STDIN e a altura e largura via linha de comando com o
-v
bandeira, da seguinte maneira:Explicação
fonte
Bash + coreutils, 124
Um script de shell para você começar:
Passe a entrada como argumentos da linha de comando:
fonte
JavaScript,
161160158 bytesO método que eu inventei ficou muito tempo, mas tudo bem, tem sido prática. (Além disso, entendi bem
r+o[u]+'\n':d
.)Para entradas que não fazem sentido, a saída é indefinida (literalmente e várias vezes), mas funciona para todos os casos de teste.
fonte
slice
é menor do quesubstr
, não é exatamente o mesmo, mas neste caso, você pode usá-loGroovy, 140
ligar:
saída:
fonte
K,
5554 bytesUsando a mesma abordagem da implementação J do randomra; Comece com um bloco de espaços e adicione da cauda da corda até a borda enquanto gira quatro vezes:
E alguns exemplos:
Quebrando um pouco para facilitar a leitura,
Gere um bloco NxM:
Gire 90 graus usando transpose (
+
) e inverta cada (|:'
):Então, se temos um bloco de espaços
t
e uma cordas
, podemos preceder uma fatia da cauda des
at
:Usamos o formulário
4 {[x] ... }/( ... )
para aplicar repetidamente uma função a uma tupla que consiste na string e na matriz que estamos construindo. Cada vez que executamos essa etapa de rotação e concatenação, também cortamos a corda.editar:
Outra idéia é tentar dividir a string de entrada nos fragmentos que queremos a cada rotação, o que simplifica o corpo principal do programa. Infelizmente, isso funciona um pouco mais a 56 bytes:
Se houver uma maneira melhor de calcular esses pontos de divisão, estou aberto a sugestões.
edit2:
Reorganizar um pouco permite remover um par de parênteses. 54 bytes!
fonte
K,
80bytes 68Reduzido de 80, graças a @JohnE.
Original:
Eu nem sei como isso funciona.
Exemplo de uso:
Existem algumas otimizações possíveis, mas continuo fazendo o Kona segfault ...
fonte
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 caracteres pela minha contagem.R, 178
Esta é uma função sem nome, tendo
s, w, h
como parâmetros. Eu gostaria que houvesse uma maneira melhor de dividir a corda.Ungolfed
Execução de teste
fonte
T-SQL, 307
Embora ainda horrendamente longo, isso acabou sendo um pouco mais fácil (e mais curto) do que eu pensava em uma consulta. Implementado como uma função com valor de tabela embutida para T-SQL.
Isso ocorre através da sequência @h vezes. A primeira recursão recorta os caracteres @W da string. As recursões do meio retiram a última e a primeira da string restante, com preenchimento de string entre elas. A última recursão reverte o que resta. Existem alguns caracteres perdidos que lidam com a maneira como o SQL Server trata os espaços finais no VARCHARS.
Execução de teste
fonte
Pitão, 33 bytes
Demonstração.
fonte
MATLAB, 101
fonte
C ++, 398 bytes
Compilador usado - GCC 4.9.2 com
-std=c++14
sinalizadorTeste aqui.
Explicação
fonte
char[][]
?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
é um pouco menor quechar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195bytesTenho certeza que isso pode ser bastante melhorado. Eu sou um noob. >, <
fonte
Java 11, 180 bytes
Experimente on-line (NOTA:
String.repeat(int)
é emulado comorepeat(String,int)
para a mesma contagem de bytes, porque o Java 11 ainda não está no TIO.)Explicação:
fonte
Carvão , 4 bytes
Experimente online (detalhado) ou online (puro) .
Explicação:
Basicamente, um construído para este desafio. Pegue as duas primeiras entradas inteiras como largura e altura e imprima uma caixa com a terceira string de entrada como borda:
fonte