电影标题样式字符串


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”,则最里面的两个空格的间距应相同 H E L L O
  • 可以根据需要解析方向和间隙乘数,例如,可以将-2用作“向内增加,乘数为2”,将1用作“向外增加,乘数为1”,等等。
  • 只需要使用空格,但是如果可以自定义字符填充,则是一个额外的好处。

参考动画

参考gif

打高尔夫球吧!


1
您好,欢迎来到PPCG!您可能想通过更改以下内容来使其更简单Increasing为来1 => Inward, 0 => Outward反之亦然。
NoOneIsHere

1
@NoOneIsHere谢谢!方向和比率解析非常灵活,按照规则3,您可以使用0,1来指定方向,甚至可以将两个参数组合为一个,例如+4表示4向,-0.5表示0.5向外,等等,只需要定义即可解决方案。
祖卡伯格'16

3
这是一个非常有趣的挑战!欢迎来到该网站。:)
DJMcMayhem

我不明白为什么将差距比2解释为向外增长,而1和0.5都向内增长。
xnor

@xnor哦,不要为混乱而后悔,方向与比率无关,方向和比率是单独的参数,2.0的向内看起来像:C..O....D......E........G......O....L..F
Zukaberg

Answers:


3

JavaScript(ES6),86 82 81 80字节

预期使用currying语法输入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~⍨:删除所有零。
  • ⍵\⍨:使用结果列表进行扩展。Expand(\)的工作方式如下:对于每个正数,当前字符将被复制多次,对于每个负数,将插入许多空格,0并且¯1请注意并执行相同的操作,这就是为什么所有零必须先删除。

1

MATL,31个字节

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

输入为:字符串;01向内或向外增加;乘数。

在线尝试!

说明

考虑输入'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保存了12个字节谢谢

字符串= $ argv [1],比率= $ argv [2],方向= $ argv [3]向内= 0,向外= 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/2and $t[$i++]/2代替增量;那应该节省9.为什么0^
泰特斯(Titus)

@Titus 0^3.12结果中3这是必要的
约克Hülsermann

$i=0是不必要的。 ++$i>仍然节省了一个字节$i++>=。你可以通过移动增量的先决条件保存多一个字节:++$i<2*$l=...不是$i+1<2*$l=...,交换外三元的真假分支,$i而不是++$i$t[$i/2-.5]代替$t[$i++/2]
泰特斯(Titus)

向内定义为1和向外的2,应使您能够再节省3个字节:($l>>1)代替(0^$l/2+1); 但我还没有测试过这些。
泰特斯(Titus)

@Titus这将导致更大的空间
约尔格Hülsermann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.