Maior, melhor zíper (quebrado)

9

(Inspirado fortemente por este desafio )

No desafio original, você deveria fazer um zíper horizontal; no entanto, olhando para o meu casaco, meu zíper é muito mais vertical (e um pouco quebrado): P

Entrada

Você receberá uma única string ( s) e um par de números inteiros ( ae b) em qualquer formato. Onde:

a < (length-of-s / 2)

b <= ((length-of-s / 2) - (a + 1)) / 6

Saída e Pontuação

Seu programa pode ser um programa completo ou uma função que produz uma única seqüência de caracteres com a formatação correta ou uma matriz (um item por linha) que você escolher. Os espaços à esquerda e à direita e as novas linhas são opcionais, desde que os caracteres da saída estejam alinhados. por exemplo.

["f     r"],["u     e"],["l     p"],["l     p"],["y     i"],[" o   z "],["  p n  "],["   e   "]

ou

"f     r\nu     e\nl     p\nl     p\ny     i\n o   z \n  p n  \n   e   "

são saídas aceitáveis ​​para o caso de teste 1

As brechas padrão são proibidas e o código mais curto em bytes vence. Qualquer resposta sem explicação não será capaz de vencer.

Explicação

Para criar um zíper, você deve primeiro remover os caracteres de espaço em branco ou nova linha da sequência. E, em seguida, dobre-o ao meio dessa maneira (consulte o caso de teste 1 para obter mais informações)

abcde fgh ij klmnopqr se torna as duas cordas abaixo, observe que a segunda metade está invertida.

abcdefghi e rqponmlkj

Em seguida, começando no início de cada string, colocamos o mesmo caractere indexado de cada substring em uma linha com o espaçamento determinado da seguinte forma:

[0] a     r -- (a-3) five spaces
[1]  b   q  -- (a-2) three spaces
[2]   c p   -- (a-1) one space
[3]    d    -- (a)
[4]    o
[5]    e
[6]    n
etc...

Isso faz a base para o nosso zíper. Agora os números inteiros ae b.

aé a localização do nosso zip. Para determinar onde o zíper está localizado, usamos o índice de nossas linhas de saída como o ponto para fechar nosso zip. por exemplo, o quadrado entre colchetes [3]no exemplo acima é onde está o zíper.

Antes que nosso zíper chegue ao fim, o zíper acima deve permanecer em um espaço de cinco espaços até chegar a a-2onde se fecha para 3 espaços e a-1onde se fecha a 1 espaço. Só para esclarecer, no exemplo acima a = 3(indexado 0)


bé o número de buracos no meu zíper. Para criar um buraco no zíper, dividimos a corda novamente com algum espaçamento.

Começando com o índice do furo de exemplo, à medida hque aumentamos o espaçamento de h-1para um espaço, hpara 3 espaços e de h+1volta para um espaço, deixando h-2e h+2com apenas um caractere por linha, à medida que são contados como parte do furo.

Após o zip e entre cada um dos orifícios, deve haver um espaço de um caractere para que nosso zip pareça totalmente conectado entre os orifícios.

Você escolhe os índices dos furos, mas todos devem estar presentes na seção 'fechada' do zíper.

Again using 'abcdefghi' and 'rqponmlkj'

[0] a     r -- (open)
[1]  b   q  -- (closing)
[2]   c p   -- (closing)
[3]    d    -- zip 
[4]    o    -- gap
[5]    e    -- start of hole  (h-2)
[6]   n f   -- one space      (h-1)
[7]  m   g  -- three spaces   (hole h)
[8]   l h   -- one space      (h+1)
[9]    k    -- end of hole    (h+2)
[10]   i    -- gap
[11]   j

Espero que tudo faça sentido, se não perguntar. Na antecipação de perguntas, você pode perceber que o caractere pno meu segundo exemplo está presente na segunda substring, no entanto, aparece no início de sua linha, isto é pretendido, você deve seguir a sequência de 1-2-1-2- 1-2, pegando um caractere de cada meia vez, independentemente de sua posição na saída.

Casos de teste

