Khai thác những khoảng trắng miễn phí


20

Giả sử một thách thức codegolf không tính khoảng trắng trong thời lượng chương trình của bạn. Gian lận hệ thống này bằng cách mã hóa tập lệnh của bạn vào khoảng trắng và đánh vào tập lệnh giải mã và thực thi khoảng trắng được nhúng.

Thí dụ

Giải pháp của tôi cho Meta Golf Challenge của JBernardo là mã hóa mã Sage (hoặc Python) vào khoảng trắng và đánh gôn bộ giải mã.

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

Việc mã hóa là lấy một tập lệnh, thêm một dòng mới và cho mỗi ký tự ctrong tập lệnh, ord(c)các tab đầu ra được theo sau bởi một khoảng trắng. Chuẩn bị một dòng mới là cần thiết vì tôi đang sử dụng Python và tôi bắt đầu tập lệnh svới một khoảng trắng.

Chấm điểm

Một giải pháp hoàn chỉnh chứa mô tả về mã hóa bạn sử dụng (nếu nó phức tạp, cung cấp tập lệnh) và tập lệnh 'giải mã và thực thi'. Điểm của bạn là số lượng ký tự không phải khoảng trắng trong tập lệnh giải mã và thực thi.

Khoảng trắng (ngôn ngữ) bị cấm

Hơn nữa, bất kỳ ngôn ngữ nào có một bộ toán tử hoàn chỉnh chỉ sử dụng các ký tự khoảng trắng đều không được phép: Tôi sẽ chấp nhận điểm số khác không thấp nhất.

Câu trả lời:


8

Golf, 12 ký tự

Chuỗi được phân định bằng cách 'đi trước 10 ký tự này:

n/{,}%''+~

Mỗi dòng được giải mã thành một ký tự, có giá trị ASCII (có thể là Unicode, trên thực tế) là độ dài của dòng.

Thật không may nếu tôi thử dán ví dụ Hello World của mình, Markdown sẽ xóa các khoảng trắng thừa, ngay cả trong một <pre>khối.


2
Vì khoảng trắng ở đầu chương trình luôn không có chức năng, .n/{,}%+~nên cũng sẽ hoạt động.
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN có tất cả. Hoặc ít nhất, chỉ cần mô-đun đúng.


Tôi gọi cheat về điều này, đó là một tập hợp các toán tử hoàn chỉnh không có gì ngoài khoảng trắng
ratchet freak

5
Đây không phải là một trò gian lận. Nó rẻ, nhưng chấp nhận được.
gian hàng

1
Chương trình này không làm gì cả. Không có WS nào ở đó. BOOOOOO !!!! Vui lòng đăng lại cái này với một chương trình làm một cái gì đó hữu ích ở đây. Giữ Acme :: Bleach sử dụng, nhưng tận dụng nó.
Thomas Eding

1
@trinithis: cũng như không có chương trình nào khác được trình bày ở đây. Tại sao chọn cụ thể trên cái này?
JB

Tôi nhận thấy nó và nó nổi bật như một cái gì đó làm điều này, nó chỉ trông giống như nó nhập khẩu.
Thomas Eding

3

Perl, 29

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

Bên trong đó s///là một tab sau đó là một khoảng trắng. Mã hóa là một mã hóa cực kỳ cơ bản với các khoảng trắng, đứng trước các tab.

Hãy thử cái này trên dòng lệnh:

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

Chỉnh sửa: tốt, lol, tôi không thể tìm thấy một cách thích hợp để sao chép-dán hỗn hợp tab / không gian. Tin tôi đi, nó hoạt động ở nhà :) Cập nhật: ở đó, ở đó, được mã hóa vớitr


bạn có thể đặt các tab vào \tvà chúng tôi tin rằng nó hoạt động với khoảng trắng ...
boothby

@boothby: oh, tốt hơn thế, tôi có thể \tgiải thích bằng cái vỏ và thực sự có những thứ chết tiệt hoạt động mạnh mẽ. Làm điều đó trong một vài giờ.
JB

3

JavaScript

Thay thế \tbằng một tab để có được số lượng ký tự được đăng.

Tiêu chuẩn (64 ký tự)

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

Chức năng mũi tên (49 ký tự)

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

Chương trình mã hóa cho cả hai

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

Thay thế (s)=>...trong hàm mũi tên s=>...để lưu hai byte
andrewarchi

Giữ khoảng cách giữa hai char bất kỳ và tệ nhất là sử dụng jsfuck để làm cho nó hoạt động (và sử dụng tốt hơn " t " [ 1 ]có nghĩa là "t")
l4m2

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

2

Yabasic (88 ký tự)

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

Sử dụng chương trình mã hóa tương tự như đối với giải pháp C của tôi, nhưng không xóa ký tự đầu tiên. Mã ban đầu của bạn phải ở dạng chương trình con a(), ví dụ:

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

2

C (99 ký tự)

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

Chỉ được thử nghiệm với (và có lẽ chỉ hoạt động với) GCC.

Chương trình mã hóa tương ứng (xóa thủ công ký tự đầu tiên khỏi đầu ra của nó):

#include <stdio.h>

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

1

D (101 ký tự)

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

mã hóa giống như trong câu hỏi (không cần dòng mới)


2
Điểm của điều này là khoảng trắng là miễn phí. Tôi đếm 98 ký tự. Hãy viết mã dễ đọc!
gian hàng

1

Bash (chỉ có nội dung, 44 ký tự)

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

Kịch bản mã hóa tương ứng:

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

Rất đẹp. Tôi tự coi mình là một hacker của Bash và tôi đã phải mantăng cường một chút để tìm kiếm điều này.
gian hàng

1

K5, 12 byte

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

Thực thi ( .) chuỗi được hình thành từ các giá trị ascii ( `c$) được cung cấp bởi sự khác biệt giữa mỗi cặp ( -':) của các chỉ số trong đó ( &) đầu vào là một tab ( 9=" ").

Đầu vào là một chuỗi các ký tự tab và không phải tab và các giá trị ký tự được mã hóa theo số lượng không phải tab (khoảng trắng hoặc dòng mới) giữa mỗi tab. Một bộ mã hóa ví dụ:

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

Thực hiện bắt đầu chạy kết hợp với " ",/khoảng trắng trên ( ) x dấu cách ( x#" ") được nối với tab ( ,"\t") trong đó X là mỗi ( {...}') một trừ đi các giá trị ký tự của chuỗi đầu vào ( -1+).

Trong hành động:

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

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

0

Ruby, 43

Rất đơn giản, mã hóa đặt x khoảng trắng trên mỗi dòng, trong đó x là giá trị ascii của char, giải mã ngược lại.

Kịch bản sau đây chỉ là một trình chuyển đổi đơn nhất sang ASCII và hoạt động ngay cả khi những thứ khác ngoài không gian là miễn phí:

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

Chỉ cần thay thế chuỗi trống bằng chương trình làm hài lòng bạn.

Điều trong một định dạng có thể tái sử dụng nhiều hơn:

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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.