Łańcuch w stylu tytułu filmu

19

Wyzwanie

Widziałeś kiedyś te zwiastuny filmów (mianowicie Marsjański, Międzygwiezdny itp.), W których między literami powoli się rozrastają?

Wyzwanie polega na odtworzeniu tego efektu przy użyciu ciągu, mnożnika odstępu i kierunku poprzez wstawienie odpowiedniej liczby spacji między litery.

Przykład

Dane wejściowe : „INTERSTELLAR”, mnożnik odstępu: 1,0, kierunek: zwiększenie do wewnątrz

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

Odstępy są następujące: [1, 2, 3, ..., 3, 2, 1]; zamieniając spacje na „.” aby lepiej zademonstrować odstępy:

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

Dane wejściowe : „INTERSTELLAR”, mnożnik szczeliny: 0,5, kierunek: zwiększenie do wewnątrz

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

Odstęp jest mnożony przez 0,5, dlatego otrzymujemy [0, 1, 1, 2, ... 2, 1, 1, 0] z dzielenia liczb całkowitych; za pomocą '.':

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

Dane wejściowe : „CODEGOLF”, mnożnik odstępu: 2,0, kierunek: zwiększenie na zewnątrz

Output: C        O      D    E  G    O      L        F

Odstępy są mnożone przez 2, zwiększając się na zewnątrz, dlatego otrzymujemy [8,6,4,2,4,6,8]; zastępując „.”:

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

Dane wejściowe : „CODEGOLF”, mnożnik odstępu: 0,4, kierunek: zwiększenie na zewnątrz

Output: C O DEGO L F

Odstępy są mnożone przez 0,4, zwiększając się na zewnątrz, dlatego otrzymujemy [1,1,0,0,0,1,1]; zastępując „.”:

C.O.DEGO.L.F

Zasady

  • Pobiera 3 dane wejściowe: ciąg, mnożnik odstępu i kierunek
  • Jeśli łańcuch wejściowy ma nieparzystą długość (nawet w # przerwach) np. „CZEŚĆ”, odstępy między najbardziej wewnętrznymi 2 przerwami powinny być takie same H E L L O
  • Mnożnik kierunku i odstępu można analizować w dowolny sposób, np. Można użyć -2 jako „zwiększenie do wewnątrz za pomocą mnożnika 2”, 1 jako „zwiększenie na zewnątrz za pomocą mnożnika 1” itp.
  • Wymagane jest tylko użycie spacji, ale jest to bonus, jeśli wypełnienie postaci można dostosować.

Animacja odniesienia

referencyjny gif

Miłej zabawy w golfa!

Zukaberg
źródło
1
Witaj i witaj w PPCG! Możesz to uprościć, zmieniając Increasingna 1 => Inward, 0 => Outwardlub odwrotnie.
NoOneIsHere
1
@NoOneIsHere Dzięki! Analiza parsowania kierunku i współczynnika jest elastyczna, zgodnie z regułą 3 można użyć 0,1, aby sprecyzować kierunek lub nawet połączyć oba parametry w jeden, np. +4 dla 4 do wewnątrz, -0,5 dla 0,5 na zewnątrz itp., Wystarczy zdefiniować z rozwiązaniem.
Zukaberg,
3
To bardzo interesujące wyzwanie! Witamy na stronie. :)
DJMcMayhem
Nie rozumiem, dlaczego współczynnik odstępu 2 jest interpretowany jako rosnący na zewnątrz, podczas gdy 1 i 0,5 oba rosną do wewnątrz.
xnor
@ xnor o nie przepraszam za zamieszanie, kierunek nie ma nic wspólnego ze stosunkiem, kierunek i stosunek to osobne parametry, 2.0 do wewnątrz wyglądałby tak:C..O....D......E........G......O....L..F
Zukaberg

Odpowiedzi:

3

JavaScript (ES6), 86 82 81 80 bajtów

Dane wejściowe są oczekiwane w składni curry f(s)(r), z:

  • s = ciąg
  • r = stosunek + kierunek: pływak ujemny dla wewnątrz lub dodatni pływak dla na zewnątrz

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

