Judul Film dengan Gaya Tali


19

Tantangan

Pernah melihat judul-judul trailer film (yaitu Mars, Interstellar, dll) di mana mereka memiliki celah besar di antara surat-surat perlahan menyebar?

Tantangannya adalah untuk menciptakan kembali efek ini mengingat string, pengali celah dan arah, dengan memasukkan jumlah ruang yang tepat di antara huruf.

Contoh

Input : 'INTERSTELLAR', Pengganda celah: 1.0, Arah: Meningkatkan Ke Dalam

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

Jaraknya adalah: [1, 2, 3, ..., 3, 2, 1]; mengganti spasi dengan '.' untuk lebih menunjukkan jarak:

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

Input : 'INTERSTELLAR', Pengganda celah: 0,5, Arah: Meningkatkan Ke Dalam

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

Spasi dikalikan 0,5, oleh karena itu kita mendapatkan [0, 1, 1, 2, ... 2, 1, 1, 0] dari pembagian integer; menggunakan '.':

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

Input : 'CODEGOLF', Pengganda celah: 2.0, Arah: Menambah Ke Luar

Output: C        O      D    E  G    O      L        F

Spasi dikalikan dengan 2, meningkat ke luar, oleh karena itu kita mendapatkan [8,6,4,2,4,6,8]; ganti dengan '.':

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

Input : 'CODEGOLF', Pengganda celah: 0,4, Arah: Menambah Ke Luar

Output: C O DEGO L F

Spasi dikalikan dengan 0,4, meningkat ke luar, oleh karena itu kita mendapatkan [1,1,0,0,0,1,1]]; ganti dengan '.':

C.O.DEGO.L.F

Aturan

  • Membawa 3 input: string, pengali celah dan arah
  • Jika string input panjangnya ganjil (bahkan dalam # kesenjangan) misalnya 'HELLO', jarak bagian dalam paling banyak 2 celah harus sama H E L L O
  • Pengganda arah dan celah dapat diuraikan seperti yang Anda inginkan, misalnya Anda dapat menggunakan -2 sebagai 'meningkatkan ke dalam dengan pengganda 2', 1 sebagai 'meningkatkan ke luar dengan pengganda 1', dll.
  • Hanya diperlukan untuk menggunakan spasi, namun itu adalah bonus jika pengisian karakter dapat disesuaikan.

Animasi Referensi

referensi gif

Bersenang-senang bermain golf!


1
Halo, dan selamat datang di PPCG! Anda mungkin ingin membuat ini sedikit lebih sederhana dengan mengubah Increasingke 1 => Inward, 0 => Outwardatau sebaliknya.
NoOneIsHere

1
@NoOneIsHere Terima kasih! Arah dan rasio parsing fleksibel, sesuai aturan 3, Anda dapat menggunakan 0,1 untuk menentukan arah atau bahkan menggabungkan kedua parameter menjadi satu, seperti +4 untuk 4 ke dalam, -0,5 untuk 0,5 ke luar dll, hanya perlu didefinisikan dengan solusinya.
Zukaberg

3
Ini tantangan yang sangat menarik! Selamat datang di situs ini. :)
DJMcMayhem

Saya tidak melihat mengapa rasio kesenjangan 2 ditafsirkan sebagai tumbuh keluar, sementara 1 dan 0,5 keduanya tumbuh ke dalam.
xnor

@ xnor oh tidak maaf atas kebingungan, arah tidak ada hubungannya dengan rasio, arah dan rasio adalah parameter yang terpisah, 2.0 ke dalam akan terlihat seperti:C..O....D......E........G......O....L..F
Zukaberg

Jawaban:


3

JavaScript (ES6), 86 82 81 80 byte

Input diharapkan dalam sintaks currying f(s)(r), dengan:

  • s = string
  • r = rasio + arah: pelampung negatif untuk ke dalam atau pelampung positif untuk ke luar

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

Ini mengambil string sebagai argumen kanannya, rasio sebagai argumen kiri dan arahnya sebagai operan kiri (0 untuk ke dalam dan 1 untuk ke luar).

      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

Penjelasan:

  • ⍳⍴1↓⍵: dapatkan daftar angka dari 1 hingga N-1, dengan N adalah panjang string
  • (⌽⌊+): membalikkan daftar, dan di setiap posisi, dapatkan jumlah terendah dari kedua daftar (ini memberikan ukuran kesenjangan jika meningkat ke dalam)
  • (1+⌈/-+)⍣⍺⍺: kurangi setiap angka dalam daftar dari angka tertinggi dalam daftar, dan tambahkan 1. Lakukan ini ⍺⍺kali. (Jika ⍺⍺=0, tidak ada yang akan terjadi, dan jika ⍺⍺=1, ini akan memberikan ukuran celah jika meningkat ke arah luar.)
  • -⌊⍺×: kalikan setiap celah dengan , bulatkan ke bawah, dan negasikan.
  • ∊1,⍨1,¨: tambahkan 1 di depan setiap celah, dan 1 di bagian paling akhir daftar.
  • 0~⍨: hapus sembarang angka nol.
  • ⍵\⍨: gunakan daftar yang dihasilkan untuk memperluas . Expand ( \) bekerja dengan cara berikut: untuk setiap angka positif, karakter saat ini direplikasi berkali-kali, dan untuk setiap angka negatif, bahwa banyak spasi dimasukkan, dengan peringatan itu 0dan ¯1melakukan hal yang sama, itulah sebabnya semua nol harus dihapus lebih awal.

1

MATL , 31 byte

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

Inputnya adalah: string; 0atau 1untuk peningkatan ke dalam atau ke luar; pengganda.

Cobalah online!

Penjelasan

Pertimbangkan masukan 'INTERSTELLAR', 1, 0.5sebagai contoh.

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

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

Tidak Disatukan:

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

Pengujian:

(f "INTERSTELLAR")

Keluaran:

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

1

PHP, 129 Bytes

12 Bytes disimpan oleh @Titus Terima Kasih

string = $ argv [1], rasio = $ argv [2], arah = $ argv [3] ke dalam = 0, Luar = 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_padharus menyimpan 4 byte. Coba ++$i>$l?$l-$i/2:$i/2dan $t[$i++]/2bukannya peningkatan dalam kondisi pasca lingkaran; itu harus menyelamatkan 9. Mengapa 0^?
Titus

@Titus 0^3.12menghasilkan 3yang diperlukan
Jörg Hülsermann

$i=0tidak perlu. ++$i>masih menyimpan lebih dari satu byte $i++>=. Dan Anda dapat menyimpan satu byte lagi dengan memindahkan kenaikan itu ke kondisi awal: ++$i<2*$l=...alih-alih $i+1<2*$l=..., menukar cabang true dan false dari terner luar, $ibukan ++$idan $t[$i/2-.5]bukannya $t[$i++/2].
Titus

Menentukan ke dalam sebagai 1dan ke luar sebagai 2, akan memungkinkan Anda untuk menyimpan 3 byte lainnya: ($l>>1)bukannya (0^$l/2+1); tapi saya belum menguji semua ini.
Titus

@Titus ini akan menghasilkan ruang yang lebih besar
Jörg Hülsermann
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.