Stringa in stile titolo film


19

Sfida

Hai mai visto quei titoli dei trailer dei film (vale a dire Martian, Interstellar, ecc.) In cui hanno enormi lacune tra le lettere che si diffondono lentamente?

La sfida è quella di ricreare questo effetto data una stringa, un moltiplicatore di gap e una direzione, inserendo una quantità appropriata di spazi tra le lettere.

Esempio

Input : 'INTERSTELLAR', moltiplicatore di gap: 1.0, direzione: crescente verso l'interno

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

La spaziatura è: [1, 2, 3, ..., 3, 2, 1]; sostituendo gli spazi con '.' per dimostrare meglio la spaziatura:

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

Input : 'INTERSTELLAR', moltiplicatore di gap: 0,5, direzione: crescente verso l'interno

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

La spaziatura viene moltiplicata per 0,5, quindi otteniamo [0, 1, 1, 2, ... 2, 1, 1, 0] dalla divisione intera; usando '.':

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

Input : 'CODEGOLF', Moltiplicatore di gap: 2.0, Direzione: crescente verso l'esterno

Output: C        O      D    E  G    O      L        F

La spaziatura viene moltiplicata per 2, aumentando verso l'esterno, quindi otteniamo [8,6,4,2,4,6,8]; sostituendo con ".":

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

Input : 'CODEGOLF', Moltiplicatore di gap: 0.4, Direzione: crescente verso l'esterno

Output: C O DEGO L F

La spaziatura viene moltiplicata per 0,4, aumentando verso l'esterno, quindi otteniamo [1,1,0,0,0,1,1]; sostituendo con ".":

C.O.DEGO.L.F

Regole

  • Accetta 3 input: stringa, moltiplicatore di gap e direzione
  • Se la stringa di input ha una lunghezza dispari (anche in # di spazi vuoti), ad es. 'CIAO', la spaziatura della maggior parte dei 2 spazi interni dovrebbe essere la stessa H E L L O
  • Il moltiplicatore di direzione e gap può essere analizzato come desiderato, ad esempio è possibile utilizzare -2 come "crescente verso l'interno con un moltiplicatore di 2", 1 come "crescente verso l'esterno con un moltiplicatore di 1", ecc.
  • È richiesto solo l'uso di spazi, tuttavia è un vantaggio se il riempimento del personaggio è personalizzabile.

Animazione di riferimento

riferimento gif

Divertiti a giocare a golf!


1
Ciao e benvenuto in PPCG! Potresti voler semplificare un po 'cambiando Increasingin 1 => Inward, 0 => Outwardo viceversa.
NoOneIsHere

1
@NoOneIsHere Grazie! L'analisi della direzione e del rapporto è flessibile, come da regola 3, puoi usare 0,1 per specificare la direzione o anche combinare entrambi i parametri in uno, come +4 per 4 verso l'interno, -0,5 per 0,5 verso l'esterno ecc., Deve solo essere definito con la soluzione.
Zukaberg,

3
Questa è una sfida molto interessante! Benvenuti nel sito. :)
DJMcMayhem

Non vedo perché un gap gap di 2 sia interpretato come crescente verso l'esterno, mentre 1 e 0,5 crescono entrambi verso l'interno.
xnor

@xnor oh no scusa per la confusione, la direzione non ha nulla a che fare con il rapporto, la direzione e il rapporto sono parametri separati, un 2.0 verso l'interno sarebbe simile:C..O....D......E........G......O....L..F
Zukaberg

Risposte:


3

JavaScript (ES6), 86 82 81 80 byte

È previsto un input nella sintassi del curry f(s)(r) , con:

  • s = stringa
  • r = rapporto + direzione: un galleggiante negativo per l'interno o un galleggiante positivo per l'esterno

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


2

05AB1E , 33 byte

Utilizza la codifica CP-1252 .

Il moltiplicatore di gap viene considerato negativo quando aumenta verso l'esterno.

g;>Î.S<_²**ÄU¹vyð²¹g<;N.S*X+DUï×J

Provalo online!


1

APL, 40 byte

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

Questo prende la stringa come argomento destro, il rapporto come argomento sinistro e la direzione come operando sinistro (0 per interno e 1 per esterno).

      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

Spiegazione:

  • ⍳⍴1↓⍵: ottiene un elenco di numeri da 1 a N-1, dove N è la lunghezza della stringa
  • (⌽⌊+): inverti l'elenco e, in ciascuna posizione, ottiene il numero più basso di entrambi gli elenchi (ciò fornisce le dimensioni degli spazi vuoti se aumenta verso l'interno)
  • (1+⌈/-+)⍣⍺⍺: sottrarre ciascun numero nell'elenco dal numero più alto dell'elenco e aggiungere 1. Ripetere questa operazione ⍺⍺. (Se ⍺⍺=0non accadrà nulla, e se ⍺⍺=1, questo darà le dimensioni degli spazi vuoti se aumenta verso l'esterno.)
  • -⌊⍺×: moltiplica ogni spazio per , arrotondalo verso il basso e annulla.
  • ∊1,⍨1,¨: aggiungi un 1 davanti a ogni spazio vuoto e un 1 alla fine dell'elenco.
  • 0~⍨: rimuove eventuali zeri.
  • ⍵\⍨: usa l'elenco risultante per espandere . Expand ( \) funziona nel modo seguente: per ogni numero positivo, il carattere corrente viene replicato più volte e per ogni numero negativo vengono inseriti molti spazi, con l'avvertenza che 0e ¯1fanno la stessa cosa, motivo per cui tutti i gli zeri dovevano essere rimossi prima.

1

MATL , 31 byte

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

Gli input sono: stringa; 0o1 per aumentare verso l'interno o verso l'esterno; moltiplicatore.

Provalo online!

Spiegazione

Considerare ingressi 'INTERSTELLAR', 1, 0.5come esempio.

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

Racchetta 348 byte

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

test:

(f "INTERSTELLAR")

Produzione:

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

1

PHP, 129 byte

12 byte salvati da @Titus Grazie

stringa = $ argv [1], rapporto = $ argv [2], direzione = $ argv [3] verso l'interno = 0, verso l'esterno = 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_paddovrebbe salvare 4 byte. Prova ++$i>$l?$l-$i/2:$i/2e $t[$i++]/2invece di incrementare in post-condizione loop; che dovrebbe salvare 9. Perché 0^?
Tito,

@Titus 0^3.12in 3cui è necessario
Jörg Hülsermann

$i=0non è necessario. ++$i>salva ancora un byte $i++>=. E puoi salvare un altro byte spostando quell'incremento nella pre-condizione: ++$i<2*$l=...invece di $i+1<2*$l=..., scambia i rami vero e falso del ternario esterno, $iinvece di ++$ie $t[$i/2-.5]invece di $t[$i++/2].
Tito,

La definizione interna 1e esterna come 2, dovrebbe consentire di salvare altri 3 byte: ($l>>1)anziché (0^$l/2+1); ma non ho provato nessuno di questi.
Tito,

@Titus questo si tradurrà in spazi più ampi
Jörg Hülsermann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.