Arnauld
źródło
2

05AB1E , 33 bajty

Wykorzystuje kodowanie CP-1252 .

Mnożnik odstępu jest uważany za ujemny, gdy rośnie na zewnątrz.

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

Wypróbuj online!

Emigna
źródło
1

APL, 40 bajtów

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

To bierze łańcuch za prawy argument, stosunek za lewy argument, a kierunek za lewy argument (0 dla wewnątrz i 1 dla na zewnątrz).

      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

Wyjaśnienie:

  • ⍳⍴1↓⍵: uzyskaj listę liczb od 1 do N-1, gdzie N jest długością łańcucha
  • (⌽⌊+): odwróć listę i na każdej pozycji uzyskaj najniższą liczbę z obu list (daje to rozmiary przerw, jeśli zwiększa się do wewnątrz)
  • (1+⌈/-+)⍣⍺⍺: odejmij każdą liczbę na liście od najwyższej liczby na liście i dodaj 1. Zrób to ⍺⍺razy. (Jeśli ⍺⍺=0nic się nie wydarzy, a jeśli ⍺⍺=1to da rozmiary luk, jeśli zwiększą się na zewnątrz.)
  • -⌊⍺×: pomnóż każdą przerwę , zaokrągl ją w dół i zaneguj.
  • ∊1,⍨1,¨: dodaj 1 przed każdą przerwą i 1 na samym końcu listy.
  • 0~⍨: usuń wszelkie zera.
  • ⍵\⍨: użyj wynikowej listy, aby rozwinąć . Expand ( \) działa w następujący sposób: dla każdej liczby dodatniej bieżący znak jest replikowany tyle razy, a dla każdej liczby ujemnej, że wstawianych jest wiele spacji, z zastrzeżeniem, że 0i ¯1robią to samo, dlatego wszystkie zera musiały zostać wcześniej usunięte.
marinus
źródło
1

MATL , 31 bajtów

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

Dane wejściowe to: ciąg; 0lub 1do zwiększenia wewnętrznego lub zewnętrznego; mnożnik.

Wypróbuj online!

Wyjaśnienie

Rozważmy wejść 'INTERSTELLAR', 1, 0.5jako przykład.

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
Luis Mendo
źródło
1

Rakieta 348 bajtów

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

Nie golfowany:

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

Testowanie:

(f "INTERSTELLAR")

Wynik:

"I N  T   E    R     S      T     E    L   L  A R"
rnso
źródło
1

PHP, 129 bajtów

12 bajtów zapisanych przez @Titus Dziękujemy

string = $ argv [1], stosunek = $ argv [2], kierunek = $ argv [3] do wewnątrz = 0, na zewnątrz = 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];
Jörg Hülsermann
źródło
str_padpowinien zaoszczędzić 4 bajty. Spróbuj ++$i>$l?$l-$i/2:$i/2i $t[$i++]/2zamiast zwiększać pętlę po stanie; to powinno oszczędzić 9. Dlaczego 0^?
Tytus
@ 0^3.12Wynik Titusa, 3który jest konieczny
Jörg Hülsermann 10.10.16
$i=0jest niepotrzebne. ++$i>nadal oszczędza jeden bajt $i++>=. I możesz zaoszczędzić jeszcze jeden bajt, przesuwając ten przyrost do warunku wstępnego: ++$i<2*$l=...zamiast $i+1<2*$l=...zamieniać prawdziwe i fałszywe gałęzie trójskładnika zewnętrznego $izamiast zamiast ++$ii $t[$i/2-.5]zamiast $t[$i++/2].
Tytus
Zdefiniowanie wewnątrz 1i na zewnątrz jako 2powinno umożliwić zapisanie kolejnych 3 bajtów: ($l>>1)zamiast (0^$l/2+1); ale nie testowałem żadnego z nich.
Tytus
@Titus spowoduje to zwiększenie przestrzeni
Jörg Hülsermann