영화 제목 스타일 문자열


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을 '승수의 승수로 증가함에 따라'등으로 사용할 수 있습니다.
  • 공백 만 사용하면되지만 문자 채우기를 사용자 지정할 수있는 경우에는 보너스입니다.

참조 애니메이션

참조 gif

즐거운 골프 되세요!


1
안녕하세요, PPCG에 오신 것을 환영합니다! 로 변경 하거나 그 반대로 변경 Increasing하여 조금 더 간단하게 만들 수 있습니다 1 => Inward, 0 => Outward.
NoOneIsHereHere

1
@NoOneIsHere 감사합니다! 방향 및 비율 구문 분석은 유연합니다. 규칙 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

자바 스크립트 (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을 제거하십시오.
  • ⍵\⍨: 결과 목록을 사용하여 확장하십시오 . (확장 \각 양수에 대해, 현재의 문자가 그주의에 많은 공간이 삽입되어 여러 번, 각 음수에 대한 것을 것을 복제 : 다음과 같은 방식으로 작동) 0¯1왜 모든 인 같은 일을 0은 이전에 제거해야했습니다.

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

언 골프 드 :

(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_pad4 바이트를 저장해야합니다. 시도 ++$i>$l?$l-$i/2:$i/2하고 $t[$i++]/2대신 루프 후 조건에 증가의; 9를 저장해야합니다. 왜 그렇 0^습니까?
Titus

@Titus 가 필요한 0^3.12결과3
Jörg Hülsermann

$i=0불필요합니다. ++$i>여전히 1 바이트 이상을 저장 $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 공간이 더 커질 것입니다
Jörg Hülsermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.