Big code… pour vous!

32

Lors de la scène d'ouverture de The Dark Knight se lève , il y a un dialogue plutôt maladroit entre un agent de la CIA et le méchant Bane.

Agent de la CIA: "Si je retire ce [masque], mourrez-vous?"

Bane: "Ce serait extrêmement douloureux ..."

Agent de la CIA: "Vous êtes un grand gars."

Bane: "... pour toi."

On ne sait pas si Bane a l'intention de dire «douloureux pour vous» ou «grand type pour vous». Réglons ce problème une fois pour toutes grâce au golf à code!

Défi

Votre tâche consiste à écrire un programme qui réorganise la boîte de dialogue ci-dessus en fonction d'un entier donné en entrée.

Les mots de dialogue avec les agents de la CIA sont: If I pull that off will you die? You're a big guy.

Les mots de dialogue de Bane sont: It would be extremely painful... for you!

S'il vous plaît noter que die?, You’re, painful...et you!sont considérés comme des mots simples.

  1. Étant donné un entier n en entrée, convertissez-le en binaire
  2. En lisant les chiffres binaires de gauche à droite, sortez le mot suivant du dialogue de l'agent CIA si le chiffre est 1, et le mot suivant du dialogue Bane si le chiffre est 0. Les mots doivent être séparés par un espace. Lorsque le haut-parleur change, ajoutez un saut de ligne. De plus, préfixez chaque ligne de dialogue avec le nom du locuteur ( BANE:ou CIA:).

Vous pouvez supposer que l'entrée commence toujours par un 1 sous forme binaire et comporte 12 uns et 7 zéros.

Exemple

522300

  1. Converti en binaire: 1111111100000111100

  2. Le nombre commence par 8 uns, nous sortons donc les 8 premiers mots du dialogue d'agent de la CIA et les préfixons avec la CIA: CIA: If I pull that off will you die?

  3. Ensuite, nous avons obtenu 5 zéros, nous obtenons donc les 5 premiers mots du dialogue de Bane: BANE: It would be extremely painful...

  4. Ensuite, il y en a 4, donc nous sortons les 4 prochains mots CIA: CIA: You’re a big guy.

  5. Puis 2 zéros: BANE: for you!

Résultat final:

CIA: If I pull that off will you die?
BANE: It would be extremely painful...
CIA: You’re a big guy.
BANE: for you!

Plus de cas de test:

494542

CIA: If I pull that
BANE: It would be
CIA: off
BANE: extremely
CIA: will you die? You're
BANE: painful... for
CIA: a big guy.
BANE: you!

326711

CIA: If
BANE: It would
CIA: I pull that off will you
BANE: be extremely painful... for
CIA: die? You're
BANE: you!
CIA: a big guy.
Arnaud
la source
Chaque ligne peut-elle se terminer dans un espace?
xnor
@xnor Oui, ça va.
Arnaud
"ça" et "ça" comme premier mot du discours de Bane ne s'alignent pas dans les cas de test / citation
MildlyMilquetoast
@Mistah corrigé sur "ça", merci!
Arnaud
3
Est-ce juste moi ou quelqu'un qui a lu le dialogue dans la voix de Bane.
Gurupad Mamadapur

Réponses:

10

Pyth - 138 octets

Je devrais regarder dans la compression du script du film.

K_cc"guy big a You're die? you will off that pull I If you! for painful... extremely be would That"d12jmj;++@c"BANECIA"4ed\:m.)@Kedhdr8jQ2

Suite de test .

Maltysen
la source
7

JavaScript (ES6), 203 201 octets

Edit: économisé 2 octets en empruntant sans vergogne l' trim()idée de la réponse ETHproductions

n=>"If I pull that off will you die? You're a big guy. It would be extremely painful... for you!".split` `.map((_,i,a)=>[`
BANE: `,`
CIA: `,' '][j^(j=n>>18-i&1)?j:2]+a[k[j]++],k=[j=12,0]).join``.trim()

Cas de test

Arnauld
la source
7

JavaScript (ES6), 209 202 201 octets

(n,a="It would be extremely painful... for you! If I pull that off will you die? You're a big guy.".split` `,b=[6,18])=>(F=(s,p=n%2)=>n?F((p^(n>>=1)%2?p?`
CIA: `:`
BANE: `:` `)+a[b[p]--]+s):s.trim())``

Ancienne approche:

