Рядок стильового заголовка фільму


19

Виклик

Ви коли-небудь бачили ці назви трейлерів фільмів (а саме Марсіани, Інтерстеллар тощо), де у них величезні прогалини між літерами, що повільно розтікаються?

Завдання полягає в тому, щоб відтворити цей ефект, враховуючи рядок, множник розриву та напрямок, вставляючи між літерами відповідну кількість пробілів.

Приклад

Вхід : 'INTERSTELLAR', множник пропусків: 1.0, Напрямок: Збільшення Внутрішній

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

Інтервал - це: [1, 2, 3, ..., 3, 2, 1]; заміна пробілів на "." щоб краще продемонструвати інтервал:

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

Вхід : 'INTERSTELLAR', множник пропусків: 0,5, Напрямок: Зростання всередину

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

Проміжок множимо на 0,5, тому отримуємо [0, 1, 1, 2, ... 2, 1, 1, 0] з цілого поділу; за допомогою ".":

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

Вхід : 'CODEGOLF', множник пропусків: 2.0, Напрямок: Збільшення назовні

Output: C        O      D    E  G    O      L        F

Розміщення множимо на 2, збільшуючи назовні, тому отримуємо [8,6,4,2,4,6,8]; заміна на ".":

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

Вхід : 'CODEGOLF', множник пропусків: 0,4, Напрямок: Збільшення назовні

Output: C O DEGO L F

Розміщення множимо на 0,4, збільшуючи назовні, тому отримуємо [1,1,0,0,0,1,1]; заміна на ".":

C.O.DEGO.L.F

Правила

  • Займає 3 введення: рядок, множник розриву та напрямок
  • Якщо вхідний рядок має непарну довжину (навіть у # проміжках), наприклад, "HELLO", відстань між внутрішніми самими 2 проміжками має бути однаковим H E L L O
  • Мультиплікатор напряму та зазору можна проаналізувати, як хочете, наприклад, ви можете використовувати -2 як "збільшення всередину з множником 2", 1 як "збільшення назовні множником 1" тощо.
  • Використовувати пробіли потрібно лише, проте це бонус, якщо заповнення символів налаштовується.

Довідкова анімація

посилання gif

Весело гольфу!


1
Привіт, і ласкаво просимо до PPCG! Ви могли б хотіти зробити це трохи простіше, змінивши Increasingдо 1 => Inward, 0 => Outwardабо навпаки.
NoOneIsHere

1
@NoOneIsHere Дякую! Аналіз напрямку та відношення є гнучким, як правило 3, ви можете використовувати 0,1, щоб вказати напрямок або навіть комбінувати обидва параметри в один, наприклад +4 для 4 всередину, -0,5 для 0,5 назовні тощо, це просто потрібно визначити з розчином.
Зукаберг

3
Це дуже цікавий виклик! Ласкаво просимо на сайт. :)
DJMcMayhem

Я не бачу, чому коефіцієнт розриву 2 трактується як зростання назовні, тоді як 1 і 0,5 зростають всередину.
xnor

@xnor о, не вибачте за плутанину, напрямок не має нічого спільного з співвідношенням, напрям і співвідношення - це окремі параметри, 2,0 всередину буде виглядати так:C..O....D......E........G......O....L..F
Зукаберг

Відповіді:


3

JavaScript (ES6), 86 82 81 80 байт

Введення очікується в синтаксисі currying f(s)(r)з:

  • s = рядок
  • r = співвідношення + напрям: від'ємний поплавок на внутрішню або позитивний поплавок назовні

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 байт

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

Це приймає рядок як правий аргумент, співвідношення як його лівий аргумент, а напрямок - як його лівий операнд (0 для внутрішнього і 1 для зовнішнього).

      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

Пояснення:

  • ⍳⍴1↓⍵: отримайте список чисел від 1 до N-1, де N - довжина рядка
  • (⌽⌊+): переверніть список і на кожній позиції отримайте найменшу кількість обох списків (це дає розміри прогалин, якщо збільшується всередину)
  • (1+⌈/-+)⍣⍺⍺: відніміть кожне число у списку від найбільшого числа у списку та додайте 1. Зробіть це ⍺⍺раз. (Якщо ⍺⍺=0нічого не відбудеться, і якщо ⍺⍺=1, це дасть розміри прогалин, якщо збільшиться назовні.)
  • -⌊⍺×: помножте кожен проміжок на , округніть його вниз і заперечуйте.
  • ∊1,⍨1,¨: додайте 1 перед кожним проміжком та 1 в самому кінці списку.
  • 0~⍨: видаліть нулі.
  • ⍵\⍨: використовуйте отриманий список для розширення . Розгорнути ( \) працює наступним чином: для кожного позитивного числа, поточний символ копіюється , що у багато разів, і для кожного негативного числа, що багато будуть вставлені пробіли, із застереженням , що 0і ¯1робити те ж саме, тому всі нулі довелося прибрати раніше.

1

MATL , 31 байт

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

Вхідні дані: рядок; 0або 1для збільшення всередину або назовні; множник.

Спробуйте в Інтернеті!

Пояснення

Розглянемо входи 'INTERSTELLAR', 1, в 0.5якості прикладу.

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

Ракетка 348 байт

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

Безголівки:

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

Тестування:

(f "INTERSTELLAR")

Вихід:

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

1

PHP, 129 байт

12 байт, збережених @Titus Дякую

string = $ argv [1], співвідношення = $ argv [2], напрям = $ argv [3] всередину = 0, назовні = 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_padмає зберегти 4 байти. Спробуйте ++$i>$l?$l-$i/2:$i/2і $t[$i++]/2замість збільшення петлі після стану; що має заощадити 9. Чому 0^?
Тит

0^3.12Результат @Titus, в 3якому необхідно
Йорг Гюльсерманн

$i=0є непотрібним. ++$i>як і раніше зберігає один байт $i++>=. І ви можете зберегти ще один байт, перемістивши цей приріст до попередньої умови: ++$i<2*$l=...замість того $i+1<2*$l=..., щоб поміняти місцями істинні та помилкові гілки зовнішнього тріска,$i замість ++$iі $t[$i/2-.5]замість $t[$i++/2].
Тит

Визначення всередину як 1і зовні як2 , повинно дозволяти вам зберегти ще 3 байти: ($l>>1)замість (0^$l/2+1); але я нічого з цього не перевіряв.
Тіт

@Titus це призведе до більших просторів
Йорг Гюльсерманн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.