Título do filme Styled String


19

Desafio

Já viu aqueles títulos de trailers de filmes (Marciano, Interestelar etc.) em que eles têm grandes lacunas entre as letras se espalhando lentamente?

O desafio é recriar esse efeito, com base em uma seqüência, multiplicador de gap e direção, inserindo a quantidade apropriada de espaços entre as letras.

Exemplo

Entrada : 'INTERSTELLAR', multiplicador de gap: 1.0, Direção: Aumentando para dentro

Output: I N  T   E    R     S      T     E    L   L  A R

O espaçamento é: [1, 2, 3, ..., 3, 2, 1]; substituindo os espaços por '.' para demonstrar melhor o espaçamento:

I.N..T...E....R.....S......T.....E....L...L..A.R

Entrada : 'INTERSTELLAR', multiplicador de gap: 0,5, Direção: Aumentando para dentro

Output: IN T E  R  S   T  E  L L AR

O espaçamento é multiplicado por 0,5; portanto, obtemos [0, 1, 1, 2, ... 2, 1, 1, 0] da divisão inteira; usando '.':

IN.T.E..R..S...T..E..L.L.AR

Entrada : 'CODEGOLF', multiplicador de gap: 2,0, Direção: Aumentando para fora

Output: C        O      D    E  G    O      L        F

O espaçamento é multiplicado por 2, aumentando para fora, portanto obtemos [8,6,4,2,4,6,8]; substituindo por '.':

C........O......D....E..G....O......L........F

Entrada : 'CODEGOLF', multiplicador de gap: 0,4, Direção: Aumentando para fora

Output: C O DEGO L F

O espaçamento é multiplicado por 0,4, aumentando para fora, portanto obtemos [1,1,0,0,0,1,1]; substituindo por '.':

C.O.DEGO.L.F

Regras

  • São necessárias 3 entradas: string, multiplicador de gap e direção
  • Se o comprimento da string de entrada for ímpar (mesmo no número de intervalos), por exemplo, 'OLÁ!', O espaçamento das 2 lacunas mais internas deve ser o mesmo H E L L O
  • O multiplicador de direção e intervalo pode ser analisado da maneira que desejar, por exemplo, você pode usar -2 como 'aumentando para dentro com um multiplicador de 2', 1 como 'aumentando para fora com um multiplicador de 1', etc.
  • Só é necessário usar espaços, no entanto, é um bônus se o preenchimento de caracteres for personalizável.

Animação de referência

gif de referência

Divirta-se jogando golfe!


11
Olá, e bem-vindo ao PPCG! Você pode simplificar um pouco alterando Increasingpara 1 => Inward, 0 => Outwardou vice-versa.
NoOneIsHere

11
@NoOneIsHere Thanks! A análise de direção e proporção é flexível, conforme a regra 3, você pode usar 0,1 para especificar a direção ou até mesmo combinar os dois parâmetros em um, como +4 para 4 internos, -0,5 para 0,5 externos etc., ele só precisa ser definido com a solução.
Zukaberg

3
Este é um desafio muito interessante! Bem vindo ao site. :)
DJMcMayhem

Não vejo por que uma proporção de gap de 2 é interpretada como crescendo para fora, enquanto 1 e 0,5 crescem para dentro.
Xnor

@xnor oh não desculpe pela confusão, a direção não tem nada a ver com a razão, o sentido ea razão são parâmetros separados, um 2,0 interior seria algo como:C..O....D......E........G......O....L..F
Zukaberg

Respostas:


3

JavaScript (ES6), 86 82 81 80 bytes

A entrada é esperada na currying sintaxe f(s)(r), com:

  • s = string
  • r = razão + direção: uma bóia negativa para dentro ou uma bóia positiva para fora

let f =

s=>r=>s.replace(/./g,(c,i)=>c+' '.repeat(n+=i<l?-r:r),l=s.length/2,n=r>0&&l*r+r)

console.log(f("INTERSTELLAR")(-1));
console.log(f("INTERSTELLAR")(-0.5));
console.log(f("CODEGOLF")(2));
console.log(f("CODEGOLF")(0.4));