(n,a="If I pull that off will you die? You're a big guy. It would be extremely painful... for you!".split` `,b=[12,0])=>(F=p=>p^n%2?F(n%2)+(p?`
CIA:`:`
BANE:`):n?F(p,n>>=1)+" "+a[b[p]++]:``)(n%2).trim()

Extrait de test

f=(n,a="It would be extremely painful... for you! If I pull that off will you die? You're a big guy.".split` `,b=[6,18])=>(F=(s,p=n%2)=>n?F((p^(n>>=1)%2?p?`
CIA: `:`
BANE: `:` `)+a[b[p]--]+s):s.trim())``

console.log(f(522300))
console.log(f(494542))
console.log(f(326711))

ETHproductions
la source
J'emprunte sans vergogne votre trim()idée. J'étais sûr qu'il y avait quelque chose de mieux que slice(1)mais je ne pouvais pas le comprendre.
Arnauld
@Arnauld Très bien avec moi, maintenant nous sommes tous attachés. Je parie qu'il y a un moyen de le faire en moins de 200 :-)
ETHproductions
6

C ++ 11 (GCC), 298 293 octets

#include<sstream>
[](int i){std::stringstream b("It would be extremely painful... for you!"),c("If I pull that off will you die? You're a big guy.");std::string s,w;int n=0,t=i,p;while(t/=2)n++;for(;n>=0;p=t)((t=i>>n&1)?c:b)>>w,s+=p^t?t?"CIA: ":"BANE: ":" ",s+=t^(i>>--n)&1?w+"\n":w;return s;}

Une fonction lambda qui prend un entier et renvoie le dialogue sous la forme d'un std::string. Vous pouvez le voir en action ici .

Version non golfée (avec quelques explications):

#include<sstream>

[](int i) {
    std::stringstream bane("It would be extremely painful... for you!"),
                      cia("If I pull that off will you die? You're a big guy.");
    std::string s, w;
    int n = 0, t = i, p;
    // Find the position of the most significant bit (n)
    while (t/=2) n++;

    for (; n>=0; p=t) {
        t = i>>n&1; // Current bit
        // Append the speaker name if the previous bit was different
        if (t != p) s += (t ? "CIA: " : "BANE: ");
        else s += " ";

        // Read the next word from one of the streams
        if (t) cia >> w;
        else bane >> w;

        s += w;

        if (t != ((i>>--n)&1)) // Append a newline if the next bit is different
            s += "\n";
    }

    return s;
}
vaultah
la source
4

JavaScript (ES6), 252 227 226 octets

n=>[...n.toString(2,b="If I pull that off will you die? You're a big guy.".split` `,c="It would be extremely painful... for you!".split` `)].map((a,i,j)=>(a!=j[i-1]?+a?i?`
CIA: `:`CIA: `:`
BANE: `:``)+(+a?b:c).shift()).join` `

Usage

f=n=>[...n.toString(2,b="If I pull that off will you die? You're a big guy.".split` `,c="It would be extremely painful... for you!".split` `)].map((a,i,j)=>(a!=j[i-1]?+a?i?`
CIA: `:`CIA: `:`
BANE: `:``)+(+a?b:c).shift()).join` `
f(522300)

Remarques

C'est le golf en cours, je pense que je peux encore raser certains octets, mais n'hésitez pas à laisser des suggestions dans les commentaires.

Luke
la source
4

Python 3.6, 232 octets

from itertools import*
c="you! for painful... extremely be would It".split(),"guy. big a You're die? you will off that pull I If".split()
for n,r in groupby(f'{int(input()):b}',int):
 print("BCAINAE::"[n::2],*[c[n].pop()for _ in r])

Modifier , de manière équivalente:

from itertools import*
c="It would be extremely painful... for you!".split(),"_ If I pull that off will you die? You're a big guy.".split()
for n,r in groupby(map(int,f'{int(input()):b}')):
 print("BCAINAE::"[n::2],*map(c[n].pop,r))
Orez
la source
3

Japt, 121 octets

