Wykorzystaj „wolne białe znaki”

20

Załóżmy, że wyzwanie dla codegolf nie liczy białych znaków w długości twojego programu. Oszukuj ten system, kodując skrypt w białe spacje, i golfuj skrypt, który dekoduje i wykonuje osadzone białe spacje.

Przykład

Moje rozwiązanie do JBernardo „s Meta Golf Wyzwanie było zakodować Sage (lub Python) kod do spacji, a golf dekoder.

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

Kodowanie polega na wzięciu skryptu, wstawieniu nowego wiersza i dla każdego znaku cw skrypcie, ord(c)tabulacji wyjściowych, a następnie spacji. Przygotowanie nowej linii jest konieczne, ponieważ używam Pythona i zaczynam skrypt sspacją.

Punktacja

Kompletne rozwiązanie zawiera opis używanego kodowania (jeśli jest skomplikowane, podaj skrypt) oraz skrypt „dekoduj i wykonaj”. Twój wynik to liczba znaków spacji w skrypcie dekodowania i wykonania.

Biała spacja (język) jest zabroniona

Ponadto jakikolwiek język, który ma pełny zestaw operatorów, które używają tylko białych znaków, jest niedozwolony: zaakceptuję najniższy wynik niezerowy.

boothby
źródło

Odpowiedzi:

8

Golfscript, 12 znaków

Ciąg rozdzielony znakami 'przed następującymi 10 znakami :

n/{,}%''+~

Każda linia jest dekodowana na jeden znak, którego wartość ASCII (prawdopodobnie w rzeczywistości Unicode) jest długością linii.

Niestety, jeśli spróbuję wkleić mój przykład Hello World, Markdown usuwa dodatkowe spacje, nawet w <pre>bloku.

Peter Taylor
źródło
2
Ponieważ białe znaki na początku programu są zawsze niefunkcjonalne, również .n/{,}%+~by działały.
Dennis
9

CPAN, 16

use Acme::Bleach;

CPAN ma to wszystko. A przynajmniej odpowiedni moduł.

JB
źródło
Nazywam to oszustwem, czyli kompletnym zestawem operatorów, który jest niczym innym, jak białą spacją
maniak ratchet
5
To nie jest oszustwo. Jest tani, ale do zaakceptowania.
stoisko
1
Ten program nic nie robi. Nie ma tam żadnej WS. BOOOOOO !!!! Prześlij to ponownie za pomocą programu, który robi coś przydatnego tutaj. Zachowaj użycie Acme :: Bleach, ale skorzystaj z niego.
Thomas Eding,
1
@trinithis: podobnie jak żaden inny program tutaj przedstawiony. Dlaczego warto wybrać właśnie ten?
JB
Zauważyłem to i wyróżnia się tym, co to robi, tylko wygląda na importowane.
Thomas Eding,
3

Perl, 29

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

Wewnątrz s///są zakładka, a następnie spacja. Kodowanie jest ultra-podstawowym kodowaniem ze spacjami, poprzedzonymi tabulatorami.

Wypróbuj ten w wierszu poleceń:

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

Edycja: cóż, lol, nie mogę znaleźć odpowiedniego sposobu na skopiowanie i wklejenie tabulacji / spacji. Uwierz mi, to działa w domu :) Aktualizacja: tam, tam, zakodowanetr

JB
źródło
możesz wstawić tabulatory, \ta my uwierzymy, że to działa z białymi
spacjami
@boothby: och, lepiej niż to, mogę \tinterpretować to przez powłokę i faktycznie mieć cholerną rzecz działającą w widoczny sposób. Robię to za kilka godzin.
JB
3

JavaScript

Zamień \tna tabulator, aby uzyskać liczbę wysłanych znaków.

Standard (64 znaki)

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

Funkcja strzałki (49 znaków)

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

Program enkodera dla obu

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);
Proszę wstać
źródło
Zamień (s)=>...w funkcji strzałki, s=>...aby zapisać dwa bajty
andrewarchi
Zachowaj odstępy między dowolnymi dwoma znakami, a w najgorszym przypadku użyj jsfuck, aby działał (i lepiej użyj, " t " [ 1 ]aby oznaczać „t”)
l4m2
44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
l4m2
2

Yabasic (88 znaków)

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

Użyj tego samego programu kodującego, co w moim rozwiązaniu C, ale nie usuwaj pierwszego znaku. Twój oryginalny kod musi mieć postać podprogramu a(), na przykład:

sub a():?"hello, world":end sub
Proszę wstać
źródło
2

C (99 znaków)

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

Testowane tylko z (i być może działa tylko z) GCC.

Odpowiedni program enkodera (ręcznie usuń pierwszy znak z jego wyjścia):

#include <stdio.h>

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        while (c--) putchar(9);
        putchar(32);
    }
    return 0;
}
Proszę wstać
źródło
1

D (101 znaków)

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

takie samo kodowanie jak w pytaniu (nie ma potrzeby nowego wiersza)

maniak zapadkowy
źródło
2
Chodzi o to, że białe znaki są bezpłatne. Liczę 98 znaków. Zachęcamy do napisania czytelnego kodu!
stoisko
1

Bash (tylko wbudowane, 44 znaki)

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

Odpowiadający skrypt kodera:

od -b | cut -b9- | tr ' ' '\n' | while read a
do
    for (( b = 0; b < $((10#$a)); ++b ))
    do
        echo -n ' '
    done
    echo
done
Proszę wstać
źródło
Bardzo dobrze. Uważam się za trochę hakera Bash i musiałem trochę manpodnieść, żeby się z tym pogryźć.
stoisko
1

K5, 12 bajtów

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

Wykonaj ( .) ciąg utworzony z wartości ascii ( `c$) podanych przez różnicę między każdą parą ( -':) indeksów, gdzie ( &) wejściem jest tab ( 9=" ").

Dane wejściowe to ciąg znaków tabulatorów i tabulatorów, a wartości znaków są zakodowane w liczbie znaków tabulacji (spacji lub znaków nowej linii) między poszczególnymi tabulatorami. Przykładowy koder:

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

Wykonaj działające sprzężenie, zaczynając od spacji ponad ( " ",/) x spacjami ( x#" ") połączonych tabulatorem ( ,"\t"), gdzie X oznacza każdy z ( {...}') jeden minus wartości znaków ciągu wejściowego ( -1+).

W akcji:

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

  enc "2+3"
"                                                  \t                                          \t                                                  \t"
  dec enc "2+3"
5
JohnE
źródło
0

Ruby, 43

Bardzo proste, kodowanie polega na wstawieniu x spacji na linię, gdzie x jest wartością ascii znaku, dekodowanie jest odwrotne.

Poniższy skrypt jest zwykłym konwerterem ASCII i działa nawet wtedy, gdy rzeczy inne niż spacje są wolne:

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

Po prostu zamień pusty ciąg na program, który ci się podoba.

Rzecz w formacie wielokrotnego użytku:

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
źródło