1

APL, 40 bytes

{⍵\⍨0~⍨∊1,⍨1,¨-⌊⍺×(1+⌈/-+)⍣⍺⍺(⌽⌊+)⍳⍴1↓⍵}

Isso leva a string como argumento à direita, a razão como argumento à esquerda e a direção como operando à esquerda (0 para o interior e 1 para o exterior).

      1 (0 {⍵\⍨0~⍨∊1,⍨1,¨-⌊⍺×(1+⌈/-+)⍣⍺⍺(⌽⌊+)⍳⍴1↓⍵}) 'INTERSTELLAR'
I N  T   E    R     S      T     E    L   L  A R
      0.5 (0 {⍵\⍨0~⍨∊1,⍨1,¨-⌊⍺×(1+⌈/-+)⍣⍺⍺(⌽⌊+)⍳⍴1↓⍵}) 'INTERSTELLAR'
IN T E  R  S   T  E  L L AR
      2 (1 {⍵\⍨0~⍨∊1,⍨1,¨-⌊⍺×(1+⌈/-+)⍣⍺⍺(⌽⌊+)⍳⍴1↓⍵}) 'CODEGOLF'
C        O      D    E  G    O      L        F
      0.4 (1 {⍵\⍨0~⍨∊1,⍨1,¨-⌊⍺×(1+⌈/-+)⍣⍺⍺(⌽⌊+)⍳⍴1↓⍵}) 'CODEGOLF'
C O DEGO L F

Explicação:

  • ⍳⍴1↓⍵: obtenha uma lista de números de 1 a N-1, onde N é o comprimento da sequência
  • (⌽⌊+): inverta a lista e, em cada posição, obtenha o menor número de ambas as listas (isso fornece os tamanhos das lacunas se aumentar para dentro)
  • (1+⌈/-+)⍣⍺⍺: subtraia cada número da lista do número mais alto da lista e adicione 1. Faça isso algumas ⍺⍺vezes. (Se ⍺⍺=0nada acontecer, e se ⍺⍺=1, isso fornecerá o tamanho das lacunas se aumentar para fora.)
  • -⌊⍺×: multiplique cada espaço , arredonde-o para baixo e negue-o.
  • ∊1,⍨1,¨: adicione 1 na frente de cada intervalo e 1 no final da lista.
  • 0~⍨: remova quaisquer zeros.
  • ⍵\⍨: use a lista resultante para expandir . Expand ( \) funciona da seguinte maneira: para cada número positivo, o caractere atual é replicado várias vezes e para cada número negativo, são inseridos muitos espaços, com a ressalva de que 0e ¯1faça a mesma coisa, razão pela qual todas as zeros tiveram que ser removidos antes.

1

MATL , 31 bytes

nq:tPvX<i?tX>Qw-]*kQ1whYs''1Gb(

As entradas são: string; 0ou1 para aumento interno ou externo; multiplicador.

Experimente online!

Explicação

Considere entradas 'INTERSTELLAR', 1, 0.5como um exemplo.

nq:    % Input string implicitly. Push [1 2 ... N-1] where N is the string length
       %   STACK: [1 2 3 4 5 6 7 8 9 10 11]
tP     % Duplicate, reverse
       %   STACK: [1 2 3 4 5 6 7 8 9 10 11], [11 10 9 8 7 6 5 4 3 2 1]
vX<    % Vertically concatenate. Minimum of each column
       %   STACK: [1 2 3 4 5 6 5 4 3 2 1]
i      % Input direction flag
       %   STACK: [1 2 3 4 5 6 5 4 3 2 1], 1
?      % If input flag was 1 (meaning outward increasing)
  tX>  %   Duplicate. Maximum
       %     STACK: [1 2 3 4 5 6 5 4 3 2 1], 6
  Q    %   Add 1
       %     STACK: [1 2 3 4 5 6 5 4 3 2 1], 7
  w-   %   Swap. Subtract
       %     STACK: [6 5 4 3 2 1 2 3 4 5 6]
]      % End
*k     % Input multiplier implicitly. Multiply. Round down
       %   STACK: [3 2 2 1 1 0 1 1 2 2 3]
