大きなコード…あなたのために!


32

Dark Knightのオープニングシーンでは、CIAエージェントと悪役Baneの間にやや厄介な会話があります。

CIAエージェント:「その[マスク]を外すと、あなたは死にますか?」

ベイン:「それは非常に痛いでしょう...」

CIAエージェント:「あなたは大物です。」

ベイン:「…あなたのために。」

Baneが「あなたにとって苦痛」または「あなたにとって大きな男」と言うつもりであるかどうかはわかりません。この問題をコードゴルフを通じて一度解決しましょう!

チャレンジ

あなたの仕事は、入力として与えられた整数に応じて上記のダイアログを並べ替えるプログラムを書くことです。

CIAエージェントの対話の言葉は次のとおりです。 If I pull that off will you die? You're a big guy.

ベインの台詞は次のとおりです。 It would be extremely painful... for you!

それを注意してくださいdie?You’repainful...およびyou!単一の単語として考えられています。

  1. 整数nを入力として、バイナリに変換します
  2. 2進数を左から右に読み取り、数字がの場合はCIAエージェントダイアログから次の単語を出力し1、数字がの場合はBaneダイアログから次の単語を出力し0ます。単語はスペースで区切る必要があります。スピーカーが変わったら、改行を追加します。また、各ダイアログの行の前にスピーカー名(BANE:またはCIA:)を付けます。

入力は常にバイナリ形式の1で始まり、12個の1と7個のゼロがあると仮定できます。

522300

  1. バイナリに変換: 1111111100000111100

  2. 番号は8個で始まるため、CIAのエージェントダイアログから最初の8個の単語を出力し、CIAをプレフィックスとして付けます。 CIA: If I pull that off will you die?

  3. その後、5つのゼロを取得したので、Baneのダイアログから最初の5つの単語を取得します。 BANE: It would be extremely painful...

  4. 次に、4つの単語があるので、次の4つのCIA単語を出力します。 CIA: You’re a big guy.

  5. 次に、2つのゼロ: BANE: for you!

最終結果:

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

その他のテストケース:

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.

各行をスペースで終了できますか?
XNOR

@xnorはい、大丈夫です。
アルノー

ベインのスピーチの最初の単語としてテストケース/引用に並ぶない「という」と「それ」
MildlyMilquetoast

@Mistahが "it"に修正、ありがとう!
アルノー

3
それは私だけか、誰かがベインの声で対話を読んだかどうかです。
グルパッドママダプール

回答:


10

パイス-138バイト

映画のスクリプトの圧縮を検討する必要があります。

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

テストスイート


7

JavaScript(ES6)、203 201バイト

編集:ETHproductionsの回答trim()から恥知らずにアイデアを借用することで2バイトを節約しました

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

テストケース


7

JavaScript(ES6)、209 202 201バイト

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

古いアプローチ:

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

テストスニペット

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


私はあなたのtrim()アイデアを恥知らずに借りています。私は何かより良いものがあると確信していましたが、それを理解slice(1)できませんでした。
アーナウルド

@Arnauld Fineと一緒に、今は全員が縛られています。200以下でそれを行う方法があるに違いない:
ETHproductions

6

C ++ 11(GCC)、298 293バイト

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

整数を取り、ダイアログをaとして返すラムダ関数std::stringここで実際に動作を確認できます

未ゴルフバージョン(説明付き):

#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バイト

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

ノート

これは進行中のゴルフです、私はまだいくつかのバイトを削ることができると思いますが、コメントに提案を残してください。


4

Python 3.6、232バイト

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

編集、同等:

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

3

Japt、121バイト

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

多くの印刷できないものが含まれているため、オンラインでテストした方が良いでしょう。


2

Perl 6、211バイト

{.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バイト

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

入力番号をパラメーターとして起動します。

ゴルフをしていない:

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

「先頭に改行がない」というルールに気付かなかったため、396バイトに戻りました。


悲しいことに、s.Replace("1",c[k++]).Replace("0",b[l++])対応する単語に置き換えません。C#が文字列を1回置き換えて、それをある場所で平手打ちするようです。
氏困り者

2

ルビー、204 + 1 = 205バイト

-nフラグが必要です。

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バイト

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バイト

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

それを494542という名前のファイルに入れて、次のように実行します。

perl -lX 494542

perl v5.22でテスト済み


1

Clojure、401バイト

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

呼び出し:

(f 522300)

非ゴルフ

(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))))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.