"fully open zipper", 7, 0                     | "fully closed zipper", 0, 0
fullyope reppizn                              | fullyclos reppizde
                                              |
f     r   *Note: i particularly like this     | f
u     e     example as it shows the reversing | r
l     p     of the second half of the string  | u
l     p     causes the words to wrap from top | e
y     i     left to the  bottom and back up   | l
 o   z      the right side                    | p
  p n                                         | l
   e                                          | p
                                              | y
                                              | i
                                              | c
                                              | z
                                              | l
                                              | d
                                              | o
                                              | e
                                              | s
  • Coluna 1: "zíper estupidamente longo e inquebrável que não deveria existir em nenhum moletom decente", 24, 0
  • Coluna 2: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris faucibus molestie mi. Aliquam nec fringilla ipsum", 15, 5

:

s     e          |          L     m
t     i          |          o     u
u     d          |          r     s
p     o          |          e     p
i     o          |          m     i
d     h          |          i     a
l     t          |          p     l
y     n          |          s     l
l     e          |          u     i
o     c          |          m     g
n     e          |          d     n
g     d          |          o     i
u     y          |          l     r
n     n          |           o   f
b     a          |            r c
r     n          |             s
o     o          |             e
k     t          |             i
e     s          |            n t
n     i          |           m   a
z     x          |            a m
i     e          |             u
 p   t           |             e
  p n            |             q
   e             |             t
   d             |             i
   r             |             ,
   l             |            l c
   t             |           A   o
   u             |            . n
   h             |             i
   o             |             s
   a             |             m
   h             |            e e
   t             |           c   i
   s             |            t t
                 |             e
                 |             s
                 |             t
                 |             s
                 |             u
                 |             l
                 |             r
                 |             o
                 |             a
                 |             m
                 |             d
                 |             s
                 |             i
                 |             u
                 |             p
                 |            b i
                 |           i   s
                 |            c c
                 |             u
                 |             i
                 |             a
                 |             n
                 |             f
                 |             g
                 |             s
                 |             e
                 |             i
                 |            l r
                 |           i   u
                 |            t a
                 |             .
                 |             M

EDIT: casos de teste adicionados

"abcde fgh ij klmnopqr","3","1"

a     r
 b   q
  c p
   d
   o
   e
  n f
 m   g
  l h
   k
   i
   j
MysticVagabond
fonte
11
Acho que gosto desse desafio, mas já o li três vezes e ainda não estou 100% exatamente sobre o que devo fazer. Eu acho que valeria a pena tornar as regras e especificações mais curtas e claras, em vez de parágrafos completos.
TheLethalCoder
Eu posso dar-lhe um ir: P
MysticVagabond
mais claro? @TheLethalCoder
MysticVagabond
Olá, removi a tag printable-ascii , pois ela é usada para desafios de origem restrita, e não para o layout de saída.
AdmBorkBork
Vi que, graças ao @AdmBorkBork, editei novamente para colocar em ordem alfabética a explicação e, com sorte, deixar mais claro a origem dos personagens.
MysticVagabond

Respostas:

1

PHP 7.1, 421 412 218 195 192 191 195 bytes

for([,$s,$a,$b]=$argv;$i-$k<strlen($s=strtr($s,[" "=>""]));$p=0)for($t=++$y>$a-2?$y>=$a?$y>$a?$b-->0?_4_4_4_31_23_31:_4:_31:_23:_15;$c=$t[$p++];)echo$c<_?str_pad("",$c).$s[++$f&1?$i++:$k-=1]:"
";

Corra com -nrou experimente online .
Imprime uma nova linha à esquerda, mas não à direita, e um espaço à esquerda em cada linha.

Titus
fonte
TIO me dá esse erro:<br /> <b>Parse error</b>: syntax error, unexpected ',', expecting ']' in <b>[...][...]</b> on line <b>7</b><br />
MysticVagabond
@Xynos Defina a versão do PHP como 7.1
Titus
sua resposta coloca o buraco muito perto do fecho de correr, mal adicionar a saída correta para sua entrada como um caso de teste :)
MysticVagabond
@Xynos lacunas adicionadas
Titus