Mã lớn cho bạn!


32

Tại cảnh mở màn của Hiệp sĩ bóng đêm trỗi dậy , có một cuộc đối thoại khá khó xử giữa một nhân viên CIA và nhân vật phản diện Bane.

Nhân viên CIA: xông vào Nếu tôi rút [mặt nạ] ra, bạn sẽ chết chứ?

Tai ương: sẽ cực kỳ đau

Đại lý CIA: Bạn là một người đàn ông lớn.

Tai ương: cho bạn.

Thật không chắc chắn nếu Bane có ý định nói về nỗi đau cho bạn Hãy giải quyết vấn đề này một lần cho tất cả thông qua chơi golf mã!

Thử thách

Nhiệm vụ của bạn là viết một chương trình sắp xếp lại đoạn hội thoại trên tùy thuộc vào một số nguyên được đưa ra làm đầu vào.

Các từ đối thoại của nhân viên CIA là: If I pull that off will you die? You're a big guy.

Những lời đối thoại của Bane là: It would be extremely painful... for you!

Xin lưu ý rằng die?, You’re, painful...you!được coi là những từ đơn lẻ.

  1. Cho một số nguyên n làm đầu vào, chuyển đổi nó thành nhị phân
  2. Đọc các chữ số nhị phân từ trái sang phải, xuất từ ​​tiếp theo từ đối thoại tác nhân CIA nếu chữ số đó 1và từ tiếp theo từ đối thoại Bane nếu chữ số là 0. Các từ nên được phân cách bằng một khoảng trắng. Khi loa thay đổi, thêm một nguồn cấp dữ liệu. Ngoài ra, tiền tố mỗi dòng đối thoại với tên người nói ( BANE:hoặc CIA:).

Bạn có thể giả sử rằng đầu vào luôn bắt đầu bằng 1 ở dạng nhị phân và có 12 số và 7 số không.

Thí dụ

522300

  1. Chuyển đổi thành nhị phân: 1111111100000111100

  2. Số bắt đầu bằng 8 từ, vì vậy chúng tôi xuất ra 8 từ đầu tiên từ đối thoại đại lý của CIA và tiền tố chúng bằng CIA: CIA: If I pull that off will you die?

  3. Sau đó, chúng tôi nhận được 5 số không, vì vậy chúng tôi nhận được 5 từ đầu tiên từ cuộc đối thoại của Bane: BANE: It would be extremely painful...

  4. Sau đó, có 4 từ, vì vậy chúng tôi xuất ra 4 từ CIA tiếp theo: CIA: You’re a big guy.

  5. Sau đó, 2 số không: BANE: for you!

Kết quả cuối cùng:

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

Nhiều trường hợp thử nghiệm:

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.

Mỗi dòng có thể kết thúc trong một không gian?
xnor

@xnor Vâng, không sao đâu.
Arnaud

"cái đó" và "nó" là từ đầu tiên trong bài phát biểu của Bane không xếp hàng trong các trường hợp / trích dẫn thử nghiệm
MildlyMilquetoast

@Mistah đã sửa thành "nó", cảm ơn!
Arnaud

3
Có phải chỉ tôi hoặc ai đó đọc đoạn hội thoại bằng giọng nói của Bane.
Gurupad Mamadapur

Câu trả lời:


10

Pyth - 138 byte

Tôi nên xem xét việc nén kịch bản phim.

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

Phòng thử nghiệm .


7

JavaScript (ES6), 203 201 byte

Chỉnh sửa: đã lưu 2 byte bằng cách mượn trim()ý tưởng từ câu trả lời 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()

Các trường hợp thử nghiệm


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

Cách tiếp cận cũ:

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

Kiểm tra đoạn

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


Tôi đang xấu hổ mượn trim()ý tưởng của bạn . Tôi chắc chắn có một cái gì đó tốt hơn slice(1)nhưng không thể tìm ra nó.
Arnauld

@Arnauld Tốt với tôi, bây giờ tất cả chúng ta đều bị trói. Tôi cá là có một cách để làm điều đó dưới 200 :-)
Sản phẩm ETH

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

Hàm lambda lấy một số nguyên và trả về đoạn hội thoại dưới dạng a std::string. Bạn có thể thấy nó trong hành động ở đây .

Phiên bản Ungolfed (với một số giải thích):

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

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

Sử dụng

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)

Ghi chú

Đây là quá trình chơi gôn, tôi nghĩ rằng tôi vẫn có thể loại bỏ một số byte, nhưng hãy để lại gợi ý trong các bình luận.


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

Chỉnh sửa , tương đương:

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


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

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

Khởi chạy với số đầu vào là tham số.

Ung dung:

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

Quay lại 396 byte vì tôi không nhận thấy quy tắc "không có dòng mới nào khi bắt đầu".


Đáng buồn thay, s.Replace("1",c[k++]).Replace("0",b[l++])không thay thế bằng các từ tương ứng. Có vẻ như, C # được thay thế chuỗi một lần và tát nó ở những nơi.
Ông Scapegrace

2

Ruby, 204 + 1 = 205 byte

Yêu cầu -ncờ.

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)*' '}

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

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

Đặt nó vào một tệp có tên 494542 và chạy như thế này:

perl -lX 494542

Đã thử nghiệm trên perl v5.22


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

Cầu nguyện:

(f 522300)

Ung dung

(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))))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.