PPCG Jeopardy: Rabusie

18

Jak dobrze znasz stronę? Dowiedzmy Się.

To wyzwanie dla . Wątek gliny .

Jako złodziej musisz:

  1. Znajdź nieusunięte, niezamknięte wyzwanie, które pasuje do zgłoszenia gliny. Wyzwanie nie może zawierać następujących tagów: , , , , , , , . Wyzwanie musi mieć ograniczenia dotyczące prawidłowego wyniku.
  2. Opublikuj wyzwanie tutaj i link do łamanego gliniarza
  3. Dodaj komentarz „Cracked” do postu gliniarzy, z linkiem do tej odpowiedzi

Otrzymasz 1 punkt plus 1 punkt za każdy 24-godzinny okres, w którym przesłanie pozostało nierozpoznane (maksymalnie 7). Tiebreaker to całkowita liczba złamanych postów.

Uwagi:

  • Jeśli wyzwanie wymaga wyjścia X, a wyjście XYlub YXgdzie Yjest coś oprócz spacji, złożenie nie jest ważny dla tego wyzwania.
  • Wyzwanie nowsze niż 17.11.2016 nie jest dozwolone.
  • Zastrzegam sobie prawo do zakazania niektórych wyzwań, jeśli mają one szerokie zastosowanie (można je zastosować do większości wszystkich zgłoszeń).
  • Pamiętaj o dodaniu jednego lub dwóch zdań jako wyjaśnienia (pomaga to również przekształcić zgłoszenie w komentarz)
  • Dzięki Danielowi za wstępny pomysł!
Nathan Merrill
źródło

Odpowiedzi:

5

Oblicz prawdopodobieństwo uzyskania o połowę więcej głów niż rzut monetą.

Wpis gliniarzy (opublikowany przez Conor O'Brien): /codegolf//a/100521/8927

Pierwotne pytanie: obliczyć prawdopodobieństwo uzyskania o połowę mniejszej liczby głów niż rzut monetą.


W opublikowanym rozwiązaniu zastosowano kilka technik zaciemniania, a następnie wiele warstw tej samej techniki zaciemniania. Po przejściu kilku pierwszych sztuczek wyodrębnienie rzeczywistej funkcji stało się prostym (choć żmudnym!) Zadaniem:

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

Chwilę zajęło mi zrozumienie, na co patrzę (przez pewien czas podejrzewałem, że ma to coś wspólnego z entropią), ale kiedy już się zakręciło, udało mi się łatwo znaleźć pytanie, szukając „prawdopodobieństwa rzutu monetą”.


Ponieważ Conor O'Brien zakwestionował dogłębne wyjaśnienie swojego kodu, oto podsumowanie ciekawszych fragmentów:

Zaczyna się od zaciemnienia niektórych wbudowanych wywołań funkcji. Uzyskuje się to przez kodowanie base-32 nazw funkcji, a następnie przypisanie ich do nowych nazw przestrzeni globalnej pojedynczego znaku. W rzeczywistości używany jest tylko „atob”; pozostałe 2 są tylko czerwonymi śledziami (eval ma ten sam skrót jak atob, ale musi zostać zastąpiony, a btoa po prostu nie jest używane).

_=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)]
    }
);

Następnie jest kilka trywialnych pomyłek w celu ukrywania kodu. Można je łatwo odwrócić:

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

Większość zaciemniania polega na użyciu gfunkcji, która po prostu definiuje nowe funkcje. Jest to stosowane rekurencyjnie, przy czym funkcje zwracają nowe funkcje lub wymagają funkcji jako parametrów, ale ostatecznie upraszczają się od samego początku. Najciekawszą funkcją, która z tego wynika, jest:

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

Istnieje również ostatnia sztuczka z tą linią:

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"

Chociaż ponieważ następnym bitem jest „.pow (T, a)”, zawsze było całkiem prawdopodobne, że będzie to „Math”!

Kroki, które podjąłem na drodze rozszerzania funkcji, to:

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

Struktura zagnieżdżania funkcji jest oparta na użyteczności; najbardziej zewnętrzna funkcja „D” / „j” oblicza stosunek, a następnie funkcje wewnętrzne „C” / „h” i „E” (inline) obliczają niezbędne zliczanie monet. Funkcja „F”, usunięta w trzecim przejściu, odpowiada za połączenie ich razem w użyteczną całość. Podobnie funkcja „k” odpowiada za wybór liczby głowic, które należy obserwować; zadanie, które deleguje do funkcji stosunku „D” / „j” za pomocą funkcji wiązania parametrów „L”; służy tutaj do ustalenia parametru bna T(tutaj zawsze 2, czyli liczba stanów, jaką moneta może przyjąć).

