Alice é estagiária em uma empresa que usa o Brainfuck como idioma principal para o desenvolvimento do lado do cliente e do servidor. Alice acabou de escrever seu primeiro código e está um pouco nervosa ao se preparar para sua primeira revisão de código.
Alice deseja que seu código seja formatado adequadamente e tenha uma boa aparência, mas ela não tem tempo para ler o guia de estilo da empresa com 328 páginas, então decidiu formatá-lo como um quadrado perfeito . Infelizmente, o tamanho do código pode ser insuficiente para formar um quadrado, então ela decidiu deixar um espaço retangular no meio. As folgas devem estar perfeitamente centralizadas e o mais próximo possível do quadrado .
Exemplos
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Escreva um programa ou uma função para ajudar Alice. Dado o código de Alice como uma sequência de entrada, imprima o código formatado corretamente, conforme descrito abaixo, se possível. Se a formatação for impossível, emita chorando emoji:~(
.
Isso é código-golfe então as respostas são pontuadas em bytes, com menos bytes sendo o objetivo.
Restrições
- Seu programa ou função deve usar uma única seqüência de caracteres como entrada e gerar uma ou mais linhas de texto (ou retornar uma sequência de linhas múltiplas ou um conjunto de seqüências de caracteres, se você implementar uma função).
- A sequência de entrada pode conter caracteres ASCII, incluindo espaços em branco.
- Todos os espaços em branco na entrada devem ser ignorados. Eles não devem contar para o comprimento do código e não devem ser usados na saída.
- A sequência de entrada contém pelo menos um caractere que não é um espaço em branco.
- O código formatado deve ter os mesmos caracteres que não sejam espaços em branco na mesma ordem que no código de entrada.
- O código formatado deve ser um quadrado perfeito, ou seja, todas as linhas devem ter o mesmo comprimento e o número de linhas deve ser igual ao comprimento das linhas.
- O código formatado pode conter uma lacuna no meio.
- Somente caracteres de espaço (código ASCII 32) podem ser usados na lacuna.
- A folga (se presente) deve ser retangular.
- Toda linha de código formatado deve conter pelo menos um caractere que não seja um espaço em branco, ou seja, a largura do espaço deve ser estritamente menor que o quadrado (o espaço 5x1 é inaceitável para o quadrado 5x5).
- O espaço deve ser horizontal, ou seja, a largura do espaço deve ser maior ou igual à altura do espaço.
- O espaço deve estar perfeitamente centrado.
- Conseqüentemente, a paridade de largura e altura da lacuna deve ser igual à paridade de largura quadrada (por exemplo, para a diferença quadrada de 5x5 pode ser 1x1, 3x1 ou 3x3).
- Se possível, produza um quadrado sem folga.
- No caso de várias soluções, escolha uma com a folga mais próxima do quadrado, ou seja, a diferença entre a largura e a altura da folga é mínima (por exemplo: a folga 10x10 é mais preferível que 8x6 e 8x6 é mais preferível que 6x2).
- Se ainda houver um empate, escolha a solução com uma área de espaço mínima (por exemplo, o espaço 2x2 é mais preferível que 4x4).
- Se for impossível formatar o código, faça a saída
:~(
. - Nova linha após a última linha é opcional.
- [Novo] Você pode assumir com segurança que qualquer caractere com código abaixo de 33 é um espaço em branco. Espero que ajude você a jogar golfe.
Testes
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Testes complicados
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Recursos
Para economizar espaço, você pode encontrar código de amostra e casos de teste extras no tio.run
[Novo] Você pode dar uma olhada na tabela de soluções aceitas para entradas com até 100 caracteres . Troquei a largura e a altura porque parece mais intuição.
Inspirado por: Um quadrado de texto
Alterar
Adicionados 2 testes, bug corrigido no código de amostra.
Tabela de soluções adicionada até 100, clarificação de espaço em branco adicionada.
Respostas:
C (gcc) , 354 bytes
Experimente online!
fonte
isspace(x)
porx<33
.JavaScript (ES6),
284 ... 274270 bytesGuardado 4 bytes graças a @Shaggy
Retorna uma matriz de seqüências de caracteres.
Experimente online!
fonte
This must be 5x5 with 1x1 gap.
(24 caracteres)[\s\n]
ser apenas\s
?++w>x-2
w++>=x-2
w++>=x
\s
Stax , 80 bytes
Execute e depure
Como funciona?
Descompactado, não jogado e comentou que é assim.
Execute este
fonte
Carvão vegetal , 120 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Retire os espaços da entrada, inverta-os e divida-os em caracteres, para que possamos repetir os caracteres mais facilmente mais tarde.
Comece com um tamanho de zero, indicando que nenhum resultado foi encontrado (ainda).
Verifique todos os comprimentos laterais até o comprimento da corda. (Jogar uma divisão certamente tornaria o código mais rápido.)
Se o resultado for um quadrado perfeito, salve o tamanho do quadrado e defina-o como o tamanho da borda.
Faça um loop sobre as possíveis alturas e larguras da borda (a largura da borda não é maior que a altura da borda, tornando a altura da abertura não maior que a largura da abertura).
Se o tamanho da borda é o comprimento desejado e ainda não temos uma solução ou não é tão quadrado quanto essa solução, atualize a solução com esses tamanhos de quadrado e borda.
Se temos uma solução ...
Desenhe um retângulo de um caractere arbitrário do tamanho quadrado especificado.
Se a borda for pequena o suficiente para deixar um espaço, apague-o. (O comando de desenho será desenhado para cima e para a esquerda para valores negativos e não gosta de valores zero.)
Substitua todos os caracteres (restantes) pelos caracteres da entrada.
Caso contrário, saída
:~(
.fonte
Geléia ,
9185 bytesExperimente online!
Um link monádico que pega a sequência de entrada como argumento e retorna uma sequência com a saída formatada ou
:~(
.fonte
Python 2,
287281279 bytesExperimente online!
Usa a comparação de lista lexicográfica do Python usando os mesmos valores para escolher uma solução e imprimi-la. Tenho certeza de que
1042 ou mais bytes ainda podem ser removidos.Explicação
Remova os espaços em branco dividindo com espaços em branco e juntando-se a eles
""
, e depois converta a entrada em uma lista para mais tarde. Inicialize também ol
comprimento do código real ep
a lista de possibilidades válidas.Percorra todas as possibilidades de tamanhos de espaço de
0*0
atél*l
. Calcule o comprimento da borda do quadrado coml
caracteres ex*y
espaços de código comos
.Verifique se as seguintes condições correspondem:
s % 1 == 0
, ou seja, um quadrado perfeito seria formadox < s-1 > y
, Ou seja,x
ey
são, no máximo,s-2
e se encaixam dentro do quadrados % 2 == x % 2 == y % 2
, ou seja, ambosx
ey
coincidem com a paridade da borda e podem ser centralizadosx < 1
, iex == 0
, ignorar todos, exceto o requisito quadrado perfeitoSe as condições corresponderem, adicione os seguintes itens em uma tupla
p
para encontrar o melhor:abs(x-y)/2
; primeiro encontre a diferença mínima dex
ey
obtenha a diferença mais quadrada. Isso é sempre assim, então dividimos por 2.int(s)
; Em seguida, encontre o comprimento mínimo do lado. Comos
é um número inteiro e aumenta à medida que a área do intervalox*y
, ele é classificado por área do espaço.-x
; em seguida, encontre a largura máxima para preferir espaços horizontais. Isso ocorre após a área devido à forma como foi desenvolvido, mas a área é a mesmax*y
e,y*x
portanto, funciona.Se encontramos layouts válidos, encontre o ideal, conforme descrito acima. Calcule a borda horizontal
b
e inicialize o número da linhaY
para 0.Se o número da linha
Y
estiver dentro do espaço (a borda vertical éb+d
, com ad
partir da tupla), adicione o valor da largura do espaço em espaços após a borda horizontalc
. (A modificação dec
é por isso que precisamos que seja uma lista.) Em seguida, imprima uma linha do quadrado e remova-a dec
. Repita oss
tempos, incrementando o número da linha.Se nenhum layout for encontrado, falhe.
fonte
"some\ntext"
como delimitadores. (input()
avalia uma linha de entrada como código Python.) Se isso não for aceitável, entre em contato. O comprimento 22 também funciona para mim.Pitão ,
9998 bytesExperimente online!
Isso usa o mesmo algoritmo da minha resposta Python, mas muitos detalhes são alterados significativamente para serem mais curtos no Pyth.
O Pyth mostra sua idade aqui, pois não é atualizado há muito tempo e usa apenas os caracteres ASCII imprimíveis (para código, não para dados), desperdiçando muito espaço.
Curiosamente, se Pyth usasse o mesmo tipo de embalagem base-256 que a Stax, esse programa poderia ser 98 log 256 95⌉ = 81 bytes de comprimento, próximo a Stax (80 bytes) e Jelly (85 bytes). Eu acho que isso mostra muito bem quão próximas as línguas do golfe estão, mesmo com seus paradigmas drasticamente diferentes.
Explicação (apenas um pouco menos ilegível que o código)
#
envolve tudo em umwhile True:
que suprime a mensagem e sai por erro.JscQ)
c
saltos input (Q
) no espaço em branco,s
junta as partes e salva o resultadoJ
.^UJ2
faz a lista de índices (U
) deJ
e toma seu2
poder cartesiano (^
), resultando em todos os pares[h,w]
com0<=h<len(J)
e0<=w<len(J)
.+L@+lJ*Fd
: para todos (L
) esses paresd
, adiciona (+
) a raiz quadrada (@
…2
) de (al
espessura deJ
mais (+
) o produto (*F
) do pard
) ao lado esquerdo do par, criando um trigêmeo[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
filtro para trigêmeosT
onde!|
):hT
) módulo 1 (%
…1
) é diferente de zero&
):eT
) é diferente de zero|
):R
módulo tripleto ( ) 2 (%
…2
), com duplicatas ({
) e a primeira única (t
) removida, não é vaziaeS
) da altura e largura da folga (tT
) ég
igual ou igual ao comprimento lateral (hT
)S
classifica os trigêmeos lexicograficamente (pelo comprimento lateral e depois pela altura do espaço).oaFtN
depoiso
ordena os trigêmeos peloa
diferença bsolute entre a altura da abertura e a largura da abertura (tN
).Neste ponto, se não tivermos soluções válidas,
|
avalia seu segundo argumento\n":~("
,, que imprime e retorna:~(
.h
pega a solução ideal (ou":"
se não houver) e é salva emK
. Em seguida,h
obtém seu comprimento lateral (ou":"
se não houver),s
lança-o para inteiro (ou falha e fecha se não houver) e é salvo (=
) emQ
.Cada um de (
m
)[gap height, gap width]
(tK
) é então subtraído (-
) do comprimento do lado (Q
) e o resultado dividido por 2 (/
…2
). Os resultados sãoA
assinadosG
eH
.Finalmente, entramos em um
W
loop hile.Z
começa em 0 e a cada iteração o incrementamos, mas usamos o valor antigo (~hZ
penseZ++
em C).W
) o valor antigo estiver em ({
) ar
inclinaçãoG
para (comprimento lateral -G
) (-QG
), atribua (=
) aoJ
seguinte:c
puleJ
na posição (]
)H
ej
passe nas metades com a largura da folgaeK
vezes (*
) um espaço (d
). Se o valor não estava no intervalo, basta retornarJ
. Se esse resultado estiver vazio, pare o loop.>
) os primeirosQ
caracteresJ
e atribua (~
) o resultado aJ
. A partir do valor antigo deJ
, pegue (<
) os primeirosQ
caracteres e imprima-os.Finalmente, o
#
ciclo começa novamente, erros e sai porquecQ)
comQ
contendo um número é inválido.fonte
05AB1E ,
9589 bytesAlguns bytes aqui e ali definitivamente podem ser jogados no golfe.
As três primeiras etapas do programa são inspiradas na resposta Stax da @recursive , portanto, faça um !
Experimente online ou verifique todos os casos de teste .
Explicação:
Etapa 1: Remova todos os espaços em branco:
Etapa 2: criar todos os trigêmeos possíveis[ a , b , c ] , Onde uma é a dimensão da resultante a × a quadrado e b × c é o tamanho da lacuna. Fazemos isso criando todos os trigêmeos possíveis usando números inteiros no intervalo[ 0 , a ] . E então filtramos essas opções onde tudo a seguir é verdadeiro para o trigêmeo:
Por exemplo:L = 28 resultará nos trigêmeos
[[6,2,4],[6,4,2],[8,6,6]]
.Etapa 3: verifique se ainda temos trigêmeos restantes. Caso contrário, saída( a b s ( b - c ) , b × c ) .
":~("
; se o fizermos, determine qual usar classificando e deixando apenas o primeiro. Fazemos isso classificando as tuplasPor exemplo: os trigêmeos
[[6,2,4],[6,4,2],[8,6,6]]
serão classificados em[[8,6,6],[6,2,4],[6,4,2]]
, após o qual[8,6,6]
restará apenas .Etapa 4: crie uma lista de como devemos dividir a string para inserir os espaços. Isso é feito assim:
Dado[ a , b , c ] , crie uma lista com:
Por exemplo: trigêmeo
[7,3,5]
resultará na lista[15,2,2,35]
.Etapa 5: e finalmente dividimos a string com base nesta lista, junte-a novamente comc quantidade de espaços, divida-o em partes de tamanho c e junte-se a eles por novas linhas. Por exemplo:
Cordasc = 5 quantidade de espaços para a = 7 a isto:
"Alongtesttoseeifitworksasintended."
dividido de acordo com a lista[15,2,2,35]
resultará em:["Alongtesttoseei","fi","tw","orksasintended."]
. A isso se juntam os"Alongtesttoseei fi tw orksasintended."
. E depois divida em partes de tamanho["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
. Que é então juntado por novas linhas à saída.fonte