brainfuck에서 URL 인코딩


11

이 질문 에서 영감을 얻은 오늘 목표는 brainfuck로 URL을 인코딩하는 것입니다.

브라우저가 해킹당했습니다! 위치 표시 줄이 두뇌 해석기로 바뀌 었습니다. URL을 brainfuck 프로그램으로 바꾸는 프로그램이 필요합니다. 내 컴퓨터도 매우 느리므로 brainfuck 프로그램이 작을수록 좋습니다.

오, 나는 하나의 작업 탭 만 열어 두었습니다. 내 트위터. 그래서 당신은 트윗으로 만 프로그램을 보낼 수 있습니다.


  1. 문자열을 입력으로 받아 brainfuck 프로그램을 출력하는 모든 언어로 트윗 (140 자)에 맞는 프로그램을 작성하십시오.

  2. 이 brainfuck 프로그램은 입력없이 실행되며 출력을 생성합니다.

  3. 이 출력은 Chrome의 위치 표시 줄에 삽입되어 실행됩니다.

  4. Chrome의 동작이 # 1의 입력 문자열을 입력하여 얻는 동작과 동일하면 솔루션이 유효합니다. URL 단축기로 리디렉션은 다른 동작으로 간주됩니다. 최소한 동일한 도메인에 머물러 있어야합니다.

brainfuck 인터프리터가 각 셀에 무한정의 부호있는 정수와 무제한의 셀을 가지고 있다고 가정 할 수 있습니다.

점수는 다음 URL 세트를 인코딩하기 위해 생성 된 brainfuck 프로그램 길이의 합계에 의해 결정됩니다.

https://www.google.com/
/codegolf/47895/
http://www.golfscript.com/golfscript/examples.html
http://en.wikipedia.org/wiki/Percent-encoding
ftp://ftp.freebsd.org/pub/FreeBSD/
https://github.com/isaacg1/pyth/blob/master/doc.txt#L92
http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README

가장 작은 점수가 이깁니다.


입력이 다음과 같이 형식화된다고 가정 할 수 http://www.google.com/있습니다 google.com. PS 내가 (둘 다 지금까지 Google 크롬에 관한 한 유효하지만, 목록은 전체 형태를 포함) 거의 ...이 않는 크롬에 대한 확장을 작성하는 욕망이
BrainSteel

2
@BrainSteel 엔코더의 입력은 질문과 같이 정확하게 입력됩니다 (각 라인은 하나의 입력입니다). brainfuck의 출력은 원래 입력 문자열과 동일한 동작을하는 한 Chrome에서 허용하는 모든 형식 일 수 있습니다. 프로그램이 입력을 걸리는 경우 그래서 http://www.google.com/브레인 퍽 프로그램은 출력 할 수있다 생산 google.com, www.google.com등, 같은 페이지에 그들 때문에 모든 결과입니다. 그러나 예 ftp://ftp.freebsd.org/pub/FreeBSD/를 들어와는 다릅니다 ftp.freebsd.org/pub/FreeBSD/.
orlp

아, 감사합니다! 죄송합니다, 오늘 아침에 조금 느립니다.
BrainSteel

내가 실패했다는 것을 분명히하고 싶습니다. ftp://ftp.freebsd.org/pub/FreeBSD/실제로 ftp.freebsd.org/pub/FreeBSD/Chrome 과 동일 합니다. 이것은 내가 의도했던 것보다 도전을 조금 더 쉽게 만들어 주지만, 그것은 인생입니다. 요구 사항을 변경하지 않으므로 이전에 아무것도 제거하는 것이 안전합니다 ://.
orlp

답변:


7

Pyth-118 바이트, 점수 : 154 + 567 + 597 + 620 + 530 + 875 + 1092 = 6630 6623 4653 4435

이제 계수 곱셈 알고리즘을 사용하십시오!

위의 알고리즘보다 약간 나아지 긴하지만 매우 간단한 알고리즘입니다. Pyth를 사용할 계획이지만 현재 알고리즘으로 Python은 <140 bytes 입니다.

=zecz"//"=z?>z4}"www."zz=z?Pzqez\/zFNzKCNJ/^K.5 1=d\+pk+holN[?*-KZd>KZ*-ZK\-+\>*dK+++++\>*Jd"[>"*Jd"<-]>"*-K*JJd)\.=ZK

아웃 그것은 첫째 스트립 http://사용하여 split("//")www./끝. 그런 다음 min 함수를 사용하여 고려되는 세 가지 옵션 중 가장 좋은 옵션을 확인합니다.

  1. 사용 +또는- 원하는 셀 값을 현재 셀의 값을 업데이트하는
  2. 새로운 세포로 가서 그냥 채우십시오 +
  3. 정사각형은 상수 영역의 최소 둘레가 있으므로 sqrt (n) * sqrt (n) + remainder를 수행하여 새 셀로 이동하고 곱셈을 사용하여 업데이트하십시오. http://cydathria.com/bf/bf_ex3.html

나는 항상 . 각 문자를 출력합니다.

새로운 코드에 대한 자세한 설명은 곧 제공 될 예정입니다. 나는 골프, 특히 탈피 www./ 끝 부분 쳤지 만 한계가 20 바이트이기 때문에 귀찮게 할 수 없습니다.

이것은 놀랍게도 작동 ftp://이 크롬과 크롬이 자동으로 만들어 이후의 URL ftp.freebsd.org/pub/FreeBSD/ftp://ftp.freebsd.org/pub/FreeBSD/

다음으로 사전을 사용하여 셀 값을 저장하고 문자가 이미 셀에 만들어 졌는지 확인합니다.


Brainfuck 검색 주소창 확장

