Kode besar ... untuk Anda!

32

Pada adegan pembukaan Dark Knight naik , ada dialog yang agak canggung antara agen CIA dan penjahat Bane.

Agen CIA: "Jika saya melepas [topeng] itu, apakah Anda akan mati?"

Bane: "Akan sangat menyakitkan ..."

Agen CIA: "Anda pria besar."

Bane: "... untukmu."

Tidak pasti apakah Bane bermaksud mengatakan "menyakitkan untukmu" atau "pria besar untukmu". Mari kita selesaikan masalah ini sekali untuk semua melalui golf kode!

Tantangan

Tugas Anda adalah menulis sebuah program yang menata ulang dialog di atas tergantung pada bilangan bulat yang diberikan sebagai input.

Kata-kata dialog agen CIA adalah: If I pull that off will you die? You're a big guy.

Kata-kata dialog Bane adalah: It would be extremely painful... for you!

Harap dicatat bahwa die?, You’re, painful...dan you!dianggap sebagai satu kata.

  1. Diberikan integer n sebagai input, konversikan ke biner
  2. Membaca digit biner dari kiri ke kanan, menampilkan kata berikutnya dari dialog agen CIA jika digitnya 1, dan kata berikutnya dari dialog Bane jika digitnya 0. Kata-kata harus dipisahkan oleh spasi. Ketika pembicara berubah, tambahkan umpan baris. Juga, awali setiap baris dialog dengan nama pembicara ( BANE:atau CIA:).

Anda dapat mengasumsikan bahwa input selalu dimulai dengan 1 dalam bentuk biner, dan memiliki 12 angka dan 7 angka nol.

Contoh

522300

  1. Dikonversi ke biner: 1111111100000111100

  2. Angka dimulai dengan 8 yang, jadi kami mengeluarkan 8 kata pertama dari dialog agen CIA, dan awali dengan CIA: CIA: If I pull that off will you die?

  3. Lalu kami mendapat 5 nol, jadi kami mendapatkan 5 kata pertama dari dialog Bane: BANE: It would be extremely painful...

  4. Lalu ada 4 yang, jadi kami mengeluarkan 4 kata CIA berikutnya: CIA: You’re a big guy.

  5. Lalu 2 nol: BANE: for you!

Hasil akhir:

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

Lebih banyak kasus uji:

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
sumber
Bisakah setiap baris diakhiri dengan spasi?
xnor
@xnor Ya, tidak apa-apa.
Arnaud
"itu" dan "itu" sebagai kata pertama dari pidato Bane jangan berbaris dalam test case / quote
MildlyMilquetoast
@Mistah memperbaiki "it", terima kasih!
Arnaud
3
Apakah hanya saya atau seseorang yang membaca dialog dengan suara bane.
Gurupad Mamadapur

Jawaban:

10

Pyth - 138 byte

Saya harus melihat ke dalam mengompresi naskah 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

Test Suite .

Maltysen
sumber
7

JavaScript (ES6), 203 201 byte

Sunting: menyimpan 2 byte dengan meminjam trim()ide dari ETHproduk tanpa malu-malu

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

Uji kasus

Arnauld
sumber
7

JavaScript (ES6), 209 202 201 byte

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

Pendekatan lama:

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

Cuplikan tes

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

Produksi ETH
sumber
Saya meminjam trim()ide Anda tanpa malu-malu . Saya yakin ada sesuatu yang lebih baik daripada slice(1)tetapi tidak bisa mengetahuinya.
Arnauld
@Arnauld Baik-baik saja dengan saya, sekarang kita semua diikat. Saya yakin ada cara untuk melakukannya di bawah 200 :-)
ETHproduksi
6

C ++ 11 (GCC), 298 293 byte

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

Fungsi lambda yang mengambil integer dan mengembalikan dialog sebagai a std::string. Anda dapat melihatnya beraksi di sini .

Versi tidak dikoleksi (dengan beberapa penjelasan):

#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;
}
kubah
sumber
4

JavaScript (ES6), 252 227 226 byte

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

Pemakaian

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)

Catatan

Ini golf-in-progress, saya pikir saya masih bisa memotong beberapa byte, tetapi jangan ragu untuk meninggalkan saran di komentar.

Luke
sumber
4

Python 3.6, 232 byte

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

Edit , setara:

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

Japt, 121 byte

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

Berisi banyak unsintables, jadi sebaiknya Anda mengujinya secara daring .

Produksi ETH
sumber
2

Perl 6 , 211 byte

{.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)}
seseorang
sumber
2

C #, 398 390 385 396 389 byte

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

Luncurkan dengan nomor input sebagai parameter.

Tidak Disatukan:

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

Kembali ke 396 byte karena saya tidak melihat aturan "tidak ada baris baru di awal".

Tuan Scapegrace
sumber
Sayangnya, s.Replace("1",c[k++]).Replace("0",b[l++])tidak diganti dengan kata-kata yang sesuai. Sepertinya, C # akan mengganti string sekali dan menamparnya di tempat.
Tuan Scapegrace
2

Ruby, 204 + 1 = 205 byte

Membutuhkan -nbendera.

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)*' '}
Nilai Tinta
sumber
2

PHP, 198 byte

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];
pengguna63956
sumber
1

Perl, 205 byte

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

Masukkan itu ke dalam file bernama 494542 dan jalankan seperti ini:

perl -lX 494542

Diuji pada perl v5.22

Kjetil S.
sumber
1

Clojure, 401 byte

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

Doa:

(f 522300)

Tidak disatukan

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