ชื่อเรื่องสตริงรูปแบบภาพยนตร์


19

ท้าทาย

เคยเห็นตัวอย่างภาพยนตร์ (เช่น Martian, Interstellar และอื่น ๆ ) ที่พวกเขามีช่องว่างขนาดใหญ่อยู่ระหว่างตัวอักษรที่กระจายออกไปอย่างช้าๆ?

ความท้าทายคือการสร้างเอฟเฟกต์นี้ใหม่โดยใช้สตริงตัวคูณช่องว่างและทิศทางโดยใส่จำนวนช่องว่างที่เหมาะสมระหว่างตัวอักษร

ตัวอย่าง

อินพุต : '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,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
@ NoOneIs ขอขอบคุณ! การแยกทิศทางและอัตราส่วนมีความยืดหยุ่นตามกฎ 3 คุณสามารถใช้ 0,1 เพื่อระบุทิศทางหรือรวมทั้งพารามิเตอร์เข้าด้วยกันเช่น +4 สำหรับ 4 เข้าด้านใน, -0.5 สำหรับ 0.5 ออกไปด้านนอกเป็นต้นเพียงแค่ต้องกำหนด ด้วยการแก้ปัญหา
Zukaberg

3
นี่เป็นความท้าทายที่น่าสนใจมาก! ยินดีต้อนรับสู่เว็บไซต์ :)
DJMcMayhem

ฉันไม่เห็นว่าทำไมอัตราส่วนช่องว่างของ 2 ถูกตีความว่าเป็นการเติบโตออกไปด้านนอกในขณะที่ 1 และ 0.5 ทั้งสองเติบโตขึ้นภายใน
xnor

@ xnor ไม่ต้องขอโทษด้วยความสับสนทิศทางไม่มีอะไรเกี่ยวข้องกับอัตราส่วนทิศทางและอัตราส่วนเป็นพารามิเตอร์ที่แยกจากกันขาเข้า 2.0 จะมีลักษณะดังนี้:C..O....D......E........G......O....L..F
Zukaberg

คำตอบ:


3

JavaScript (ES6), 86 82 81 80 ไบต์

อินพุตคาดว่าจะอยู่ในรูปแบบ currying f(s)(r)โดยมี:

  • s = string
  • 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~⍨: ลบศูนย์ใด ๆ
  • ⍵\⍨: ใช้รายการผลลัพธ์ที่จะขยาย Expand ( \) ทำงานในลักษณะดังต่อไปนี้: สำหรับจำนวนบวกแต่ละตัวอักขระปัจจุบันจะถูกจำลองแบบหลายครั้งและสำหรับจำนวนลบแต่ละตัวที่มีช่องว่างจำนวนมากแทรกอยู่โดยมีข้อแม้นั้น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))))

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

การทดสอบ:

(f "INTERSTELLAR")

เอาท์พุท:

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

1

PHP, 129 ไบต์

บันทึก 12 ไบต์โดย @Titus Thank You

string = $ argv [1], ratio = $ argv [2], direction = $ argv [3] ขาเข้า = 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_padควรบันทึก 4 ไบต์ ลอง++$i>$l?$l-$i/2:$i/2และ$t[$i++]/2แทนที่จะเพิ่มขึ้นในวงหลังเงื่อนไข; ที่ควรบันทึก 9. ทำไม0^?
ติตัส

@ 0^3.12ผลลัพธ์เรื่องย่อ3ซึ่งจำเป็น
JörgHülsermann

$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 สิ่งนี้จะส่งผลให้มีพื้นที่มากขึ้น
JörgHülsermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.