PPCG Jeopardy: Soyguncular


18

Siteyi ne kadar iyi tanıyorsunuz? Hadi bulalım.

Bu bir mücadelesi. Polisin iş parçacığı .

Bir soyguncu olarak şunları yapmanız gerekir:

  1. Bir polisin gönderimi ile eşleşen silinmemiş, kapalı olmayan bir meydan okuma bulun. şu etiketlere sahip olamaz: , , , , , , , . Zorluğun geçerli çıktı üzerinde kısıtlamaları olmalıdır.
  2. Buradaki görevi yayınlayın ve kırdığınız polise bağlantı verin
  3. Polislerin gönderisine bu cevaba geri dönen bir "Çatlak" yorumu ekleyin

Gönderim kesintisiz kaldığı için her 24 saatlik periyot için 1 puan artı 1 puan alacaksınız (en fazla 7). Tiebreaker kırık alt bölümlerin toplam sayısıdır.

Notlar:

  • Bir meydan okuma bir çıkış gerektiriyorsa Xve size hem çıkış XYveya YXneredeY beyaz alanın dışında bir şey varsa, bu meydan okuma için gönderim geçerli değildir.
  • 2016-11-17'den daha yeni bir mücadeleye izin verilmez.
  • Yaygın olarak uygulanabilirlerse (tüm gönderilerin çoğuna uygulanabilir) belirli zorlukları yasaklama hakkını saklı tutarım.
  • Açıklama olarak bir veya iki cümle eklediğinizden emin olun (ayrıca gönderiminizin bir yoruma dönüştürülmesine yardımcı olur)
  • İlk fikir için Daniel'e teşekkürler !


Yanıtlar:


5

Bozuk para kadar yarım kafa alma olasılığını hesaplayın.

Polis girişi (Conor O'Brien tarafından gönderildi): /codegolf//a/100521/8927

Orijinal soru: Bozuk para kadar yarım kafa alma olasılığını hesaplayın.


Kaydedilen çözelti uygulanan bir çift gizleme tekniği ve ardından aynı gizleme tekniğinin birden fazla katmanı olmuştur. İlk birkaç hileyi geçtikten sonra, gerçek işlevi çıkarmak basit (sıkıcı!) Bir görev haline geldi:

nCr(a,b) = a! / ((a-b)! * b!)
result = nCr(x, x/2) / 2^x

Neye baktığımı anlamak için bir süre aldı (bir süre entropi ile ilgili bir şeyden şüphelendim), ancak bir kez dallandıktan sonra, "madeni para fırlatma olasılığı" arayarak soruyu kolayca bulmayı başardım.


Conor O'Brien kodunun derinlemesine bir açıklamasına meydan okuduğundan, daha ilginç bitlerin bir özeti:

Bazı yerleşik işlev çağrılarını gizleyerek başlar. Bu, base-32 işlev adlarının kodlanması ve ardından tek bir karakterin yeni global ad alanı adlarına atanmasıyla elde edilir. Sadece 'atob' kullanılır; diğer 2 sadece kırmızı sürülerdir (eval atob ile aynı stenoyu alır, sadece geçersiz kılmak için ve btoa sadece kullanılmaz).

_=this;
[
    490837, // eval -> U="undefined"       -> u(x) = eval(x) (but overwritten below), y = eval
    358155, // atob -> U="function (M,..." -> u(x) = atob(x)
    390922  // btoa -> U="function (M,..." -> n(x) = btoa(x), U[10] = 'M'
].map(
    y=function(M,i){
        return _[(U=y+"")[i]] = _[M.toString(2<<2<<2)]
    }
);

Sonra kodu gizlemek için birkaç önemsiz dize karışımı vardır. Bunlar kolayca tersine çevrilebilir:

u(["","GQ9ZygiYTwyPzE6YSpk","C0tYSki","SkoYSkvZChhLWIpL2QoYikg"].join("K"))
// becomes
'(d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b) '

u("KScpKWIsYShFLCliLGEoQyhEJyhnLGM9RSxiPUQsYT1D").split("").reverse().join("")
// becomes
"C=a,D=b,E=c,g('D(C(a,b),E(a,b))')"

Gizlemenin büyük kısmı, gsadece yeni işlevleri tanımlayan işlevin kullanılmasıdır. Bu, işlevler yeni işlevler döndüren veya parametreler olarak işlevler gerektiren yinelemeli olarak uygulanır, ancak sonunda hemen basitleştirilir. Bundan çıkmanın en ilginç işlevi:

function e(a,b){ // a! / ((a-b)! * b!) = nCr
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}

Ayrıca bu çizgide son bir hile var:

U[10]+[![]+[]][+[]][++[+[]][+[]]]+[!+[]+[]][+[]][+[]]+17..toString(2<<2<<2)
// U = "function (M,i"..., so U[10] = 'M'. The rest just evaluates to "ath", so this just reads "Math"

Bir sonraki bit ".pow (T, a)" olduğundan, "Math" olması her zaman muhtemeldi!

Genişleyen işlevler rotası boyunca attığım adımlar:

// Minimal substitutions:
function g(s){return Function("a","b","c","return "+s)};
function e(a,b,c){return (d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b)}
function h(a,b,c){return A=a,B=b,g('A(a,B(a))')}
function j(a,b,c){return a/b}
function L(a,b,c){return Z=a,Y=b,g('Z(a,Y)')}
k=L(j,T=2);
function F(a,b,c){return C=a,D=b,E=c,g('D(C(a,b),E(a,b))')}
RESULT=F(
    h(e,k),
    j,
    function(a,b,c){return _['Math'].pow(T,a)}
);


// First pass
function e(a,b){
    d=function(a){return a<2?1:a*d(--a)}
    return d(a)/d(a-b)/d(b)
}
function h(a,b){
    A=a
    B=b
    return function(a){
        return A(a,B(a))
    }
}
function j(a,b){ // ratio function
    return a/b
}
function L(a,b){ // binding function (binds param b)
    Z=a
    Y=b
    return function(a){
        return Z(a,Y)
    }
}
T=2; // Number of states the coin can take
k=L(j,T); // function to calculate number of heads required for fairness
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    h(e,k),
    j,
    function(a){return Math.pow(T,a)}
);