A=[`It Ùd ¼ extÚ+ pafª... f y!`¸`If I pªl È     f Øi y ¹e? Y' a big guy.`¸]¢®^T?["
BANE:""
CIA:"]gT=Z :P +S+AgZ vÃx

Contient de nombreux éléments non imprimables, vous feriez donc mieux de le tester en ligne .

ETHproductions
la source
2

Perl 6 , 211 octets

{.put for map |*,zip map {.[0]X .[1].rotor: .[2..*]},zip <CIA: BANE:>,(<If I pull that off will you die? You're a big guy.>,<It would be extremely painful... for you!>),|(.base(2)~~m:g/(.)$0*/)».chars.rotor(2)}
smls
la source
2

C #, 398 390 385 396 389 octets

class P{static void Main(string[] a){string s="2"+System.Convert.ToString(int.Parse(a[0]),2),e="CIA: ",r="BANE: ",o="";int k=0,l=0,i=1;string[] c="If I pull that off will you die? You're a big guy.".Split(' '),b="It would be extremely painful... for you!".Split(' ');for(;i<s.Length;i++)o+=(s[i-1]==s[i]?" ":(i<2?"":"\n")+(s[i]>'0'?e:r))+(s[i]>'0'?c[k++]:b[l++]);System.Console.Write(o);}}

Lancer avec le numéro d'entrée comme paramètre.

Ungolfed:

class P
{
    static void Main(string[] a)
    {
        string s = "2" + System.Convert.ToString(int.Parse(a[0]), 2), e = "CIA: ", r = "BANE: ", o = "";
        int k = 0, l = 0, i = 1;

        string[] c = "If I pull that off will you die? You're a big guy.".Split(' '), b = "It would be extremely painful... for you!".Split(' ');
        for (; i < s.Length; i++)
            o += (s[i - 1] == s[i] ? " " : (i<2?"":"\n") + (s[i] > '0' ? e : r))
                + (s[i] > '0' ? c[k++] : b[l++]);
        System.Console.Write(o); 
    }
}

Retour à 396 octets car je n'ai pas remarqué de règle "pas de nouvelle ligne au début".

Mr Scapegrace
la source
Malheureusement, s.Replace("1",c[k++]).Replace("0",b[l++])ne remplace pas par des mots correspondants. Il semble que C # remplace la chaîne une fois et la claque par endroits.
Mr Scapegrace
2

Ruby, 204 + 1 = 205 octets

Nécessite le -ndrapeau.

d=[%w"It would be extremely painful... for you!",%w"If I pull that off will you die? You're a big guy."]
n=%w"BANE CIA"
("%b"%$_).scan(/((.)\2*)/).map{|i,b|puts n[k=b.to_i]+': '+d[k].slice!(0,i.size)*' '}
Valeur d'encre
la source
2

PHP, 198 octets

while($i++<19)echo($t-$s=1&$argv[1]>>19-$i)?"
"[$i<2].($s?CIA:BANE).": ":" ",explode(0,"It0would0be0extremely0painful...0for0you!0If0I0pull0that0off0will0you0die?0You're0a0big0guy.")[$$s+++7*$t=$s];
user63956
la source
1

Perl, 205 octets

@t=([qw/It would be extremely painful... for you!/],[qw/If I pull that off will you die? You're a big guy./]);$_=sprintf'%b',$0;print$n?'BANE':'CIA',": @{[splice$t[$n=1-$n],0,length$&]}"while s/(.)\1*//;

Mettez cela dans un fichier nommé 494542 et exécutez comme ceci:

perl -lX 494542

Testé sur perl v5.22

Kjetil S.
la source
1

Clojure, 401 octets

(require '[clojure.string :as s])(defn f[n](let[c(map #(-(int %) 48)(Integer/toString n 2))p[(s/split"It would be extremely painful... for you!"#" ")(s/split"If I pull that off will you die? You're a big guy."#" ")]a["BANE" "CIA"]](loop[i[0 0] g"" d c q 2](if(<(count d)1)g(let[b(first d)j(i b)](recur(assoc i b (inc j))(str g(if(= b q)" "(str(when(not= 2 q)"\n")(a b)": "))((p b) j))(rest d) b))))))

Invocation:

(f 522300)

Ungolfed

(require '[clojure.string :as s])
(defn dialogue[num]
    (let [dacode (map #(- (int %) 48) (Integer/toString num 2))
          phrases [(s/split"It would be extremely painful... for you!"#" ")(s/split"If I pull that off will you die? You're a big guy."#" ")]
      actors ["BANE" "CIA"]]
      (loop [idxs [0 0] finaldial "" code dacode prevbit 2]
        (if (< (count code) 1) finaldial
            (let [bit (first code) idx (idxs bit)]
              (recur (assoc idxs bit (inc idx)) (str finaldial (if (= bit prevbit) " " (str (when (not= 2 prevbit) "\n") (actors bit) ": ")) ((phrases bit) idx)) (rest code) bit))))))
Attilio
la source