Título de película Styled String


19

Desafío

¿Alguna vez has visto esos títulos de avances de películas (es decir, marcianos, interestelares, etc.) en los que tienen grandes brechas entre las letras que se extienden lentamente?

El desafío es recrear este efecto dada una cadena, multiplicador de espacio y dirección, insertando la cantidad adecuada de espacios entre las letras.

Ejemplo

Entrada : 'INTERSTELLAR', Multiplicador de brecha: 1.0, Dirección: Aumentando hacia adentro

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

El espacio es: [1, 2, 3, ..., 3, 2, 1]; reemplazando los espacios con '.' para demostrar mejor el espacio:

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

Entrada : 'INTERSTELLAR', Multiplicador de brecha: 0.5, Dirección: Aumentando hacia adentro

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

El espaciado se multiplica por 0.5, por lo tanto, obtenemos [0, 1, 1, 2, ... 2, 1, 1, 0] de la división de enteros; utilizando '.':

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

Entrada : 'CODEGOLF', Multiplicador de brecha: 2.0, Dirección: Incremento hacia afuera

Output: C        O      D    E  G    O      L        F

El espaciado se multiplica por 2, aumentando hacia afuera, por lo tanto, obtenemos [8,6,4,2,4,6,8]; reemplazando con '.':

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

Entrada : 'CODEGOLF', Multiplicador de brecha: 0.4, Dirección: Incremento hacia afuera

Output: C O DEGO L F

El espaciado se multiplica por 0.4, aumentando hacia afuera, por lo tanto obtenemos [1,1,0,0,0,1,1]; reemplazando con '.':

C.O.DEGO.L.F

Reglas

  • Toma 3 entradas: cadena, multiplicador de huecos y dirección
  • Si la cadena de entrada tiene una longitud impar (incluso en # de espacios), por ejemplo, 'HOLA', el espacio entre los 2 espacios más internos debe ser el mismo H E L L O
  • La dirección y el multiplicador de espacio se pueden analizar como desee, por ejemplo, podría usar -2 como 'aumentar hacia adentro con un multiplicador de 2', 1 como 'aumentar hacia afuera con un multiplicador de 1', etc.
  • Solo es necesario usar espacios, sin embargo, es una ventaja si el relleno del personaje es personalizable.

Animación de referencia

gif de referencia

Diviértete jugando al golf!


1
Hola y bienvenidos a PPCG! Es posible que desee hacer esto un poco más simple, cambiando Increasinga 1 => Inward, 0 => Outwardo viceversa.
NoOneIsHere

1
@NoOneIsHere ¡Gracias! El análisis de dirección y relación es flexible, según la regla 3, puede usar 0,1 para especificar la dirección o incluso combinar ambos parámetros en uno, como +4 para 4 hacia adentro, -0.5 para 0.5 hacia afuera, etc., solo necesita ser definido Con la solución.
Zukaberg

3
¡Este es un desafío muy interesante! Bienvenido al sitio. :)
DJMcMayhem

No veo por qué una relación de brecha de 2 se interpreta como un crecimiento hacia afuera, mientras que 1 y 0.5 crecen hacia adentro.
xnor

@xnor oh no, perdón por la confusión, la dirección no tiene nada que ver con la relación, la dirección y la relación son parámetros separados, un 2.0 hacia adentro se vería así:C..O....D......E........G......O....L..F
Zukaberg

Respuestas:


3

JavaScript (ES6), 86 82 81 80 bytes

Se espera una entrada en la sintaxis de curry f(s)(r), con:

  • s = cadena
  • r = relación + dirección: un flotador negativo hacia adentro o un flotador positivo hacia afuera

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↓⍵}

Esto toma la cadena como su argumento derecho, la relación como su argumento izquierdo y la dirección como su operando izquierdo (0 para adentro y 1 para afuera).

      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

Explicación:

  • ⍳⍴1↓⍵: obtenga una lista de números del 1 al N-1, donde N es la longitud de la cadena
  • (⌽⌊+): invierte la lista, y en cada posición, obtén el número más bajo de ambas listas (esto da los tamaños de los huecos si aumenta hacia adentro)
  • (1+⌈/-+)⍣⍺⍺: resta cada número de la lista del número más alto de la lista y suma 1. Haz esto ⍺⍺veces. (Si ⍺⍺=0no pasa nada, y si⍺⍺=1 , esto dará el tamaño de los espacios si aumenta hacia afuera).
  • -⌊⍺×: multiplica cada espacio por , redondea hacia abajo y niega.
  • ∊1,⍨1,¨: agregue un 1 delante de cada espacio y un 1 al final de la lista.
  • 0~⍨: elimina los ceros.
  • ⍵\⍨: use la lista resultante para expandir . Ampliar ( \) funciona de la siguiente manera: para cada número positivo, el carácter actual se replica que muchas veces, y para cada número negativo, que muchos espacios se insertan, con la advertencia de que 0, y ¯1hacer lo mismo, por lo que todo el los ceros tuvieron que ser eliminados antes.

1

MATL , 31 bytes

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

Las entradas son: cadena; 0o1 para aumentar hacia adentro o hacia afuera; multiplicador.

Pruébalo en línea!

Explicación

Considere insumos 'INTERSTELLAR', 1, 0.5como un ejemplo.

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

Raqueta 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))))

Sin golf:

(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
    ))

Pruebas:

(f "INTERSTELLAR")

Salida:

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

1

PHP, 129 bytes

12 Bytes guardados por @Titus Gracias

cadena = $ argv [1], relación = $ argv [2], dirección = $ argv [3] hacia adentro = 0, hacia afuera = 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_paddebería guardar 4 bytes. Intente ++$i>$l?$l-$i/2:$i/2y en $t[$i++]/2lugar de incrementar la condición posterior del bucle; eso debería salvar 9. ¿Por qué 0^?
Titus

@Titus 0^3.12resultado en el 3que es necesario
Jörg Hülsermann

$i=0es innecesario ++$i>Todavía guarda un byte $i++>=. Y puede guardar un byte más moviendo ese incremento a la condición previa: en ++$i<2*$l=...lugar de $i+1<2*$l=..., intercambiar ramas verdaderas y falsas del ternario externo, en $ilugar de ++$iy en $t[$i/2-.5]lugar de $t[$i++/2].
Titus

Definir hacia adentro como hacia 1afuera como 2debería permitirle guardar otros 3 bytes: en ($l>>1)lugar de (0^$l/2+1); pero no he probado ninguno de estos.
Titus

@Titus esto resultará en espacios más grandes
Jörg Hülsermann
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.