Film Başlığı Tarz Dizesi


19

Meydan okuma

Hiç film fragmanlarını (Mars, Yıldızlararası, vb.) Yavaşça yayılan harfler arasında büyük boşluklar gördüklerini gördünüz mü?

Zorluk, harfler arasına uygun miktarda boşluk ekleyerek bir dize, boşluk çarpanı ve yönü verilen bu etkiyi yeniden yaratmaktır.

Misal

Giriş : 'INTERSTELLAR', Boşluk çarpanı: 1.0, Yön: İçe Artan

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

Boşluk: [1, 2, 3, ..., 3, 2, 1]; boşlukların yerine '.' aralığı daha iyi göstermek için:

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

Giriş : 'INTERSTELLAR', Boşluk çarpanı: 0.5, Yön: İçe Artan

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

Boşluk 0,5 ile çarpılır, bu nedenle tamsayı bölümünden [0, 1, 1, 2, ... 2, 1, 1, 0] elde ederiz; '.' kullanarak:

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

Giriş : 'CODEGOLF', Aralık çarpanı: 2.0, Yön: Dışa Artan

Output: C        O      D    E  G    O      L        F

Boşluk 2 ile çarpılır, dışa doğru artar, bu nedenle [8,6,4,2,4,6,8] elde ederiz; '.' ile değiştiriliyor:

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

Giriş : 'CODEGOLF', Aralık çarpanı: 0.4, Yön: Dışa Artan

Output: C O DEGO L F

Boşluk 0,4 ile çarpılır, dışa doğru artar, bu nedenle [1,1,0,0,0,1,1] elde ederiz; '.' ile değiştiriliyor:

C.O.DEGO.L.F

kurallar

  • 3 giriş alır: dize, boşluk çarpanı ve yönü
  • Eğer giriş dizesi tek uzunluktaysa (boşlukların sayısı dahilinde bile), örneğin 'HELLO', en fazla 2 boşluğun aralığı aynı olmalıdır H E L L O
  • Yön ve boşluk çarpanı istediğiniz gibi ayrıştırılabilir, örneğin -2'yi '2 çarpanıyla içe doğru artırma', 1 '1 çarpanıyla dışarı doğru artırma' vb.
  • Yalnızca boşluk kullanmak gerekir, ancak karakter doldurmanın özelleştirilebilir olması bir bonusdur.

Referans Animasyonu

referans gif

İyi eğlenceler golf!


1
Merhaba, PPCG'ye hoş geldiniz! Bunu değiştirerek veya tersini Increasingyaparak bunu biraz daha basit hale getirmek isteyebilirsiniz 1 => Inward, 0 => Outward.
NoOneIsHere

1
@NoOneIsHere Teşekkürler! Yön ve oran ayrıştırma esnektir, kural 3'e göre, yönü belirtmek için 0,1'i kullanabilir veya hatta her iki parametreyi 4 içe doğru +4, 0,5 dışarıya doğru -0,5 gibi birleştirebilirsiniz, sadece tanımlanması gerekir çözüm ile.
Zukaberg

3
Bu çok ilginç bir meydan okuma! Siteye hoş geldiniz. :)
DJMcMayhem

2'lik bir boşluk oranının neden dışa doğru büyüdüğü şeklinde yorumlanırken, 1 ve 0,5'in her ikisi de içe doğru büyür.
xnor

@xnor oh karışıklık için üzgünüm, yönün oranla ilgisi yoktur, yön ve oran ayrı parametrelerdir, 2.0 içe doğru şöyle görünecektir:C..O....D......E........G......O....L..F
Zukaberg

Yanıtlar:


3

JavaScript (ES6), 86 82 81 80 bayt

Curry sözdiziminde aşağıdakilerle girdi beklenir f(s)(r):

  • s = dize
  • r = oran + yön: içe doğru negatif şamandıra veya dışarıya pozitif şamandıra

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 bayt

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

Bu, dizeyi sağ argümanı, oranı sol argümanı ve yönü sol işlenen olarak alır (içe doğru 0 ve dışarıya 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

Açıklama:

  • ⍳⍴1↓⍵: 1'den N-1'e kadar olan sayıların bir listesini alın; burada N, dizenin uzunluğudur
  • (⌽⌊+): listeyi ters çevirin ve her bir konumda, her iki listeden en az sayıda alın (bu, içeri doğru artarsa ​​boşlukların boyutlarını verir)
  • (1+⌈/-+)⍣⍺⍺: listedeki her sayıyı listedeki en yüksek sayıdan çıkarın ve 1 ekleyin. Bunu yapın ⍺⍺. (Eğer ⍺⍺=0hiçbir şey olmazsa ve eğer ⍺⍺=1dışa doğru artarsa , bu boşlukların boyutlarını verecektir.)
  • -⌊⍺×: her boşluğu çarpın , aşağı doğru yuvarlayın ve olumsuzlayın.
  • ∊1,⍨1,¨: her boşluğun önüne 1, listenin en sonuna 1 ekleyin.
  • 0~⍨: sıfırları kaldırın.
  • ⍵\⍨: genişletmek için sonuç listesini kullanın . (Expand \her pozitif sayı için geçerli bir karakter taşıdığı bilinciyle, birçok alanlarda yerleştirilir birçok kez ve her negatif sayı için, o çoğaltılır: Aşağıdaki şekilde çalışır) 0ve ¯1neden tüm olan aynı şeyi yapmak sıfırlar daha önce kaldırılmalıydı.

1

MATL , 31 bayt

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

Girdiler şunlardır: string; 0veya 1içe veya dışa doğru arttırmak için; çarpanı.

Çevrimiçi deneyin!

açıklama

Giriş göz önünde 'INTERSTELLAR', 1, 0.5örnek olarak.

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

Raket 348 bayt

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

Test yapmak:

(f "INTERSTELLAR")

Çıktı:

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

1

PHP, 129 Bayt

@Titus tarafından 12 bayt kaydedildi Thank You

string = $ argv [1], oran = $ argv [2], yön = $ argv [3] içe doğru = 0, Dışarıya doğru = 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_pad4 bayt kaydetmelidir. Deneyin ++$i>$l?$l-$i/2:$i/2ve $t[$i++]/2döngü sonrası koşulda artış yerine; 9 biriktirmelidir. Neden 0^?
Titus

@Titus 0^3.12sonucu 3gerekli
Jörg Hülsermann

$i=0gereksizdir. ++$i>hala bir bayt kaydediyor $i++>=. Ve bu artışı ön koşula taşıyarak bir bayt daha kaydedebilirsiniz: ++$i<2*$l=...bunun yerine $i+1<2*$l=..., dış üçlüün doğru ve yanlış dallarını, $iyerine ++$ive $t[$i/2-.5]yerine değiştirin $t[$i++/2].
Titus

İçe 1ve dışa olarak tanımlamak 2, 3 bayt daha kaydetmenizi sağlayacaktır: ($l>>1)yerine (0^$l/2+1); ama bunların hiçbirini test etmedim.
Titus

@Titus bu daha büyük alanlara neden olur
Jörg Hülsermann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.