// Second pass
function e(a,b){...}
function k(a){
    return a/2
}
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    function(a){
        return e(a,k(a))
    },
    function(a,b){
        return a/b
    },
    function(a){return Math.pow(2,a)}
);


// Third pass
function e(a,b) {...}
C=function(a){ // nCr(x,x/2) function
    return e(a,a/2)
}
D=function(a,b){ // ratio function
    return a/b
}
E=function(a){return Math.pow(2,a)} // 2^x function
RESULT=function(a,b,c){
    return D(C(a,b),E(a,b))
}

İşlev yuvalamasının yapısı faydaya dayalıdır; en dıştaki "D" / "j" işlevi bir oranı hesaplar, daha sonra iç "C" / "h" ve "E" (satır içi) işlevleri, gerekli bozuk para çevirme sayısını hesaplar. Üçüncü geçişte kaldırılan "F" işlevi, bunları kullanılabilir bir bütün olarak birleştirmekten sorumludur. Benzer şekilde "k" fonksiyonu, gözlemlenmesi gereken kafa sayısını seçmekle sorumludur; "L" parametre bağlama fonksiyonu ile "D" / "j" oran fonksiyonuna devrettiği bir görev; parametreyi düzeltmek için burada kullanılırb için kullanılırT (burada her zaman 2, madalyonun alabileceği durum sayısıdır).

Sonunda şunu elde ederiz:

function e(a,b){ // a! / ((a-b)! * b!)
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}
RESULT=function(a){
    return e(a, a/2) / Math.pow(2,a)
}

Aferin! Bu biraz yanlıştır - eval olarak ayarlanır f. Ama gerisi doğru! Ayrıca, nasıl RESULTtüretildiğine dair biraz detaylandırma layık olabilir;)
Conor O'Brien

@ ConorO'Brien emin; Notlarımı ve her bir işlevin yararlarını açıklamadan önce hepsini daralttım.
Dave

@ ConorO'Brien ödül için teşekkürler!
Dave

Her zaman bir zevk :)
Conor O'Brien

3

MATL, Luis Mendo , 2 sayı arasındaki ağır ondalık sayısı

&:"@FYAYm7>vs

Girişlerle oynayarak ne yaptığını anladım, ancak toplamı rakam sayısının 7 katından fazla olan bir aralıktaki tam sayı sayısını hesaplamak zorunda kalacağınızı anlayamadım. MATL belgelerini okuduktan sonra, bunun ne yaptığına dair kaba bir açıklama yaptım:

