"자유 공백"활용


20

codegolf challenge가 프로그램 길이에서 공백을 계산하지 않는다고 가정하십시오. 스크립트를 공백으로 인코딩하여이 시스템을 속이고, 포함 된 공백을 해독하고 실행하는 스크립트를 골라냅니다.

JBernardoMeta Golf Challenge 에 대한 나의 해결책 은 Sage (또는 Python) 코드를 공백으로 인코딩하고 디코더를 골프화하는 것이 었습니다.

s = ' '
for c in '<lots of whitespace>'.split(s):
    s+=chr(len(c))
exec s

인코딩은 스크립트를 가져와 줄 바꿈을 추가하고 스크립트의 각 문자마다 c출력 ord(c)탭과 공백을 차례로 사용하는 것입니다. 파이썬을 사용하고 있기 때문에 줄 바꿈이 필요 s하며 공백으로 스크립트 를 시작합니다 .

채점

완전한 솔루션에는 사용하는 인코딩에 대한 설명 (복잡한 경우 스크립트 제공)과 '디코딩 및 실행'스크립트가 포함됩니다. 점수는 디코드 및 실행 스크립트에서 공백이 아닌 문자 수입니다.

공백 (언어)은 금지되어 있습니다

또한 공백 문자 만 사용하는 완전한 연산자 세트가있는 언어는 허용되지 않습니다. 최저 0이 아닌 점수를 허용합니다.

답변:


8

골프 스크립트, 12 자

'10 자로 시작하는 문자열 은 다음과 같습니다.

n/{,}%''+~

각 줄은 하나의 문자로 디코딩되며 ASCII (아마 유니 코드) 값이 줄의 길이입니다.

불행히도 Hello World 예제를 붙여 넣으려고하면 Markdown은 <pre>블록 에서도 여분의 공백을 제거합니다 .


2
프로그램 시작 부분의 공백은 항상 .n/{,}%+~작동 하지 않기 때문에 작동합니다.
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN은 모든 것을 갖추고 있습니다. 또는 적어도 올바른 모듈입니다.


나는 이것에 대해 치트를 호출합니다. 그것은 공백에 지나지 않는 완전한 연산자입니다.
ratchet freak

5
이것은 속임수가 아닙니다. 싸지 만 괜찮습니다.
boothby

1
이 프로그램은 아무것도하지 않습니다. WS가 없습니다. 부우 !!!! 여기서 유용한 것을하는 프로그램으로 이것을 다시 게시하십시오. Acme :: Bleach를 사용하되 활용하십시오.
Thomas Eding

1
@trinithis : 여기에 제시된 다른 프로그램은 없습니다. 왜 이것을 특별히 선택해야합니까?
JB

나는 그것을 알아 차렸고 이것이하는 일로 눈에 띄는 것은 수입품처럼 보입니다.
Thomas Eding

3

펄, 29

$_="";s/     */chr length $&/ge;eval

내부 s///에는 탭이 있고 공백이 있습니다. 인코딩은 공백이있는 초 기본 인코딩이며 탭이 앞에옵니다.

커맨드 라인에서 이것을 시도하십시오 :

$ tr ST ' \t' <<< '$_="TSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"; s/TS*/chr length $&/ge; eval' | perl

편집 : 글쎄, lol, 탭 / 스페이스 믹스를 복사하여 붙여 넣을 수있는 적절한 방법을 찾을 수 없습니다. 날 믿어, 그것은 집에서 작동 :) 업데이트 : 거기, 거기에 인코딩tr


탭을 넣을 수 \t있고 공백과 함께 작동한다고 생각합니다.
boothby

@boothby : 아, 그보다 낫다. 나는 \t쉘에 의해 해석 될 수 있고 실제로 그 일을 입증 할 수있다. 몇 시간 안에 그렇게하세요.
JB

3

자바 스크립트

교체 \t게시 된 글자 수를 얻을 수있는 탭.

표준 (64 자)

eval(eval("'<code here>'".replace(/\t */g,function(s){return"\\"+s.length})))