W końcu otrzymujemy:

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)
}
Dave
źródło
Dobra robota! Jest to nieco niepoprawne - eval jest ustawiony na f. Ale reszta jest poprawna! Warto też trochę dopracować, w jaki sposób RESULTmożna uzyskać pochodzenie;)
Conor O'Brien
@ ConorO'Brien na pewno; Dodałem swoje notatki i wyjaśnienie użyteczności każdej funkcji przed zwijaniem ich wszystkich.
Dave
@ ConorO'Brien dzięki za nagrodę!
Dave
Zawsze przyjemność :)
Conor O'Brien
3

MATL, Luis Mendo , Policz liczbę mocnych miejsc po przecinku między 2 liczbami

&:"@FYAYm7>vs

Zorientowałem się, co robi, grając z wejściami, ale nie mogłem zorientować się, jakie wyzwanie musiałbyś obliczyć liczbę całkowitą w zakresie, którego suma była większa niż 7-krotność liczby cyfr. Po przeczytaniu dokumentów MATL, opracowałem ogólne wyjaśnienie tego, co to robi:

&    % 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

Następnie przełączyłem wyszukiwanie ze „sumy cyfr większej niż 7 razy” na „średnią cyfrę większą niż 7”, co dało wyzwanie, którego szukałem.

ETHprodukcje
źródło
2

Perl, Gabriel Benamy , Wygodny kontroler palindromu

Kod był oczywiście jakimś palindromem. Kiedy wybrałem y- - -strukturę i zauważyłem, co jest tłumaczone, wiedziałem, jakie to wyzwanie.

DLosc
źródło
Pokonałeś mnie o kilka sekund ... ale pobieranie perla trwało tak długo.
Laikoni,
@Laikoni Szczerze, po kilku próbach Ideone, zrezygnowałem z uruchomienia kodu i zamiast tego spróbowałem go przeczytać. ;)
DLosc
1

MATL, Luis Mendo , Oblicz masę młota o niskiej masie młota

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

Przetestowałem wprowadzanie liczb i znalazłem masę młota na OEIS .

Potem przeszukałem PPCG, próbowałem wprowadzić ciągi i zadziałało.

Bobobak
źródło
Jak skomentowałem w wyzwaniu dla gliniarzy, to tak naprawdę nie łamie mojego zdania. Niestety, myślę, że ta odpowiedź musi zostać usunięta
Luis Mendo
1

Ruby, histokrata , zaimplementuj maszynę prawdy

Kod definiuje iterowany system funkcji, f(n) = n*(3*n-1)/2który działa, dopóki nmod 7 nie wyniesie 0. W 0związku z tym wprowadzanie kończy się natychmiast (po 0jednorazowym wydrukowaniu ). Wprowadzanie 1daje 1, co prowadzi do nieskończonej pętli drukowania 1. Inne dane wejściowe kończą się po 1-3 krokach, jeśli wartość początkowa njest zgodna z 0, 2, 3, 5 lub 6 mod 7, lub rośnie wiecznie, jeśli jest zgodna z 1 lub 4 modem 7. Ale to nie ma znaczenia.

DLosc
źródło
1

Sześciokąt, 548 bajtów, Martin Ender

To jest „ Drukuj każdą postać, której Twój program nie ma wyzwanie ”!

Wydruki:

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

Który jest bardzo podobny do wyjścia w tym . Wskazówka była taka, że ​​ostatnia. nie został wydrukowany. Ponadto sam kod nie zawierał liter i wszyscy wiemy, że frazy na wyjściu zawierają wszystkie litery w alfabecie.

Stewie Griffin
źródło
0

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

Użyj wzoru xkcd, aby przybliżyć przybliżoną liczbę ludności na świecie

Właśnie szukałem wyzwań, które obejmowały lata przestępne (ze względu na dekodowalność podzielności przez cztery moduły sprawdzające) i które nie brały udziału.

Maltysen
źródło
Tak! Wiedziałem, że będzie to oczywiste ze względu na %4i strftime, ale dobrą robotę do zauważania ważnych części kodu (większość to bełkot)
FlipTack,
O kurwa, ja też się zbliżałem. Doszedłem do wniosku, że to ma coś wspólnego z datami, dostawałem 2005 i 2016/2017. Dobra robota.
Yodle,
Dziwi mnie, że żadne z was nie uruchomiło po prostu kodu, który generuje dane wyjściowe 7.3 328, i przeszukało je. Wyzwanie pojawia się od razu.
FlipTack,
0

Mathematica, JHM , Naturalne budownictwo

Jednoargumentowy operator ±oblicza reprezentację liczb naturalnych na podstawie teorii zbiorów.

Martin Ender
źródło
0

Ruby, wat , 400. Pytanie Celebration / Challenge

To była pierwsza rzecz, jaką znalazłem, szukając „400”. To powiedziawszy, wyzwanie wydaje się błędne i powinno być popconem i prawdopodobnie powinno być również zamknięte z powodu braku obiektywnych wymagań.

Martin Ender
źródło