&    % Change default input format
:    % Implictly input two integers, create inclusive range
"    % For each item in this range:
  @    % Push the item
  F    % Push false
  YA   % Convert to base N digits; N is false, so this produces base-10 digits
  Ym   % Calculate arithmetic mean
  7>   % Push 1 if this is greater than 7, 0 otherwise
  v    % Concatenate result into array with previous result
  s    % Sum
     % Implicitly end loop and output

Daha sonra "7 kat uzunluktan daha büyük basamak toplamı" aramasından "aradığım zorluğu veren" 7 basamaktan büyük ortalama basamağa "geçtim.





2

Perl, Gabriel Benamy , Uygun palindrom denetleyicisi

Kod belli ki bir çeşit palindromdu. Bir kez y- - -yapıyı seçip neyin dönüştürüldüğünü fark ettikten sonra , bunun ne zorluk olduğunu biliyordum.


Sen birkaç saniye benim yendi ... ama perl indirmek çok uzun sürdü.
Laikoni

@Laikoni Dürüst olmak gerekirse, birkaç kişi Ideone üzerinde denedikten sonra, kodu çalıştırmaktan vazgeçtim ve onun yerine okumayı denedim. ;)
DLosc



1

MATL, Luis Mendo , Düşük ağırlıkta çekiçleme ağırlığını hesapla

dP7EGn:q^1J2/h)ts_hX=Gs[BE]Wd=~>~GBz*

Ben sayılarda koyarak test ve üzerinde hamming ağırlık şeyi buldum OEIS .

Sonra PPCG'yi araştırdım, dizeleri koymayı denedim ve işe yaradı.


Polisler meydan okumasında yorumladığım gibi, bu aslında benim teslimimi kırmıyor. Ne yazık ki, bu cevabın silinmesi gerekiyor
Luis Mendo


1

Ruby, histokrat , bir Gerçek-Makine Uygula

Kod, bir tekrarlanan fonksiyonu sistemini tanımlayan f(n) = n*(3*n-1)/2çalışır kadar bu nmod 7 0 giriş olup 0, bu nedenle (yazdırma işleminden sonra hemen sona 0bir defa). Sonsuz bir baskı döngüsüne yol açan giriş 1verir . İlk giriş 0, 2, 3, 5 veya 6 mod 7'ye uygunsa 1-3 adımdan sonra sonlanır veya 1 veya 4 mod 7'ye uygunsa sonsuza kadar büyür. Ancak bu önemsizdir.11n


1

Hexagony, 548 bayt, Martin Ender

Bu, " Programınızın sahip olmadığı her karakteri yazdırın " meydan okumasıdır!

Baskılar:

Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look

Hangi içinde çıkışa çok benzer bu bir . Buradaki ipucu, sonuncunun .basılmamış olmasıydı. Ayrıca, kodun kendisinde hiçbir harf yoktu ve çıktıdaki tümcecilerin alfabedeki tüm harfleri içerdiğini biliyoruz.



0

Python 3, /codegolf//a/100381/31343

Dünya nüfusunun yaklaşık değerini bulmak için xkcd'nin formülünü kullanın

Ben sadece artık yıllar (dört denetleyicisi tarafından çözülmüş bölünebilirlik nedeniyle) içeren ve hiçbir girdi almayan zorlukları araştırdım.


Evet! Kodun önemli kısımlarını (ve çoğu anlamsızdı) tespit etmek için açık %4ve strftimeiyi bir iş olduğunu biliyordum
FlipTack

Ah dangit, ben de yaklaşıyordum. Bunun tarihlerle ilgisi olduğunu anladım, 2005 ve 2016/2017 elde ediyordum. İyi iş.
Yodle

Hiçbirinizin çıktıyı üreten kodu çalıştırdığına ve aradığına şaşırdım 7.3 328. Zorluk hemen ortaya çıkıyor.
FlipTack



0

Ruby, wat , 400. Soru Kutlama / Zorluk

"400" kelimesini ararken bulduğum ilk şey buydu. Bununla birlikte, meydan okuma yanlış etiketlenmiş gibi görünüyor ve bir popcon olmalı ve muhtemelen nesnel gereksinimlere sahip olmadığı için kapatılmalıdır.

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.