Tiêu đề phim theo kiểu chuỗi


19

Thử thách

Bạn đã bao giờ nhìn thấy những tựa phim trailer đó (cụ thể là Martian, Interstellar, v.v.) khi chúng có những khoảng trống lớn giữa các chữ cái đang dần lan ra?

Thách thức là tạo lại hiệu ứng này với một chuỗi, số nhân khoảng cách và hướng, bằng cách chèn một khoảng trống thích hợp vào giữa các chữ cái.

Thí dụ

Đầu vào : 'INTERSTELLAR', Số nhân khoảng cách: 1.0, Hướng: Tăng vào bên trong

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

Khoảng cách là: [1, 2, 3, ..., 3, 2, 1]; thay thế khoảng trắng bằng '.' để thể hiện tốt hơn khoảng cách:

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

Đầu vào : 'INTERSTELLAR', Số nhân khoảng cách: 0,5, Hướng: Tăng vào bên trong

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

Khoảng cách được nhân với 0,5, do đó chúng ta nhận được [0, 1, 1, 2, ... 2, 1, 1, 0] từ phép chia số nguyên; sử dụng '.':

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

Đầu vào : 'CODEGOLF', Số nhân khoảng cách: 2.0, Hướng: Tăng dần ra ngoài

Output: C        O      D    E  G    O      L        F

Khoảng cách được nhân với 2, tăng dần ra ngoài, do đó, chúng tôi nhận được [8,6,4,2,4,6,8]; thay thế bằng '.':

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

Đầu vào : 'CODEGOLF', Số nhân khoảng cách: 0,4, Hướng: Tăng dần ra ngoài

Output: C O DEGO L F

Khoảng cách được nhân với 0,4, tăng dần ra ngoài, do đó chúng tôi nhận được [1,1,0,0,0,1,1]; thay thế bằng '.':

C.O.DEGO.L.F

Quy tắc

  • Có 3 đầu vào: chuỗi, số nhân khoảng cách và hướng
  • Nếu chuỗi đầu vào có độ dài lẻ (ngay cả trong # các khoảng trống), ví dụ 'HELLO', khoảng cách của 2 khoảng trống bên trong sẽ giống nhau H E L L O
  • Số nhân hướng và khoảng cách có thể được phân tích cú pháp theo bất kỳ cách nào bạn muốn, ví dụ: bạn có thể sử dụng -2 khi 'tăng dần vào trong với hệ số nhân 2', 1 khi 'tăng dần ra ngoài với hệ số nhân là 1', v.v.
  • Nó chỉ được yêu cầu sử dụng khoảng trắng, tuy nhiên nó là phần thưởng nếu việc điền vào nhân vật có thể tùy chỉnh.

Hoạt hình tham khảo

gif tham khảo

Chúc bạn chơi golf vui vẻ!


1
Xin chào, và chào mừng đến với PPCG! Bạn có thể muốn thực hiện một này cắn đơn giản bằng cách thay đổi Increasingđể 1 => Inward, 0 => Outwardhoặc ngược lại.
NoOneIsHãy là

1
@NoOneIsCảm ơn! Phân tích cú pháp hướng và tỷ lệ rất linh hoạt, theo quy tắc 3, bạn có thể sử dụng 0,1 để xác định hướng cụ thể hoặc thậm chí kết hợp cả hai tham số thành một, như +4 cho 4 vào trong, -0,5 cho 0,5 ra ngoài, v.v. với giải pháp.
Zukaberg

3
Đây là một thử thách rất thú vị! Chào mừng đến với trang web. :)
DJMcMayhem

Tôi không thấy lý do tại sao tỷ lệ khoảng cách 2 được hiểu là phát triển ra bên ngoài, trong khi 1 và 0,5 cả hai đều tăng trưởng vào trong.
xnor

