Nutzen Sie "freies Leerzeichen"


20

Angenommen, eine Codegolf-Challenge zählt keine Leerzeichen in der Länge Ihres Programms. Betrügen Sie dieses System, indem Sie Ihr Skript in Leerzeichen kodieren, und spielen Sie ein Skript an, das eingebettete Leerzeichen dekodiert und ausführt.

Beispiel

Meine Lösung JBernardo ‚s Meta Golf Challenge war zu kodieren Sage (oder Python) Code in Leerzeichen und Golf der Decoder.

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

Bei der Kodierung wird ein Skript erstellt, eine neue Zeile vorangestellt und für jedes Zeichen cim Skript werden Ausgaberegisterkarten ord(c)gefolgt von einem Leerzeichen angezeigt . Das Voranstellen einer neuen Zeile ist erforderlich, da ich Python verwende und das Skript smit einem Leerzeichen starte .

Wertung

Eine vollständige Lösung enthält eine Beschreibung der von Ihnen verwendeten Codierung (wenn es kompliziert ist, stellen Sie ein Skript bereit) und ein Skript zum Decodieren und Ausführen. Ihre Punktzahl ist die Anzahl der Nicht-Leerzeichen im Decode-and-Execute-Skript.

Leerzeichen (die Sprache) sind verboten

Darüber hinaus ist jede Sprache, die einen vollständigen Satz von Operatoren enthält, die nur Leerzeichen verwenden, nicht zulässig: Ich akzeptiere die niedrigste Punktzahl ungleich Null.

Antworten:


8

Golfscript, 12 Zeichen

Zeichenfolge, die durch " 'Geht vor diesen 10 Zeichen" begrenzt ist:

n/{,}%''+~

Jede Zeile wird in ein Zeichen dekodiert, dessen ASCII-Wert (wahrscheinlich tatsächlich Unicode) die Länge der Zeile ist.

Wenn ich versuche, mein Hello World-Beispiel einzufügen, entfernt Markdown leider die zusätzlichen Leerzeichen, auch in einem <pre>Block.


2
Da Whitespace zu Beginn eines Programms immer nicht funktionsfähig ist, .n/{,}%+~würde das auch funktionieren.
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN hat alles. Oder zumindest genau das richtige Modul.


Ich nenne das Betrügen, das ist eine ganze Reihe von Operatoren, die nichts als Leerzeichen sind
Ratschenfreak

5
Dies ist kein Betrug. Es ist billig, aber akzeptabel.
Stand

1
Dieses Programm macht nichts. Keiner der WS ist da. BOOOOOO !!!! Bitte posten Sie dies mit einem Programm, das hier etwas Nützliches leistet. Verwenden Sie weiterhin Acme :: Bleach, aber nutzen Sie es.
Thomas Eding

1
@trinithis: wie keines der anderen hier vorgestellten Programme. Warum speziell für diesen auswählen?
JB

Ich habe es bemerkt und es fällt auf als was das macht, es sieht nur so aus als würde es importieren.
Thomas Eding

3

Perl, 29

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

Darin s///befindet sich ein Tabulator und dann ein Leerzeichen. Die Kodierung ist eine ultra-grundlegende Kodierung mit Leerzeichen, denen Tabulatoren vorangestellt sind.

Versuchen Sie dies in der Befehlszeile:

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

Bearbeiten: Nun, lol, ich kann keinen richtigen Weg finden, um den Tab / Space-Mix zu kopieren und einzufügen. Glauben Sie mir, es funktioniert zu Hause :) Update: dort, dort, verschlüsselt mittr


Sie können mit Tabulatoren setzen \tund wir werden glauben, es funktioniert mit Leerzeichen ...
Stand

@boothby: oh, besser als das, ich kann das \tvon der shell interpretieren lassen und habe tatsächlich das verdammte ding nachweislich funktionieren lassen. Mach das in ein paar Stunden.
JB

3

JavaScript

Ersetzen Sie \tdurch einen Tabulator, um die Anzahl der veröffentlichten Zeichen zu erhalten.

Standard (64 Zeichen)

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

Pfeilfunktion (49 Zeichen)

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

Encoderprogramm für beide

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

Ersetzen Sie (s)=>...in der s=>...
Pfeilfunktion

Halte Leerzeichen zwischen zwei Zeichen und benutze im schlimmsten Fall jsfuck, damit es funktioniert (und besser " t " [ 1 ]"t")
l4m2

44Beval("".replace(/ +/g,s=>' []+!()'[s.length]))
14m2

2

Yabasic (88 Zeichen)

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

Verwenden Sie dasselbe Encoderprogramm wie für meine C-Lösung, entfernen Sie jedoch nicht das erste Zeichen. Ihr ursprünglicher Code muss in Form einer Unterroutine vorliegen a(), zum Beispiel:

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

2

C (99 Zeichen)

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

Getestet nur mit (und funktioniert vielleicht nur mit) GCC.

Entsprechendes Encoderprogramm (erstes Zeichen manuell aus der Ausgabe entfernen):

#include <stdio.h>

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

1

D (101 Zeichen)

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

gleiche Kodierung wie in der Frage (kein Zeilenumbruch nötig)


2
Der Punkt dabei ist, dass Leerzeichen frei sind. Ich zähle 98 Zeichen. Fühlen Sie sich frei, lesbaren Code zu schreiben!
Stand vom

1

Bash (nur Builtins, 44 Zeichen)

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

Entsprechendes Encoder-Skript:

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

Sehr schön. Ich betrachte mich als einen Bash-Hacker, und ich musste manein bisschen aufstehen, um das zu schüren.
Stand

1

K5, 12 Bytes

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

Führe ( .) die Zeichenkette aus, die aus den ASCII-Werten ( `c$) gebildet wird, die durch die Differenz zwischen jedem Paar ( -':) der Indizes gegeben sind, wobei ( &) die Eingabe ein Tabulator ist (9=" " ) ist.

Die Eingabe besteht aus einer Folge von Tabulator- und Nicht-Tabulator-Zeichen. Die Zeichenwerte werden in der Anzahl der Nicht-Tabulatoren (Leerzeichen oder Zeilenumbrüche) zwischen den einzelnen Tabulatoren codiert. Ein Beispiel für einen Encoder:

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

Führen Sie einen laufenden Join durch, der mit einem Leerzeichen über ( " ",/) x Leerzeichen ( x#" ") beginnt, die mit einem Tabulator ( ,"\t") verbunden sind, wobei X jeweils {...}'eins minus den Zeichenwerten der Eingabezeichenfolge ist (-1+ ) ist.

In Aktion:

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

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

0

Rubin, 43

Sehr einfach: Beim Kodieren werden x Leerzeichen pro Zeile eingefügt, wobei x der ASCII-Wert des Zeichens ist. Das Dekodieren erfolgt in umgekehrter Reihenfolge.

Das folgende Skript ist nur ein Unary-to-ASCII-Konverter und funktioniert auch dann, wenn andere Dinge als Leerzeichen frei sind:

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

Ersetzen Sie einfach die leere Zeichenfolge durch das Programm, das Ihnen gefällt.

Das Ding in einem wiederverwendbareren Format:

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.