Titre du film: chaîne de style

19

Défi

Avez-vous déjà vu ces titres de bandes-annonces de films (à savoir Martian, Interstellar, etc.) où ils ont d'énormes espaces entre les lettres qui s'étalent lentement?

Le défi consiste à recréer cet effet en fonction d'une chaîne, d'un multiplicateur d'écart et d'une direction, en insérant une quantité appropriée d'espaces entre les lettres.

Exemple

Entrée : 'INTERSTELLAR', Multiplicateur d'écart: 1.0, Direction: Augmentation vers l'intérieur

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

L'espacement est: [1, 2, 3, ..., 3, 2, 1]; remplacer les espaces par '.' pour mieux démontrer l'espacement:

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

Entrée : 'INTERSTELLAIRE', Multiplicateur d'espacement: 0,5, Direction: Augmentant vers l'intérieur

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

L'espacement est multiplié par 0,5, donc nous obtenons [0, 1, 1, 2, ... 2, 1, 1, 0] de la division entière; en utilisant '.':

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

Entrée : 'CODEGOLF', Multiplicateur d'écart: 2.0, Direction: Augmentation vers l'extérieur

Output: C        O      D    E  G    O      L        F

L'espacement est multiplié par 2, augmentant vers l'extérieur, donc nous obtenons [8,6,4,2,4,6,8]; remplacer par «.»:

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

Entrée : 'CODEGOLF', Multiplicateur d'écart: 0,4, Direction: Augmentation vers l'extérieur

Output: C O DEGO L F

L'espacement est multiplié par 0,4, augmentant vers l'extérieur, donc nous obtenons [1,1,0,0,0,1,1]; remplacer par «.»:

C.O.DEGO.L.F

Règles

  • Prend 3 entrées: chaîne, multiplicateur d'écart et direction
  • Si la chaîne d'entrée est de longueur impaire (même en nombre d'espaces), par exemple 'BONJOUR', l'espacement des 2 espaces les plus intérieurs doit être le même H E L L O
  • Le multiplicateur de direction et d'écart peut être analysé comme vous le souhaitez, par exemple, vous pouvez utiliser -2 pour «augmenter vers l'intérieur avec un multiplicateur de 2», 1 pour «augmenter vers l'extérieur avec un multiplicateur de 1», etc.
  • Il n'est nécessaire d'utiliser des espaces, mais c'est un bonus si le remplissage du personnage est personnalisable.

Animation de référence

gif de référence

Amusez-vous au golf!

Zukaberg
la source
1
Bonjour et bienvenue chez PPCG! Vous voudrez peut-être rendre cela un peu plus simple en passant Increasingà 1 => Inward, 0 => Outwardou vice versa.
NoOneIsHere
1
@NoOneIsHere Merci! L'analyse de direction et de rapport est flexible, selon la règle 3, vous pouvez utiliser 0,1 pour spécifier la direction ou même combiner les deux paramètres en un, comme +4 pour 4 vers l'intérieur, -0,5 pour 0,5 vers l'extérieur, etc., il suffit de le définir avec la solution.
Zukaberg
3
C'est un défi très intéressant! Bienvenue sur le site. :)
DJMcMayhem
Je ne vois pas pourquoi un ratio d'écart de 2 est interprété comme une croissance vers l'extérieur, tandis que 1 et 0,5 augmentent tous deux vers l'intérieur.
xnor
@xnor oh non désolé pour la confusion, la direction n'a rien à voir avec le rapport, la direction et le rapport sont des paramètres distincts, un 2.0 vers l'intérieur ressemblerait à C..O....D......E........G......O....L..F
ceci

Réponses:

3

JavaScript (ES6), 86 82 81 80 octets

Une entrée est attendue dans la syntaxe de curry f(s)(r), avec:

  • s = chaîne
  • r = ratio + direction: un flotteur négatif pour vers l'intérieur ou un flotteur positif pour vers l'extérieur

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

Arnauld
la source
2

05AB1E , 33 octets

Utilise l' encodage CP-1252 .

Le multiplicateur d'écart est considéré comme négatif lorsqu'il augmente vers l'extérieur.

g;>Î.S<_²**ÄU¹vyð²¹g<;N.S*X+DUï×J

Essayez-le en ligne!

Emigna
la source
1

APL, 40 octets

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

Cela prend la chaîne comme argument de droite, le rapport comme argument de gauche et la direction comme opérande de gauche (0 pour vers l'intérieur et 1 pour vers l'extérieur).

      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

Explication:

  • ⍳⍴1↓⍵: obtenir une liste de nombres de 1 à N-1, où N est la longueur de la chaîne
  • (⌽⌊+): inverser la liste, et à chaque position, obtenir le plus petit nombre des deux listes (cela donne la taille des espaces si elle augmente vers l'intérieur)
  • (1+⌈/-+)⍣⍺⍺: soustrayez chaque nombre de la liste du nombre le plus élevé de la liste et ajoutez 1. Effectuez cette opération plusieurs ⍺⍺fois. (Si ⍺⍺=0, rien ne se passera, et si ⍺⍺=1, cela donnera la taille des écarts si elle augmente vers l'extérieur.)
  • -⌊⍺×: multipliez chaque espace par , arrondissez-le vers le bas et annulez-le.
  • ∊1,⍨1,¨: ajoutez un 1 devant chaque espace et un 1 à la fin de la liste.
  • 0~⍨: supprime les zéros.
  • ⍵\⍨: utilisez la liste résultante pour développer . Expand ( \) fonctionne de la manière suivante: pour chaque nombre positif, le caractère actuel est répliqué autant de fois, et pour chaque nombre négatif, que de nombreux espaces sont insérés, avec la mise en garde que 0et ¯1faire la même chose, c'est pourquoi tous les les zéros ont dû être supprimés plus tôt.
marinus
la source
1

MATL , 31 octets

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

Les entrées sont: chaîne; 0ou1 pour augmenter vers l'intérieur ou vers l'extérieur; multiplicateur.

Essayez-le en ligne!

Explication

Tenez compte des entrées 'INTERSTELLAR', 1, à 0.5titre d'exemple.

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
Luis Mendo
la source
1

Raquette 348 octets

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

Non golfé:

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

Essai:

(f "INTERSTELLAR")

Production:

"I N  T   E    R     S      T     E    L   L  A R"
rnso
la source
1

PHP, 129 octets

12 octets enregistrés par @Titus Merci

chaîne = $ argv [1], ratio = $ argv [2], direction = $ argv [3] vers l'intérieur = 0, vers l'extérieur = 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];
Jörg Hülsermann
la source
str_paddevrait économiser 4 octets. Essayez ++$i>$l?$l-$i/2:$i/2et $t[$i++]/2au lieu d'incrémenter en boucle post-condition; cela devrait sauver 9. Pourquoi 0^?
Titus
0^3.12Résultat @Titus 3qui est nécessaire
Jörg Hülsermann
$i=0est inutile. ++$i>enregistre toujours un octet de plus $i++>=. Et vous pouvez enregistrer un octet de plus en déplaçant cet incrément vers la condition préalable: ++$i<2*$l=...au lieu de $i+1<2*$l=..., permutez les vraies et les fausses branches du ternaire externe, $iau lieu de ++$iet $t[$i/2-.5]au lieu de $t[$i++/2].
Titus
Définir vers l'intérieur comme 1vers l'extérieur comme 2devrait vous permettre d'économiser 3 autres octets: ($l>>1)au lieu de (0^$l/2+1); mais je n'ai testé aucun de ceux-ci.
Titus
@Titus, cela se traduira par de plus grands espaces
Jörg Hülsermann