Q      % Add 1
       %   STACK: [4 3 3 2 2 1 2 2 3 3 4]
1wh    % Prepend a 1
       %   STACK: [1 4 3 3 2 2 1 2 2 3 3 4]
Ys     % Cumulative sum
       %   STACK: [1  5  8 11 13 15 16 18 20 23 26 30]
''     % Push empty string
       %   STACK: [1  5  8 11 13 15 16 18 20 23 26 30], ''
1G     % Push input string again
       %   STACK: [1  5  8 11 13 15 16 18 20 23 26 30], '', 'INTERSTELLAR'
b      % Bubble up
       %   STACK: '', 'INTERSTELLAR', [1  5  8 11 13 15 16 18 20 23 26 30]
(      % Assign the characters from the top string into the empty string at the 
       % given positions. Intermediate positions are filled with character 0, 
       % which is displayed as a space
       %   STACK: 'I   N  T  E R ST E L  L  A   R'
       % Dispaly implicitly

1

Raquete 348 bytes

(define(f s)(let*((c #\space)(sp(λ(l)(define ol'())(for((i(length l)))(for((j i))
(set! ol(cons c ol)))(set! ol(cons(list-ref l i)ol)))(for((n(floor(/(length l)2))))
(set! ol(cons c ol)))ol))(m(floor(/(string-length s)2)))(s1(sp(string->list(substring s 0 m)
)))(s2(sp(reverse(string->list(substring s m))))))(list->string(append(reverse s1)s2))))

Ungolfed:

(define(f s)
  (let* ((c #\space)
         (sp (λ (l)           ; subfn to add increasing spaces to list of characters
               (define ol '())
               (for ((i (length l)))
                 (for ((j i))
                   (set! ol (cons c ol)))
                 (set! ol (cons (list-ref l i)ol)))
               (for ((n (floor(/ (length l)2)))) 
                 (set! ol (cons c ol)))
               ol))
         (m (floor (/ (string-length s) 2)))                 ; find midpoint
         (s1 (sp (string->list (substring s 0 m))))          ; add spaces to first part
         (s2 (sp (reverse (string->list (substring s m)))))) ; add spaces to second part
    (list->string (append (reverse s1) s2))                  ; re-combine 2 parts
    ))

Teste:

(f "INTERSTELLAR")

Resultado:

"I N  T   E    R     S      T     E    L   L  A R"

1

PHP, 129 bytes

12 bytes salvos por @Titus Thank You

string = $ argv [1], razão = $ argv [2], direção = $ argv [3] para dentro = 0, para fora = 1

for($i=0;$i+1<2*$l=strlen($t=($x=$argv)[1]);)echo$i%2?str_pad("",$x[2]*abs($x[3]*(0^$l/2+1)-($i++>=$l?$l-$i/2:$i/2))):$t[$i++/2];

str_paddeve salvar 4 bytes. Tente ++$i>$l?$l-$i/2:$i/2e em $t[$i++]/2vez de incrementar na pós-condição do loop; isso deve economizar 9. Por quê 0^?
Titus

@Titus 0^3.12resultado em 3que é necessário
Jörg Hülsermann

$i=0é desnecessário. ++$i>ainda economiza um byte $i++>=. E você pode salvar mais um byte movendo esse incremento para a pré-condição: em ++$i<2*$l=...vez de $i+1<2*$l=..., troque ramos verdadeiros e falsos do ternário externo, em $ivez de ++$ie em $t[$i/2-.5]vez de $t[$i++/2].
Titus

Definir como interno 1e externo como 2deve permitir que você salve outros 3 bytes: em ($l>>1)vez de (0^$l/2+1); mas eu não testei nenhum deles.
Titus

@Titus isso irá resultar em espaços maiores
Jörg Hülsermann
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.