Gran código ... para ti!

32

En la escena de apertura del Dark Knight se levanta , hay un diálogo bastante incómodo entre un agente de la CIA y el villano Bane.

Agente de la CIA: "Si me quito esa [máscara], ¿morirás?"

Bane: "Sería extremadamente doloroso ..."

Agente de la CIA: "Eres un gran tipo".

Bane: "... para ti".

No está seguro si Bane tiene la intención de decir "doloroso para ti" o "tipo grande para ti". ¡Resolvamos este problema de una vez por todas a través del golf de código!

Reto

Su tarea es escribir un programa que reordena el diálogo anterior dependiendo de un entero dado como entrada.

Las palabras de diálogo del agente de la CIA son: If I pull that off will you die? You're a big guy.

Las palabras de diálogo de Bane son: It would be extremely painful... for you!

Tenga en cuenta que die?, You’re, painful...y you!son considerados como una sola palabra.

  1. Dado un entero n como entrada, conviértalo a binario
  2. Al leer los dígitos binarios de izquierda a derecha, emite la siguiente palabra del diálogo del agente de la CIA si el dígito es 1, y la siguiente palabra del diálogo Bane si el dígito es 0. Las palabras deben estar separadas por un espacio. Cuando cambie el altavoz, agregue un salto de línea. Además, prefija cada línea de diálogo con el nombre del hablante ( BANE:o CIA:).

Puede suponer que la entrada siempre comienza con un 1 en forma binaria, y tiene 12 unos y 7 ceros.

Ejemplo

522300

  1. Convertido a binario: 1111111100000111100

  2. El número comienza con 8 unos, por lo que sacamos las 8 primeras palabras del diálogo de agentes de la CIA y las prefijamos con CIA: CIA: If I pull that off will you die?

  3. Luego obtuvimos 5 ceros, así que obtenemos las 5 primeras palabras del diálogo de Bane: BANE: It would be extremely painful...

  4. Luego hay 4 unos, así que sacamos las 4 siguientes palabras de la CIA: CIA: You’re a big guy.

  5. Luego 2 ceros: BANE: for you!

Resultado 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!

Más casos de prueba:

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
fuente
¿Puede cada línea terminar en un espacio?
xnor
@xnor Sí, está bien.
Arnaud
"eso" y "eso" como primera palabra del discurso de Bane no se alinean en los casos de prueba / cita
MildlyMilquetoast
@Mistah arreglado a "eso", gracias!
Arnaud
3
¿Soy yo o alguien que lee el diálogo con la voz de Bane?
Gurupad Mamadapur

Respuestas:

10

Pyth - 138 bytes

Debería considerar comprimir el guión de la película.

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

Test Suite .

Maltysen
fuente
7

JavaScript (ES6), 203 201 bytes

Editar: ahorró 2 bytes al tomar prestada descaradamente la trim()idea de la respuesta de 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()

Casos de prueba

Arnauld
fuente
7

JavaScript (ES6), 209 202 201 bytes

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

Viejo enfoque:

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

Fragmento de prueba

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

ETHproducciones
fuente
Presto descaradamente tu trim()idea. Estaba seguro de que había algo mejor que slice(1)eso, pero no pude resolverlo.
Arnauld
@Arnauld Bien conmigo, ahora estamos todos atados. Apuesto a que hay una manera de hacerlo en menos de 200 :-)
ETHproductions
6

C ++ 11 (GCC), 298293 bytes

#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;}

Una función lambda que toma un número entero y devuelve el diálogo como a std::string. Puedes verlo en acción aquí .

Versión sin golf (con alguna explicación):

#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
fuente
4

JavaScript (ES6), 252 227 226 bytes

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

Uso

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)

Notas

Esto es un juego de golf en curso, creo que todavía puedo eliminar algunos bytes, pero siéntase libre de dejar sugerencias en los comentarios.

Luke
fuente
4

Python 3.6, 232 bytes

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

Editar , equivalentemente:

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
fuente
3

Japt, 121 bytes

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

Contiene muchos elementos no imprimibles, por lo que sería mejor probarlo en línea .

ETHproducciones
fuente
2

Perl 6 , 211 bytes

{.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
fuente
2

C #, 398 390 385 396 389 bytes

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

Lanzamiento con número de entrada como parámetro.

Sin golf:

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

Regreso a 396 bytes porque no noté la regla "no hay nueva línea al principio".

Mr Scapegrace
fuente
Lamentablemente, s.Replace("1",c[k++]).Replace("0",b[l++])no se reemplaza con las palabras correspondientes. Parece que C # reemplaza la cadena una vez y la golpea en algunos lugares.
Mr Scapegrace
2

Rubí, 204 + 1 = 205 bytes

Requiere la -nbandera.

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)*' '}
Tinta de valor
fuente
2

PHP, 198 bytes

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];
usuario63956
fuente
1

Perl, 205 bytes

@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*//;

Ponga eso en un archivo llamado 494542 y ejecútelo así:

perl -lX 494542

Probado en perl v5.22

Kjetil S.
fuente
1

Clojure, 401 bytes

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

Invocación:

(f 522300)

Sin golf

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