Explorar "espaço em branco livre"


20

Suponha que um desafio do codegolf não conte com espaço em branco na duração do seu programa. Engane esse sistema codificando seu script em espaço em branco e jogue um script que decodifique e execute o espaço em branco incorporado.

Exemplo

Minha solução para o Meta Golf Challenge do JBernardo foi codificar o código Sage (ou Python) no espaço em branco e aplicar o golfe no decodificador.

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

A codificação é pegar um script, acrescentar uma nova linha e, para cada caractere cdo script, ord(c)guias de saída seguidas por um espaço. A adição de uma nova linha é necessária, pois estou usando Python e inicio o script scom um espaço.

Pontuação

Uma solução completa contém uma descrição da codificação usada (se for complicada, forneça um script) e um script 'decodificar e executar'. Sua pontuação é o número de caracteres que não são espaços em branco no script decodificar e executar.

Espaço em branco (o idioma) é proibido

Além disso, qualquer idioma que tenha um conjunto completo de operadores que use apenas caracteres de espaço em branco não é permitido: aceitarei a menor pontuação que não seja zero.

Respostas:


8

Golfscript, 12 caracteres

A string delimitada por 'vai antes desses 10 caracteres:

n/{,}%''+~

Cada linha é decodificada em um caractere, cujo valor ASCII (provavelmente Unicode, de fato) é o comprimento da linha.

Infelizmente, se eu tentar colar meu exemplo do Hello World, o Markdown removerá os espaços extras, mesmo em um <pre>bloco.


2
Como o espaço em branco no início de um programa é sempre não-funcional, .n/{,}%+~também funcionaria.
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN tem tudo isso. Ou pelo menos, apenas o módulo certo.


Eu chamo nos enganar, que é um conjunto completo de operadores que não é nada, mas o espaço em branco
aberração catraca

5
Isso não é uma trapaça. É barato, mas aceitável.
usar o seguinte comando

1
Este programa não faz nada. Nenhum dos WS está lá. BOOOOOO !!!! Repita isso com um programa que faça algo útil aqui. Mantenha o uso do Acme :: Bleach, mas aproveite-o.
Thomas Eding

1
@ Trinithis: assim como nenhum dos outros programas apresentados aqui. Por que escolher especificamente este?
JB

Percebi isso e se destaca como o que isso faz, apenas parece que importa.
Thomas Eding

3

Perl, 29

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

Dentro dessa s///aba há um espaço. A codificação é uma codificação ultra básica com espaços, precedida por tabulações.

Tente este na linha de comando:

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

Edit: bem, lol, não consigo encontrar uma maneira apropriada de copiar e colar a guia / espaço mix. Acredite, funciona em casa :) Atualização: lá, ali, codificado comtr


você pode colocar guias com \te nós acreditamos que trabalha com espaços em branco ...
Boothby

@ boothby: oh, melhor do que isso, eu posso \tinterpretar o shell e fazer com que a maldita coisa funcione comprovadamente. Fazendo isso em algumas horas.
JB

3

Javascript

Substitua \tpor uma guia para obter a contagem de caracteres publicados.

Padrão (64 caracteres)

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

Função de seta (49 caracteres)

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

Programa codificador para ambos

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

Substituir (s)=>...na função de seta para s=>...salvar dois bytes
andrewarchi

Manter os espaços entre quaisquer dois carvão e, na pior jsfuck uso para torná-lo trabalho (e melhor uso " t " [ 1 ]para significar "t")
l4m2

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

2

Yabasic (88 caracteres)

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

Use o mesmo programa de codificador da solução C, mas não remova o primeiro caractere. Seu código original deve estar na forma de uma sub-rotina a(), por exemplo:

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

2

C (99 caracteres)

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

Testado apenas com (e talvez só funcione com) GCC.

Programa de codificador correspondente (remova manualmente o primeiro caractere de sua saída):

#include <stdio.h>

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

1

D (101 caracteres)

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

mesma codificação da pergunta (não é necessária a nova linha)


2
O ponto disso é que o espaço em branco é livre. Eu conto 98 caracteres. Sinta-se livre para escrever código legível!
Boothby

1

Bash (somente interno, 44 ​​caracteres)

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

Script do codificador correspondente:

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

Muito agradável. Eu me considero um pouco hacker do Bash e tive que pensar um pouco man.
precisa saber é o seguinte

1

K5, 12 bytes

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

Execute ( .) a string formada a partir dos valores ascii ( `c$) dados pela diferença entre cada par ( -':) dos índices em que ( &) a entrada é uma guia ( 9=" ").

Entrada é uma sequência de caracteres de tabulação e não tabulação, e os valores dos caracteres são codificados no número de não tabulações (espaços ou linhas de linha) entre cada tabulação. Um codificador de exemplo:

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

Execute uma junção em execução começando com um espaço sobre ( " ",/) x espaços ( x#" ") unidos a uma guia ( ,"\t") em que X é cada um de ( {...}') um menos os valores de caracteres da sequência de entrada ( -1+).

Em ação:

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

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

0

Ruby, 43

Muito simples, a codificação está colocando x espaços por linha, onde x é o valor ascii do caractere, a decodificação é inversa.

O script a seguir é apenas um conversor unário ao ASCII e funciona mesmo quando outras coisas além de espaços são livres:

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

Apenas substitua a string vazia pelo programa que mais lhe agrada.

A coisa em um formato mais reutilizável:

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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.