“Ücretsiz boşluk” dan yararlanın


20

Bir codegolf meydan okumasının, programınızın uzunluğundaki boşlukları saymadığını varsayalım. Komut dosyanızı boşluk içine kodlayarak bu sistemi kopyalayın ve gömülü boşluk kodunu çözen ve yürüten bir komut dosyasını golf içine alın.

Misal

Benim çözüm JBernardo 'ın Meta Golf Challenge'ın encode dekoder Adaçayı (veya Python) boşluk içine kodu ve golf oldu.

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

Kodlama, bir komut almak bir yeni satır öne eklemek için, ve her bir karakter için ckomut çıkış ord(c)sekmeleri ardından bir boşluk. Python kullanıyorum ve senaryoyu sbir boşlukla başlattığım için bir satırsonu eklemek gerekiyor .

puanlama

Eksiksiz bir çözüm, kullandığınız kodlamanın açıklamasını içerir (karmaşıksa, bir komut dosyası sağlayın) ve bir 'kod çözme ve yürütme' komut dosyası içerir. Puanınız, kod çözme ve yürütme komut dosyasındaki boşluk olmayan karakterlerin sayısıdır.

Boşluk (dil) yasaktır

Ayrıca, yalnızca boşluk karakterleri kullanan tam bir işleç kümesine sahip olan herhangi bir dile izin verilmez: Sıfır olmayan en düşük puanı kabul edeceğim.

Yanıtlar:


8

Golfscript, 12 karakter

Tarafından sınırlanan dize 'şu 10 karakterden önce gelir:

n/{,}%''+~

Her satır, ASCII (muhtemelen Unicode) değeri satırın uzunluğu olan bir karaktere çözülür.

Maalesef, Hello World örneğimi yapıştırmayı denersem, Markdown fazla boşlukları bir <pre>blokta bile kaldırır .


2
Bir programın başındaki boşluk her zaman işlevsel olmadığı için .n/{,}%+~de çalışır.
Dennis

9

CPAN, 16

use Acme::Bleach;

CPAN her şeye sahiptir. Ya da en azından doğru modül.


Buna hile diyorum, bu boşluktan başka bir şey olmayan tam bir operatör seti
cırcır ucube

5
Bu bir hile değil. Ucuz ama kabul edilebilir.
boothby

1
Bu program hiçbir şey yapmıyor. WS'nin hiçbiri orada değil. BOOOOOO !!!! Lütfen bunu burada yararlı bir şey yapan bir programla yeniden yayınlayın. Acme :: Bleach kullanımını koruyun, ancak faydalanın.
Thomas Eding

1
@trinithis: burada sunulan diğer programların hiçbiri gibi. Neden özellikle bunu seçmelisiniz?
JB

Bunu fark ettim ve bunun yaptığı şey olarak göze çarpıyor, sadece ithal ettiği anlaşılıyor.
Thomas Eding

3

Perl, 29

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

Onun içinde s/// bir sekme sonra boşluk var. Kodlama, sekmelerden önce boşlukları olan ultra temel bir kodlamadır.

Bunu komut satırında deneyin:

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

Düzenleme: iyi, lol, sekme / boşluk karışımı kopyalayıp yapıştırmak için uygun bir yol bulamıyorum. İnan bana, evde çalışıyor :) Güncelleme: orada, orada, ile kodlanmıştr


ile sekmeler koyabilirsiniz \tve biz boşluk ile çalışır inanıyorum ...
boothby

@boothby: oh, bundan daha iyi \t, kabuk tarafından yorumlanabilir ve aslında lanet şeyi açıkça gösterebilirim . Bunu birkaç saat içinde yapıyoruz.
JB

3

JavaScript

değiştirmek \tGönderilen karakter sayısını elde etmek için bir sekme ile .

Standart (64 karakter)

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

Ok işlevi (49 karakter)

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

Her ikisi için enkoder programı

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

İki bayt kaydetmek (s)=>...için ok işlevini değiştirins=>...
andrewarchi

Herhangi bir iki karakter arasındaki boşlukları tutun ve en kötü şekilde çalışmasını sağlamak için jsfuck kullanın (ve " t " [ 1 ]"t" demek için daha iyi kullanın )
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()

C çözümümle aynı kodlayıcı programını kullanın, ancak ilk karakteri silmeyin. Orijinal kodunuz bir altyordam biçiminde olmalıdır a(), örneğin:

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

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

Sadece GCC ile test edilmiştir (ve belki de sadece onunla çalışır).

Karşılık gelen kodlayıcı programı (ilk karakteri çıktısından manuel olarak kaldırın):

#include <stdio.h>

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

1

D (101 karakter)

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

sorudakiyle aynı kodlama (satırsonuna gerek yok)


2
Bunun amacı boşluk boşluğudur. 98 karakter sayıyorum. Okunabilir kod yazmaktan çekinmeyin!
boothby

1

Bash (yalnızca yerleşik karakterler, 44 karakter)

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

Karşılık gelen kodlayıcı komut dosyası:

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

Çok hoş. Kendimi bir Bash hacker olarak görüyorum ve bunu manyapmak için biraz yukarı çıkmak zorunda kaldım .
boothby

1

K5, 12 bayt

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

( .) Girişinin bir sekme olduğu ( ) indekslerin `c$her çifti ( -':) arasındaki fark tarafından verilen ascii değerlerinden ( ) oluşturulan dizeyi yürütün ( )&9=" " ) .

Giriş, sekme ve sekme olmayan karakterlerden oluşan bir dizedir ve karakter değerleri, her sekme arasındaki sekme olmayan (boşluk veya yeni satır) sayısı olarak kodlanır. Örnek bir kodlayıcı:

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

( " ",/) X boşlukları ( x#" ") üzerinde bir sekme ( ,"\t") ile birleştirilen boşlukla başlayarak, X'in ( {...}') her birinin giriş dizesinin ( -1+) karakter değerlerinden bir eksi olduğu bir çalışan birleştirme gerçekleştirin .

Eylemde:

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

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

0

Yakut, 43

Çok basit, kodlama satır başına x boşluk koymak, burada x karakterin ascii değeri, kod çözme tersidir.

Aşağıdaki komut dosyası, ASCII dönüştürücüsü için yalnızca bir addır ve boşluklar dışındaki şeyler serbest olduğunda bile çalışır:

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

Boş dizeyi sizi memnun eden programla değiştirin.

Daha yeniden kullanılabilir bir formatta olan şey:

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.