「無料の空白」を活用する


20

codegolfチャレンジは、プログラムの長さの空白をカウントしないとします。スクリプトを空白にエンコードしてこのシステムをごまかし、埋め込まれた空白をデコードして実行するスクリプトをゴルフします。

JBernardoMeta 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文字

で区切られた文字列'は、これらの10文字の前にあります。

n/{,}%''+~

各行は1文字にデコードされ、そのASCII(おそらくUnicode)値は行の長さです。

残念ながら、Hello Worldの例を貼り付けようとすると、Markdownは<pre>ブロック内であっても余分なスペースを削除します。


2
プログラムの先頭の空白は常に機能し.n/{,}%+~ないため、同様に機能します。
デニス

9

CPAN、16

use Acme::Bleach;

CPANはそれをすべて備えています。または、少なくとも適切なモジュール。


私はこれをチートと呼んでいます。これは空白だけの演算子の完全なセットです
ラチェットフリーク

5
これはチートではありません。安いですが、許容範囲です。
ブースバイ

1
このプログラムは何もしません。WSはありません。わーい!ここで何か有用なことをするプログラムでこれを再投稿してください。Acme :: Bleachの使用は維持しますが、活用してください。
トーマスエディング

1
@trinithis:ここで紹介した他のプログラムはありません。なぜこれを特に選ぶのですか?
JB

私はそれに気づき、これが何をするかとして際立っています。
トーマスエディング

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=>...2バイトを保存します
-andrewarchi

任意の2つの文字の間にスペースを空け、最悪の場合はjsfuckを使用して動作させます(" t " [ 1 ]「t」を意味するのに使い
やすい

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文字を数えます。読みやすいコードを書いてください!
ブースバイ

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=" "

.)入力がタブ()であるインデックスの`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

非常に簡単で、エンコードは1行に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.