화살표 기능 (49 자)

eval(eval("'<code here>'".replace(/\t */g,(s)=>"\\"+s.length)))

둘 다를위한 인코더 프로그램

for(var i = 0, si = prompt("Enter the code."), so = ""; i < si.length; ++i) so += '\t' + Array(+si.charCodeAt(i).toString(8)).join(' '); prompt("Here is the result.", so);

(s)=>...화살표 기능을 교체 하여 s=>...2 바이트를 절약하십시오
andrewarchi

두 문자 사이 최악의 사용 jsfuck에서 공간을 유지하는 것은 (그리고보다 효율적으로 사용 그것을 작동하게하는 " t " [ 1 ]"T"를 의미하는)
l4m2

44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2

2

Yabasic (88 자)

a$ = "<code here>"
for a = 1 to len(a$)
    if mid$(a$, a) < " " then b = b + 1
    else b$ = b$ + chr$(b) : b = 0
    endif
next
compile(b$)
a()

내 C 솔루션과 동일한 인코더 프로그램을 사용하지만 첫 번째 문자는 제거하지 마십시오. 원래 코드는 다음과 같은 서브 루틴 형식이어야합니다 a().

sub a():?"hello, world":end sub

2

C (99 자)

main(c, p)
{
    char *s = "<code here>";
    for (p = popen("cc -xc -oa -", "w"); *s;)
        *s++ - 9 ? c -= putc(c, p) : ++c;
    execl("a", pclose(p));
}

GCC로만 테스트되었으며 GCC에서만 작동합니다.

해당 엔코더 프로그램 (출력에서 첫 번째 문자를 수동으로 제거) :

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}

1

D (101 자)

import std.algorithm;mixin((){char[]r;foreach(c;splitter("<lots of whitspace>"," "))r~=cast(char)c.length;return r;}());

질문에서와 동일한 인코딩 (개행이 필요 없음)


2
요점은 공백이 비어 있다는 것입니다. 98자를 셉니다. 읽기 쉬운 코드를 작성하십시오!
boothby

1

배쉬 (내장, 44 자)

IFS=
eval `while read a
do printf '\'${#a}
done<<a
<code here>
a`

해당 엔코더 스크립트 :

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done

아주 좋아요 나는 나 자신을 Bash 해커라고 생각하고, 이것을 깨우기 man위해 조금 올라 가야했다 .
boothby

1

K5, 12 바이트

.`c$-':&9=" "

( .) 입력이 탭 ( ) 인 인덱스의 `c$각 쌍 ( -':)의 차이로 주어진 ASCII 값 ( )으로 구성된 문자열을 실행합니다 ( ).&9=" "

입력은 탭 및 비탭 문자의 문자열이며 문자 값은 각 탭 사이의 비탭 (공백 또는 줄 바꿈) 수로 인코딩됩니다. 인코더 예 :

" ",/{(x#" "),"\t"}'-1+

탭 ( )으로 조인 된 " ",/공백 ( ) x 공백 ( x#" ")으로 시작하는 실행 조인을 수행합니다. ,"\t"여기서 X는 각각 ( {...}') 1에서 입력 문자열 ( -1+) 의 문자 값을 뺀 값입니다 .

실제로 :

  enc: " ",/{(x#" "),"\t"}'-1+
  dec: .`c$-':&9=

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5

0

루비, 43

매우 간단하게 인코딩은 한 줄에 x 개의 공백을 넣습니다. 여기서 x는 char의 ASCII 값이며 디코딩은 반대입니다.

다음 스크립트는 단항을 ASCII로 변환 한 것으로 공백 이외의 항목이 비어있는 경우에도 작동합니다.

eval("".split("\n").map{|x|x.length.chr}.join)

빈 문자열을 원하는 프로그램으로 바꾸십시오.

더 재사용 가능한 형식의 것 :

from_space = lambda {|text| text.split("\n").map{|x| x.length.chr}.join}
to_space = lambda {|text| text.chars.map{|x| " " * x.ord}.join("\n")}

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