@xnor oh không xin lỗi vì sự nhầm lẫn, hướng không liên quan gì đến tỷ lệ, hướng và tỷ lệ là các tham số riêng biệt, một 2.0 vào bên trong sẽ như sau:C..O....D......E........G......O....L..F
Zukaberg 7/10/2016

Câu trả lời:


3

JavaScript (ES6), 86 82 81 80 byte

Đầu vào được mong đợi trong cú pháp currying f(s)(r), với:

  • s = chuỗi
  • r = ratio + direction: phao âm cho hướng vào trong hoặc phao dương cho hướng ra ngoài

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 byte

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

Điều này lấy chuỗi làm đối số bên phải của nó, tỷ lệ làm đối số bên trái và hướng là toán hạng bên trái của nó (0 cho bên trong và 1 cho bên ngoài).

      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

Giải trình:

  • ⍳⍴1↓⍵: lấy danh sách các số từ 1 đến N-1, trong đó N là độ dài của chuỗi
  • (⌽⌊+): đảo ngược danh sách và tại mỗi vị trí, lấy số lượng thấp nhất của cả hai danh sách (điều này cho kích thước của các khoảng trống nếu tăng dần vào trong)
  • (1+⌈/-+)⍣⍺⍺: trừ từng số trong danh sách từ số cao nhất trong danh sách và thêm 1. Thực hiện ⍺⍺lần này . (Nếu ⍺⍺=0, sẽ không có gì xảy ra, và nếu ⍺⍺=1, điều này sẽ cho kích thước của các khoảng trống nếu tăng dần ra ngoài.)
  • -⌊⍺×: nhân từng khoảng trống bằng cách làm tròn nó xuống và phủ định nó.
  • ∊1,⍨1,¨: thêm 1 vào trước mỗi khoảng trống và 1 ở cuối danh sách.
  • 0~⍨: loại bỏ bất kỳ số không.
  • ⍵\⍨: sử dụng danh sách kết quả để mở rộng . Expand ( \) hoạt động theo cách sau: đối với mỗi số dương, ký tự hiện tại được sao chép nhiều lần và với mỗi số âm, nhiều khoảng trắng được chèn vào, với cảnh báo đó 0¯1thực hiện cùng một điều, đó là lý do tại sao tất cả số không phải được loại bỏ trước đó.

1

MATL , 31 byte

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

Đầu vào là: chuỗi; 0hoặc 1cho tăng hoặc hướng nội; cấp số nhân.

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào 'INTERSTELLAR', 1, 0.5làm ví dụ.

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

Vợt 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))))

Ung dung:

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

Kiểm tra:

(f "INTERSTELLAR")

Đầu ra:

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

1

PHP, 129 byte

12 byte được lưu bởi @Titus Cảm ơn bạn

chuỗi = $ argv [1], ratio = $ argv [2], direction = $ argv [3] inward = 0, Outward = 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_padnên tiết kiệm 4 byte. Hãy thử ++$i>$l?$l-$i/2:$i/2$t[$i++]/2thay vì tăng trong điều kiện sau vòng lặp; nên tiết kiệm 9. Tại sao 0^?
Tít

@Titus 0^3.12kết quả 3là cần thiết
Jörg Hülsermann

$i=0là không cần thiết ++$i>vẫn tiết kiệm được một byte $i++>=. Và Bạn có thể lưu thêm một byte bằng cách di chuyển số gia đó sang điều kiện trước: ++$i<2*$l=...thay vì $i+1<2*$l=..., hoán đổi các nhánh đúng và sai của ternary bên ngoài, $ithay vì ++$i$t[$i/2-.5]thay vì $t[$i++/2].
Tít

Xác định bên trong 1và bên ngoài như 2, sẽ cho phép bạn lưu thêm 3 byte: ($l>>1)thay vì (0^$l/2+1); nhưng tôi đã thử nghiệm bất kỳ trong số này.
Tít

@Titus điều này sẽ dẫn đến không gian rộng hơn
Jörg Hülsermann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.