맞습니다! @BrainSteel의 의견을 본 후에 나는 그것을 만들어야한다는 것을 알았습니다. 이것은 당신이 할 경우에만 전체 검색 주소창를 인수하지 않는다 bf, tab. 또한 검색 주소창 API가 이상하기 때문에 검색 주소창에 코드를 전달할 수 없으므로 직접 처리해야합니다. 그래서 나는 내 자신을http:// 검사를 한 다음 탭의 URL을 설정합니다.

웹 스토어에 확장을 설치하는 데 필요한 5 달러를 지불하고 싶지 않다면 수동으로 설치해야합니다. : 그냥 여기에서 우편 다운로드 https://drive.google.com/file/d/0B0qkKIzGc0QiNzBzVUJjZkRIZ0k/view?usp=sharing , 크롬의 확장 페이지로 이동, 압축 해제를 오른쪽 상단에 DEV 모드 옵션 상자를 클릭하고, 압축이 풀린 확장 장치를 넣습니다.

당신이 즐기시기 바랍니다! :)


ftp://URL 에서는 작동하지 않습니다 .
PurkkaKoodari

1
@ Pietu1998 처음에 생각했지만 Chrome이 나를 놀라게했습니다. 주소 표시 줄에 ftp.freebsd.org/pub/FreeBSD/를 입력하면 Chrome에서 ftp : // ftp.freebsd.org/pub/FreeBSD/
Maltysen

@Maltysen 죄송합니다. 이 최적화를 방지하기 위해 의도적으로 해당 URL을 포함했지만 실패한 것 같습니다. 이 URL 은 실제로는 다르지만 Chrome은 실제로 인식하고 추가 할만 큼 똑똑한 것 같습니다 ftp://. 오 잘
orlp

4

C, 140 134 132 138 128 139 바이트

263 + 816 + 911 + 955 + 827 + 1355 + 1779 = 7269 6906 바이트

업데이트 : nutki 덕분에 6 바이트가 적습니다!

128 바이트를 다시 업데이트하십시오. 코드를 읽기 어렵습니다. 이제의 URL도 제거하려고합니다 ftp://.

세 번째는 139 바이트로 업데이트하십시오. 코드는 좀 더 읽기 쉬우 며 불쾌한 정의되지 않은 동작을 제거했습니다. 이제 사이트 이름 앞에가 www.있으면 제거됩니다. 나는 7k 미만 이었지만 Pyth와 함께 Maltysen에 인정해야한다고 생각합니다. 잘 했어.

#define p putchar
a;main(int c,char**V){while(*V[1]++-47);*++V+=1;for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))for(;c-a;a+=c>a?1:-1)p(c>a?43:45);}

조금 풀었다 :

#define p putchar
a;
main(int c,char**V){
    while(*V[1]++-47);
    *++V+=1;
    for(*V+=**V-'w'?0:4;c=**V;*V+=1,p(46))
        for(;c-a;a+=c>a?1:-1)
            p(c>a?43:45);
}

이 코드는 명령 줄에서 URL을 소요하고 변환을 BF으로 만 사용 ., -+. 코드의 문자열을 제거하려는 시도를한다 ftp://, http://, https://, 및 www.BF로 변환하기 전에. 다음은 출력 결과 목록입니다.

google.com/
codegolf.stackexchange.com/questions/47895/
golfscript.com/golfscript/examples.html
en.wikipedia.org/wiki/Percent-encoding
ftp.freebsd.org/pub/FreeBSD/
github.com/isaacg1/pyth/blob/master/doc.txt#L92
ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README

하나의 내부 루프를 사용하는 방법은 무엇입니까 for(;c-a;a+=c>a,a-=c<a)p(c>a?43:45)?
nutki March

@nutki 인상적! 감사합니다!
BrainSteel

"http : //, https : // 또는 ftp : // 이외의 URL로 시작하는 URL이 없다고 가정 할 경우이 솔루션에서 10 바이트를 삭제할 수 있습니다." 귀하의 솔루션은 위의 데이터 세트에서만 작동하므로 데이터 세트가 여전히 올바르게 처리되는 한 원하는대로 가정 할 수 있습니다.
orlp

@orlp Hooray! 그것은 12 바이트와 같이 들립니다! 이 도전에 감사합니다. 정말 재미있었습니다!
BrainSteel

4

Brainfuck, 77 바이트, 점수 = 31647

점수는 codepoint+4모든 캐릭터 의 합입니다 .

+++++[>+++++++++<-]>+[>++>+>++>+>+<<<<<-]>+>->->>--->,[[<.>-]<<.<.<.<.>>>>>,]

EOF = 0 인 BF 구현을 사용합니다.

예:

input:
!bar

output:
+++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]

0

자바 스크립트 (ES6)-137 바이트, 점수-7413

., +및 만 사용합니다 -. Firefox 콘솔에서 테스트 할 수 있습니다.

B=s=>[...s.replace(/^h.+\/\//,'')].map((c,i,a)=>(v=i?c[C]()-a[i-1][C]():c[C='charCodeAt']())?'-+'[v>0|0].repeat(v>0?v:-v):'').join('.')+'.'

이것은 내 점수 카운터입니다.

[
    'https://www.google.com/',
    'http://codegolf.stackexchange.com/questions/47895/',
    'http://www.golfscript.com/golfscript/examples.html',
    'http://en.wikipedia.org/wiki/Percent-encoding',
    'ftp://ftp.freebsd.org/pub/FreeBSD/',
    'https://github.com/isaacg1/pyth/blob/master/doc.txt#L92',
    'http://ftp.gnu.org/non-gnu/nethack/nethack-3.4.0.tar.gz.back-RSN.README'
].map(B).join('').length
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.