Movie Title Styled String


19

Herausforderung

Haben Sie jemals diese Trailer-Titel (Martian, Interstellar usw.) gesehen, bei denen sich zwischen den Buchstaben große Lücken ausbreiten?

Die Herausforderung besteht darin, diesen Effekt bei gegebener Zeichenfolge, Lückenmultiplikator und Richtung durch Einfügen einer angemessenen Anzahl von Leerzeichen zwischen den Buchstaben wiederherzustellen.

Beispiel

Eingabe : 'INTERSTELLAR', Gap-Multiplikator: 1.0, Richtung: nach innen steigend

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

Der Abstand beträgt: [1, 2, 3, ..., 3, 2, 1]; Ersetzen der Leerzeichen durch '.' um den Abstand besser zu demonstrieren:

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

Eingabe : 'INTERSTELLAR', Gap-Multiplikator: 0,5, Richtung: nach innen steigend

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

Der Abstand wird mit 0,5 multipliziert, daher erhalten wir [0, 1, 1, 2, ... 2, 1, 1, 0] aus der Ganzzahldivision; mit '.':

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

Eingabe : 'CODEGOLF', Gap-Multiplikator: 2,0, Richtung: Zunehmend nach außen

Output: C        O      D    E  G    O      L        F

Der Abstand wird mit 2 multipliziert und nimmt nach außen zu, daher erhalten wir [8,6,4,2,4,6,8]; Ersetzen durch '.':

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

Eingabe : 'CODEGOLF', Gap-Multiplikator: 0,4, Richtung: Zunehmend nach außen

Output: C O DEGO L F

Der Abstand wird mit 0,4 multipliziert und nimmt nach außen zu, daher erhalten wir [1,1,0,0,0,1,1]; Ersetzen durch '.':

C.O.DEGO.L.F

Regeln

  • Nimmt 3 Eingaben auf: String, Gap-Multiplikator und Richtung
  • Wenn die Länge der Eingabezeichenfolge ungerade ist (gerade in Anzahl der Lücken), z. B. 'HELLO', sollte der Abstand der innersten 2 Lücken gleich sein H E L L O
  • Der Richtungs- und Lückenmultiplikator kann beliebig analysiert werden, z. B. können Sie -2 als "mit einem Multiplikator von 2 nach innen ansteigen", 1 als "mit einem Multiplikator von 1 nach außen ansteigen" usw. verwenden.
  • Es ist nur erforderlich, Leerzeichen zu verwenden. Dies ist jedoch ein Bonus, wenn die Zeichenfüllung anpassbar ist.

Referenz-Animation

referenz gif

Viel Spaß beim Golfen!


1
Hallo und willkommen bei PPCG! Man könnte dies ein , indem einfachere Bit machen wollen , Increasingum 1 => Inward, 0 => Outwardoder umgekehrt.
NoOneIsHere

1
@NoOneIsHere Danke! Das Parsing von Richtung und Verhältnis ist flexibel, gemäß Regel 3 können Sie 0,1 verwenden, um die Richtung anzugeben, oder sogar beide Parameter zu einem zusammenfassen, z. B. +4 für 4 nach innen, -0,5 für 0,5 nach außen usw., es muss nur definiert werden mit der Lösung.
Zukaberg

3
Dies ist eine sehr interessante Herausforderung! Willkommen auf der Seite. :)
DJMcMayhem

Ich verstehe nicht, warum ein Lückenverhältnis von 2 als nach außen wachsend interpretiert wird, während 1 und 0,5 beide nach innen wachsen.
Xnor

@xnor oh nein entschuldigung für die verwirrung, die richtung hat nichts mit dem verhältnis zu tun, die richtung und das verhältnis sind separate parameter, ein 2,0 nach innen würde so aussehen:C..O....D......E........G......O....L..F
Zukaberg

Antworten:


3

JavaScript (ES6), 86 82 81 80 Byte

Eingaben werden in der aktuellen Syntax erwartet f(s)(r), mit:

  • s = Zeichenfolge
  • r = Verhältnis + Richtung: ein negativer Schwimmer nach innen oder ein positiver Schwimmer nach außen

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

Dabei wird der String als rechtes Argument, das Verhältnis als linkes Argument und die Richtung als linker Operand verwendet (0 für nach innen und 1 für nach außen).

      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

Erläuterung:

  • ⍳⍴1↓⍵: Erhalte eine Liste von Zahlen von 1 bis N-1, wobei N die Länge der Zeichenkette ist
  • (⌽⌊+): invertiere die Liste und erhalte an jeder Position die niedrigste Anzahl beider Listen (dies ergibt die Größe der Lücken, wenn sie nach innen zunehmen)
  • (1+⌈/-+)⍣⍺⍺: subtrahieren Sie jede Zahl in der Liste von der höchsten Zahl in der Liste und addieren Sie 1. Tun Sie diesmal ⍺⍺. (Wenn ⍺⍺=0nichts passiert, und wenn ⍺⍺=1dies der Fall ist , werden die Lücken größer, wenn sie nach außen zunehmen.)
  • -⌊⍺×: Multipliziere jede Lücke mit , runde sie ab und negiere sie.
  • ∊1,⍨1,¨: Fügen Sie vor jeder Lücke eine 1 und ganz am Ende der Liste eine 1 hinzu.
  • 0~⍨: Alle Nullen entfernen.
  • ⍵\⍨: Verwenden Sie die resultierende Liste zum Erweitern . Expand ( \) funktioniert folgendermaßen: Für jede positive Zahl wird das aktuelle Zeichen so oft repliziert, und für jede negative Zahl werden so viele Leerzeichen eingefügt, mit dem Vorbehalt, dass 0und ¯1dasselbe zu tun, weshalb alle Nullen mussten früher entfernt werden.

1

MATL , 31 Bytes

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

Eingaben sind: string; 0oder 1nach innen oder außen zu erhöhen; Multiplikator.

Probieren Sie es online!

Erläuterung

Betrachten Eingänge 'INTERSTELLAR', 1, 0.5als Beispiel.

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

Schläger 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
    ))

Testen:

(f "INTERSTELLAR")

Ausgabe:

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

1

PHP, 129 Bytes

12 Bytes von @Titus gespeichert Vielen Dank

Zeichenfolge = $ argv [1], Verhältnis = $ argv [2], Richtung = $ argv [3] nach innen = 0, nach außen = 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_padsollte 4 Bytes sparen. Versuchen Sie es mit ++$i>$l?$l-$i/2:$i/2und $t[$i++]/2erhöhen Sie nicht die Schleifen-Nachbedingung. das sollte sparen 9. Warum 0^?
Titus

@ Titus 0^3.12Ergebnis, in 3dem notwendig ist
Jörg Hülsermann

$i=0ist unnötig. ++$i>spart immer noch ein Byte über $i++>=. Und Sie können , indem diese Erhöhung auf die Voraussetzung ein weiteres Byte speichern ++$i<2*$l=...statt $i+1<2*$l=..., tauschen wahr und falsch Zweige des äußeren ternär $istatt ++$iund $t[$i/2-.5]statt $t[$i++/2].
Titus

Wenn Sie "nach innen" 1und "nach außen" definieren 2, können Sie weitere 3 Bytes speichern: ($l>>1)statt (0^$l/2+1); aber ich habe keines davon getestet.
Titus

@Titus dies führt zu größeren Räumen
Jörg Hülsermann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.