Memanfaatkan "ruang kosong gratis"

20

Misalkan tantangan codegolf tidak menghitung spasi putih dalam panjang program Anda. Cheat sistem ini dengan menyandikan skrip Anda ke dalam spasi putih, dan mainkan skrip yang menerjemahkan dan mengeksekusi spasi kosong.

Contoh

Solusi saya untuk JBernardo 's Meta Golf Challenge adalah untuk encode Sage (atau Python) kode ke spasi, dan golf decoder.

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

Pengkodean adalah untuk mengambil skrip, menambahkan baris baru, dan untuk setiap karakter cdalam skrip, ord(c)tab keluaran diikuti oleh spasi. Membebani baris baru diperlukan karena saya menggunakan Python dan saya memulai skrip sdengan spasi.

Mencetak gol

Solusi lengkap berisi deskripsi pengkodean yang Anda gunakan (jika rumit, berikan skrip), dan skrip 'dekode-dan-jalankan'. Skor Anda adalah jumlah karakter non-spasi putih dalam skrip dekode dan eksekusi.

Spasi (bahasa) dilarang

Selain itu, bahasa apa pun yang memiliki seperangkat operator lengkap yang hanya menggunakan karakter spasi tidak diizinkan: Saya akan menerima skor bukan nol terendah.

stan
sumber

Jawaban:

8

Golfscript, 12 karakter

String dibatasi oleh 'berjalan sebelum 10 karakter ini:

n/{,}%''+~

Setiap baris diterjemahkan ke dalam satu karakter, yang nilai ASCII-nya (mungkin Unicode, sebenarnya) adalah panjang dari garis tersebut.

Sayangnya, jika saya mencoba menempelkan contoh Hello World saya, penurunan harga menghapus ruang tambahan, bahkan di <pre>blok.

Peter Taylor
sumber
2
Karena spasi putih di awal program selalu tidak berfungsi, .n/{,}%+~akan berfungsi juga.
Dennis
9

CPAN, 16

use Acme::Bleach;

CPAN memiliki semuanya. Atau setidaknya, modul yang tepat.

JB
sumber
Saya sebut cheat pada ini, itu adalah satu set lengkap operator yang tidak lain adalah ruang putih
ratchet freak
5
Ini bukan cheat. Murah, tapi bisa diterima.
booth
1
Program ini tidak melakukan apa pun. Tidak ada WS di sana. BOOOOOO !!!! Silakan memposting ulang ini dengan program yang melakukan sesuatu yang bermanfaat di sini. Tetap gunakan Acme :: Bleach, tetapi manfaatkan itu.
Thomas Eding
1
@trinithis: seperti halnya tidak ada program lain yang disajikan di sini. Mengapa memilih yang khusus ini?
JB
Saya perhatikan dan menonjol sebagai apa yang dilakukan ini, hanya terlihat seperti impor.
Thomas Eding
3

Perl, 29

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

Di dalamnya s///ada tab lalu spasi. Pengkodean adalah pengkodean ultra-dasar dengan spasi, diawali dengan tab.

Coba yang ini di baris perintah:

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

Sunting: well, lol, saya tidak bisa menemukan cara yang tepat untuk menyalin-menempelkan campuran tab / spasi. Percayalah, ia bekerja di rumah :) Perbarui: di sana, di sana, dikodekan dengantr

JB
sumber
Anda dapat menggunakan tab \tdan kami akan percaya itu bekerja dengan spasi ...
boothby
@ bbyby: oh, lebih baik dari itu, saya bisa \tmengartikannya dengan shell dan benar-benar membuat benda sialan itu bekerja dengan baik. Melakukan itu dalam beberapa jam.
JB
3

JavaScript

Menggantikan \t dengan tab untuk mendapatkan jumlah karakter yang diposting.

Standar (64 karakter)

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

Fungsi panah (49 karakter)

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

Program encoder untuk keduanya

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);
Tolong berdiri
sumber
Ganti (s)=>...dalam fungsi panah s=>...untuk menyimpan dua byte
andrewarchi
Jaga jarak antara dua karakter dan paling buruk gunakan jsfuck untuk membuatnya berfungsi (dan lebih baik gunakan " t " [ 1 ]untuk berarti "t")
l4m2
44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2
2

Yabasic (88 karakter)

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

Gunakan program encoder yang sama dengan solusi C saya, tetapi jangan hapus karakter pertama. Kode asli Anda harus dalam bentuk subrutin a(), misalnya:

sub a():?"hello, world":end sub
Tolong berdiri
sumber
2

C (99 karakter)

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

Diuji hanya dengan (dan mungkin hanya bekerja dengan) GCC.

Program encoder yang sesuai (secara manual menghapus karakter pertama dari hasilnya):

#include <stdio.h>

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

D (101 karakter)

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

pengkodean yang sama seperti pada pertanyaan (tidak perlu untuk baris baru)

ratchet freak
sumber
2
Intinya adalah ruang putih itu gratis. Saya menghitung 98 karakter. Jangan ragu untuk menulis kode yang dapat dibaca!
Stanby
1

Bash (khusus builtin, 44 karakter)

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

Script encoder yang sesuai:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done
Tolong berdiri
sumber
Sangat bagus. Saya menganggap diri saya sedikit peretas Bash, dan saya harus manbangun sedikit untuk melakukan ini.
boothby
1

K5, 12 byte

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

Jalankan ( .) string yang terbentuk dari nilai ascii ( `c$) yang diberikan oleh perbedaan antara masing-masing pasangan ( -':) dari indeks di mana ( &) inputnya adalah tab (9=" " ).

Input adalah string karakter tab dan non-tab, dan nilai karakter dikodekan dalam jumlah non-tab (spasi atau baris baru) antara masing-masing tab. Encoder contoh:

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

Lakukan sambungan lari yang dimulai dengan spasi lebih dari ( " ",/) x spasi ( x#" ") bergabung dengan tab (,"\t" ) di mana X adalah masing-masing ( {...}') satu dikurangi nilai karakter dari string input ( -1+).

Dalam aksi:

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

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5
JohnE
sumber
0

Ruby, 43

Sangat mudah, pengkodean menempatkan x spasi per baris, di mana x adalah nilai ascii dari char, decoding terbalik.

Script berikut ini hanya konverter unary ke ASCII dan berfungsi bahkan ketika hal-hal selain spasi gratis:

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

Ganti saja string kosong dengan program yang Anda sukai.

Masalahnya dalam format yang lebih dapat digunakan kembali:

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"
Caridorc
sumber