Büyük kod… sizin için!


32

Kara Şövalye açılış sahnesinde yükselir , bir CIA ajanı ile kötü adam Bane arasında oldukça garip bir diyalog var .

CIA ajanı: “Bu maskeyi çıkarırsam ölür müsün?”

Bane: “Son derece acı verici olurdu…”

CIA ajanı: “Sen büyük bir adamsın.”

Bane: “… senin için.”

Bane'in “senin için acı verici” veya “senin için büyük bir adam” demeye niyetli olup olmadığından emin değil. Kod sorunu ile bu sorunu bir kez çözelim!

Meydan okuma

Göreviniz, giriş olarak verilen bir tamsayıya bağlı olarak yukarıdaki diyalogu yeniden düzenleyen bir program yazmaktır.

CIA ajanı diyalog kelimeleri: If I pull that off will you die? You're a big guy.

Bane'in diyalog kelimeleri: It would be extremely painful... for you!

Unutmayın ki die?, You’re, painful...ve you!tek kelime olarak kabul edilmektedir.

  1. N olarak bir tamsayı verilmişse, onu ikiliye dönüştür
  2. İkili rakamları soldan sağa okuyarak, rakam CIA ajanı iletişim kutusundan bir 1sonraki kelimeyi ve rakam ise Bane diyalogdan bir sonraki kelimesini çıkar 0. Sözcükler bir boşlukla ayrılmalıdır. Hoparlör değiştiğinde satır beslemesi ekleyin. Ayrıca, her bir diyalog satırını konuşmacı adıyla ( BANE:veya CIA:) önekleyin .

Girişin her zaman ikili biçimde 1 ile başladığını ve 12 tane ve 7 sıfıra sahip olduğunu varsayabilirsiniz.

Örnek

522300

  1. İkili dosyaya dönüştürüldü: 1111111100000111100

  2. Sayı 8 ile başlar, bu yüzden CIA'nın ajan diyaloğundan ilk 8 kelimeyi çıkartacağız ve CIA ile ön ekini: CIA: If I pull that off will you die?

  3. Sonra 5 sıfıra sahibiz, bu yüzden Bane'in diyaloğundan ilk 5 kelimeyi elde ettik: BANE: It would be extremely painful...

  4. Sonra 4 tane var, bu yüzden sonraki 4 CIA kelimesini çıkartacağız: CIA: You’re a big guy.

  5. Sonra 2 sıfır: BANE: for you!

Son sonuç:

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

Daha fazla test durumu:

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.

Her satır bir uzayda bitebilir mi?
xnor

@xnor Evet, tamam.
Arnaud

Bane'in konuşmasının ilk sözcüğü olarak "that" ve "it", test
senaryolarında

@Mistah "ona" sabit, teşekkürler!
Arnaud

3
Sadece ben miyim yoksa birileri Bane'nin sesinde diyalogu mu okudu?
Gurupad Mamadapur

Yanıtlar:


10

Pyth - 138 bayt

Film senaryosunu sıkıştırmaya çalışmalıyım.

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 Takımı .


7

JavaScript (ES6), 203 201 bayt

Düzenleme: ETHproductions'ın yanıtındantrim() fikri utanmadan ödünç alarak 2 bayt kurtardı

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

Test durumları


7

JavaScript (ES6), 209 202 201 bayt

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

Eski yaklaşım:

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

Test snippet'i

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


Utanmadan trim()fikrini ödünç alıyorum . Bundan daha iyi bir şey olduğundan emindim slice(1)ama çözemedi.
Arnauld,

@Arnauld Bana göre, şimdi hepimiz bağlıyız. Bahse girerim 200 :-) altında yapmanın bir yolu vardır
ETHproductions

6

C ++ 11 (GCC), 298 293 bayt

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

Bir tamsayı alan ve diyaloğu a olarak döndüren bir lambda işlevi std::string. Burada eylemde görebilirsiniz .

Ungolfed versiyonu (bazı açıklamalarla birlikte):

#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 bayt

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

kullanım

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)

notlar

Bu devam eden golf, sanırım hala bazı baytları tıraş edebilirim ama yorumlarda önerilerde bulunmaktan çekinmeyin.


4

Python 3.6, 232 bayt

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

Düzenleme , eşdeğer:

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 bayt

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

Çok sayıda yazdırılamaz, böylece çevrimiçi ortamda test etmekten daha iyi olursun .


2

Perl 6 , 211 bayt

{.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 bayt

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

Parametre olarak giriş numarası ile başlatın.

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

396 bayta geri döndüğüm için "başlangıçta yeni satır yok" kuralını farketmedim.


Ne yazık ki, s.Replace("1",c[k++]).Replace("0",b[l++])karşılık gelen kelimelerle değiştirilmez. Görünüşe göre, C # bir kez dizeyi değiştiriyor ve yerlerine tokatlıyor.
Bay Scapegrace

2

Ruby, 204 + 1 = 205 bayt

-nBayrağı gerektirir .

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 bayt

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 bayt

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

Bunu 494542 adlı bir dosyaya koyun ve şöyle çalıştırın:

perl -lX 494542

Perl v5.22'de test edildi


1

Clojure, 401 bayt

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

çağırma:

(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))))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.