PPCG Jeopardy : 강도


18

사이트를 얼마나 잘 알고 있습니까? 알아 보자.

이것은 도전입니다. 경찰의 실 .

강도로서 다음을 수행해야합니다.

  1. 경찰의 제출과 일치하는 삭제되지 않은 비공개 도전을 찾습니다. 도전 과제에는 , , , , , , , 태그를 사용할 수 없습니다 . 챌린지는 유효한 출력에 제한이 있어야합니다.
  2. 여기에 도전을 게시하고 당신이 부수고있는 경찰에 연결하십시오
  3. 이 답변에 대한 링크와 함께 경찰 게시물에 "파열 된"설명을 추가하십시오.

제출물에 균열이없는 상태로 24 시간마다 1 포인트와 1 포인트가 추가됩니다 (최대 7). 타이 브레이커는 금이 간 서브 미슨의 총 수입니다.

노트:

  • 도전이의 출력을 필요로하는 경우 X, 그리고 출력 XY또는 YX곳이 Y공백 외에 아무것도이다, 제출는 반칙으로 유효하지 않습니다.
  • 2016-11-17 이전의 도전은 허용되지 않습니다.
  • 본인은 특정 문제가 광범위하게 적용될 수있는 경우 (모든 제출물의 대다수에 적용될 수 있음) 특정 문제를 금지 할 권리가 있습니다.
  • 설명으로 문장을 하나 또는 두 개 추가하십시오 (제목이 의견으로 변환되지 않도록 도와줍니다).
  • 초기 아이디어에 대한 Daniel 에게 감사합니다 !


답변:


5

동전 던지기의 절반만큼 머리를 얻을 확률을 계산하십시오.

경찰 입장 (Conor O'Brien 게시) : /codegolf//a/100521/8927

원래 질문 : 동전 던지기의 절반만큼 머리를 얻을 확률을 계산하십시오.


게시 된 솔루션에는 몇 가지 난독 화 기법이 적용되었으며, 이후에는 동일한 난독 화 기법의 여러 계층이 사용되었습니다. 처음 몇 가지 트릭을 지나면 실제 기능을 추출하는 간단한 (지루한 경우!) 작업이되었습니다.

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

내가보고있는 것을 깨닫기까지는 시간이 걸렸지 만 (한동안 엔트로피와 관련이있는 것으로 의심되는 경우), 문제가 발생하면 "코인 던지기 가능성"을 검색하여 쉽게 질문을 찾을 수있었습니다.


Conor O'Brien은 자신의 코드에 대한 심층적 인 설명에 이의를 제기 했으므로 다음은 더 흥미로운 부분을 요약 한 것입니다.

내장 함수 호출을 난독 화하여 시작합니다. 이는 함수 이름을 base-32로 인코딩 한 다음 단일 문자의 새로운 전역 네임 스페이스 이름에 할당하여 수행됩니다. 실제로는 'atob'만 사용됩니다. 다른 2 개는 단지 빨간 청어입니다 (평가는 atob과 같은 속기를 취하고 재정의하기 만하며 btoa는 단순히 사용되지 않습니다).

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

다음으로 코드를 숨기는 몇 가지 간단한 문자열 믹스 업이 있습니다. 이것들은 쉽게 반전됩니다 :

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

난독 화의 대부분은 g단순히 새로운 기능을 정의 하는 기능 의 사용입니다 . 이것은 새로운 함수를 반환하거나 함수를 매개 변수로 요구하는 함수와 함께 재귀 적으로 적용되지만 결국에는 간단하게 단순화됩니다. 이 중에서 가장 흥미로운 기능은 다음과 같습니다.

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

이 줄에는 마지막 트릭도 있습니다.

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"

다음 비트가 ".pow (T, a)"이기는하지만 항상 "Math"일 가능성이 높습니다!

기능 확장 경로를 따라 취한 단계는 다음과 같습니다.

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

함수 중첩의 구조는 유틸리티를 기반으로합니다. 가장 바깥 쪽 "D"/ "j"함수는 비율을 계산 한 다음 내부 "C"/ "h"및 "E"(인라인) 함수는 필요한 코인 플립 카운트를 계산합니다. 세 번째 단계에서 제거 된 "F"기능은 이들을 사용 가능한 전체로 연결하는 역할을합니다. 마찬가지로 "k"기능은 관찰해야 할 헤드 수를 선택합니다. 파라미터 바인딩 함수 "L"을 통해 비율 함수 "D"/ "j"에 위임하는 작업; 여기에 매개 변수를 고정하는 데 사용 b됩니다 T(여기서는 항상 2, 동전이 취할 수있는 상태 수).

결국 우리는 다음을 얻습니다.

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

잘 했어! 이것은 약간 잘못되었습니다 f. eval이로 설정되어 있습니다. 그러나 나머지는 맞습니다! 또한, 어떻게 RESULT도출 되는지에 대한 약간의 정교함 이 가치가있을 것입니다.)
Conor O'Brien

