映画タイトルスタイルの文字列


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を使用して方向を指定したり、両方のパラメーターを1つに組み合わせたりすることもできます。ソリューションで。
ズカバーグ

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バイト

カリー化構文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'10.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バイト

@Titus Thank Youによって保存された12バイト

string = $ 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_pad4バイトを節約する必要があります。試してみてください++$i>$l?$l-$i/2:$i/2$t[$i++]/2の代わりに、ループ事後条件で増加。それは9を保存する必要があります。なぜ0^ですか?
タイタス

必要な@Titusの0^3.12結果3
ヨルクヒュルサーマン

$i=0不要です。 ++$i>それでも1バイトを節約し$i++>=ます。そして、その増分を前提条件に移動することで、もう1バイト節約できます。++$i<2*$l=...代わりに$i+1<2*$l=...、の$i代わりに++$iおよびの$t[$i/2-.5]代わりに、外側の3項のtrueおよびfalseブランチを交換します$t[$i++/2]
タイタス

内側の定義1と外側など2、他の3つのバイトを保存することができますする必要があります($l>>1)代わりに(0^$l/2+1)。しかし、私はこれらのいずれもテストしていません。
タイタス

@Titusこれにより、より大きなスペースが得られます
ヨルグヒュルサーマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.