ใช้ประโยชน์จาก "ช่องว่างฟรี"


20

สมมติว่าการท้าทาย codegolf ไม่นับช่องว่างตามความยาวของโปรแกรม โกงระบบนี้โดยการเข้ารหัสสคริปต์ของคุณลงในช่องว่างและกอล์ฟสคริปต์ที่ถอดรหัสและดำเนินการช่องว่างที่ฝังตัว

ตัวอย่าง

ทางออกของJBernardo 's Meta Golf Challengeคือการเข้ารหัสรหัส Sage (หรือ Python) ลงในช่องว่างและถอดรหัสถอดรหัส

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

การเข้ารหัสคือการใช้สคริปต์เพิ่มบรรทัดใหม่และสำหรับอักขระแต่ละตัวcในสคริปต์ord(c)แท็บเอาต์พุตตามด้วยช่องว่าง การเตรียมการขึ้นบรรทัดใหม่เป็นสิ่งจำเป็นเนื่องจากฉันใช้ Python และฉันเริ่มสคริปต์sด้วยการเว้นวรรค

เกณฑ์การให้คะแนน

โซลูชันที่สมบูรณ์ประกอบด้วยคำอธิบายของการเข้ารหัสที่คุณใช้ (หากซับซ้อนให้สคริปต์) และสคริปต์ 'ถอดรหัสและเรียกใช้งาน' คะแนนของคุณคือจำนวนอักขระที่ไม่ใช่ช่องว่างในสคริปต์ถอดรหัสและเรียกใช้งาน

ห้ามเว้นวรรค (ภาษา)

นอกจากนี้ภาษาใด ๆ ที่มีชุดตัวดำเนินการที่สมบูรณ์ซึ่งใช้เฉพาะอักขระช่องว่างไม่ได้รับอนุญาต: ฉันจะยอมรับคะแนนที่ไม่ใช่ศูนย์ต่ำที่สุด

คำตอบ:


8

Golfscript 12 ตัวอักษร

สตริงคั่นด้วย go 'ก่อน 10 ตัวอักษรเหล่านี้:

n/{,}%''+~

แต่ละบรรทัดจะถอดรหัสเป็นอักขระหนึ่งตัวซึ่ง ASCII (อาจเป็น Unicode โดยแท้จริง) ค่าคือความยาวของบรรทัด

น่าเสียดายถ้าฉันลองวางตัวอย่าง Hello World ของฉัน Markdown จะลบช่องว่างเพิ่มเติมแม้จะอยู่ใน<pre>บล็อก


2
เนื่องจากช่องว่างที่จุดเริ่มต้นของโปรแกรมมักจะไม่สามารถใช้งานได้.n/{,}%+~ก็จะทำงานเช่นกัน
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN มีทุกอย่าง หรืออย่างน้อยก็แค่โมดูลที่เหมาะสม


ฉันเรียกสูตรโกงนี้ว่าเป็นตัวดำเนินการที่สมบูรณ์แบบที่ไม่มีอะไรนอกจากช่องว่าง
ratchet freak

5
นี่ไม่ใช่การโกง มันราคาถูก แต่เป็นที่ยอมรับ
บูธตาม

1
โปรแกรมนี้ไม่ทำอะไรเลย ไม่มี WS อยู่ที่นั่น BOOOOOO !!!! กรุณาโพสต์ใหม่ด้วยโปรแกรมที่มีประโยชน์ที่นี่ ใช้ Acme :: Bleach ต่อไป แต่ใช้ประโยชน์จากมัน
Thomas Eding

1
@trinithis: เช่นเดียวกับไม่มีรายการอื่น ๆ นำเสนอที่นี่ เหตุใดจึงเลือกโดยเฉพาะในอันนี้
JB

ฉันสังเกตเห็นและมันโดดเด่นในสิ่งที่ทำมันดูเหมือนว่าจะนำเข้าเท่านั้น
Thomas Eding

3

Perl, 29

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

ข้างในนั้นs///คือแท็บแล้วเว้นวรรค การเข้ารหัสเป็นการเข้ารหัสแบบพิเศษขั้นพื้นฐานพร้อมช่องว่างนำหน้าด้วยแท็บ

ลองอันนี้ในบรรทัดคำสั่ง:

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

แก้ไข: ดีฮ่า ๆ ฉันไม่สามารถหาวิธีที่เหมาะสมในการคัดลอกวางแท็บผสม / ช่องว่าง เชื่อฉันทำงานที่บ้าน :) อัปเดต: ที่นั่นเข้ารหัสด้วยtr


คุณสามารถใส่แท็บด้วย\tและเราจะเชื่อว่ามันทำงานร่วมกับช่องว่าง ...
บูธบาย

@boothby: โอ้ดีกว่านั้นฉันสามารถ\tตีความโดยเปลือกและจริง ๆ แล้วสิ่งที่เจ้ากรรมทำงานได้อย่างชัดเจน ทำเช่นนั้นในไม่กี่ชั่วโมง
JB

3

JavaScript

แทนที่\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=>...เพื่อบันทึกสองไบต์
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

โปรแกรมตัวเข้ารหัสที่สอดคล้องกัน (ลบอักขระตัวแรกออกจากเอาต์พุตด้วยตนเอง):

#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 ตัวอักษร อย่าลังเลที่จะเขียนโค้ดที่อ่านได้!
บูธตาม

1

Bash (ในตัวเท่านั้น 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ทำแบบนี้นิดหน่อย
บูธตาม

1

K5, 12 ไบต์

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

ดำเนินการ ( .) สตริงที่เกิดขึ้นจากค่า ascii ( `c$) ที่กำหนดโดยความแตกต่างระหว่างแต่ละคู่ ( -':) ของดัชนีที่ ( &) การป้อนข้อมูลเป็นแท็บ ( 9=" ")

อินพุตคือสตริงของอักขระแท็บและไม่ใช่แท็บและค่าอักขระจะถูกเข้ารหัสในจำนวนที่ไม่ใช่แท็บ (ช่องว่างหรือบรรทัดใหม่) ระหว่างแต่ละแท็บ ตัวอย่างการเข้ารหัส:

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

ดำเนินการรวมการรันที่เริ่มต้นด้วยการเว้นวรรค ( " ",/) x ช่องว่าง ( x#" ") รวมกับแท็บ ( ,"\t") โดยที่ X คือแต่ละส่วนของ ( {...}') หนึ่งลบค่าอักขระของสตริงอินพุต ( -1+)

ในการดำเนินการ:

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

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

0

ทับทิม, 43

ตรงไปตรงมามากการเข้ารหัสคือการใส่ช่องว่าง x ต่อบรรทัดโดยที่ x คือค่า ascii ของ char การถอดรหัสจะย้อนกลับ

สคริปต์ต่อไปนี้เป็นเพียงเอกสิทธิ์ในการแปลง 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.