@ ConorO'Brien 확실히; 모든 기능을 축소하기 전에 메모와 각 기능의 유틸리티에 대한 설명을 추가했습니다.
Dave

현상금 주셔서 감사합니다 @ ConorO'Brien!
Dave

항상 즐거움 :)
코너 오브라이언

3

MATL, Luis Mendo , 2 개의 숫자 사이에있는 소수점 이하 자릿수

&:"@FYAYm7>vs

입력으로 재생하여 수행하는 작업을 파악했지만 합계가 숫자의 7 배보다 큰 범위에서 정수 수를 계산 해야하는 문제를 파악할 수 없었습니다. MATL 문서를 읽은 후 이것이 무엇을하는지 대략적으로 설명했습니다.

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

그런 다음 "길이 7보다 큰 자릿수 합계"에서 "평균 자릿수 7보다 큰 자릿수"검색으로 전환하여 찾고 있던 문제가 발생했습니다.





2

Perl, Gabriel Benamy , 편리한 회문 검사기

코드는 분명히 일종의 회문이었습니다. y- - -구조를 골라서 음역이 무엇인지 알았을 때 나는 그것이 어떤 도전인지 알았습니다.


당신은 몇 초만에 나를 이겼습니다 ...하지만 펄을 다운로드하는 데 너무 오래 걸렸습니다.
Laikoni

@Laikoni 솔직히, 부부가 Ideone을 시도한 후 코드 실행을 포기하고 대신 코드를 읽으려고했습니다. ;)
DLosc

2

Pyth- https: //codegolf.stackexchange.com/a/100391/31343

나는 프로그램이 무엇을했는지 빨리 알았지 만 도전을 찾는 데는 꽤 오랜 시간이 걸렸다.

앞으로 다른 길

이것은 내 버퍼입니다.



1

MATL, Luis Mendo , 해밍 무게가 낮은 해밍 무게 계산

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

나는 숫자 입력을 테스트하고 OEIS 에서 해밍 무게를 발견했습니다 .

그런 다음 PPCG를 검색하고 문자열을 넣으려고 시도했지만 효과가있었습니다.


경찰 도전에 대해 언급했듯이, 실제로 제출 한 내용이 깨지지는 않습니다. 불행히도이 답변을 삭제해야한다고 생각합니다.
Luis Mendo


1

루비, histocrat , 진실-기계 구현

이 코드는 mod 7이 0 f(n) = n*(3*n-1)/2이 될 때까지 실행 되는 반복 함수 시스템 을 정의합니다. 따라서 n입력은 0즉시 인쇄됩니다 (한 0번 인쇄 한 후 ). 입력이 1제공 1인쇄 무한 루프 선도 1. 초기 값 n이 0, 2, 3, 5 또는 6 mod 7에 일치 하면 1-3 단계 후에 다른 입력이 종료 되거나 1 또는 4 mod 7에 일치하면 영원히 커집니다. 그러나 그것은 관련이 없습니다.


1

헥사 고니, 548 바이트, 마틴 엔더

이것은 " 프로그램에없는 모든 캐릭터를 인쇄하십시오 "도전입니다!

인쇄물:

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

이것 의 출력과 매우 유사합니다 . 여기서 단서는 마지막 .이 인쇄되지 않았다는 것입니다. 또한 코드 자체에는 문자가 없었으며 출력의 구에 알파벳의 모든 문자가 포함되어 있음을 모두 알고 있습니다.



0

파이썬 3, /codegolf//a/100381/31343

xkcd의 공식을 사용하여 세계 인구를 추정하십시오.

나는 방금 윤년 (4 개의 체커에 의해 해독 된 분할 성으로 인해)과 관련된 문제를 검색했지만 아무런 입력도받지 않았다.


네! 나는 그것 때문에의 명백한 줄 알았 %4하고 strftime있지만, 코드의 중요한 부분을 안보를위한 좋은 직장 (그것의 대부분은 횡설수설했다)
FlipTack

아 단짓, 나도 점점 가까워 졌어 나는 그것이 날짜와 관련이 있고 2005와 2016/2017을 얻고 있다는 것을 알았습니다. 좋은 작업.
Yodle

아무도 당신이 단순히 코드를 실행하여 출력을 생성 7.3 328하고 검색 하지 않은 것에 놀랐습니다 . 도전은 곧바로옵니다.
FlipTack



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.