Küme boyutunun aşılması


37

Flash depolamanın güvenilirliğinden bıkmış, tüm programlarınızı eski güzel 1.440 KiB disketlerden birinde saklamaya karar verdiniz. Ancak, 3.000 program bile kopyalanmadığında, disk doluydu. Bu nasıl mümkün olabilir? Sizin gibi kod golf sanatında usta, programlarınızın çoğu 100 bayt bile değil, o yüzden bol miktarda yer kalmalı ...

Süper Kullanıcı hakkında sorduktan sonra, dosya sisteminin küme büyüklüğü , FAT12 tasarımcılarının disketinizin önemli bir bölümünü terk eden ve gerçekte ihtiyaç duyduğunuzdan daha fazla satın almaya zorlayan kötü bir arsası tarafından hatalı olduğunuzu keşfedersiniz .

Daha fazla disket satın alıyor? Asla! Birden fazla programı tek bir dosyaya kaydetmemiz durumunda küme boyutu daha az sorun yaratacaktır, çünkü aynı derleyici / yorumlayıcılar aynı kaynak kod için farklı davranacaktır.

Görev

Tek bir kümeye uyan (512 bayt veya daha az) bir poliglot yazın ve aşağıdaki görevlerin mümkün olan en fazlasını çözer.

  1. Tüm girişi okuyun ve yazdırın.

  2. Merhaba, Dünyayı Yazdır ! .

  3. Giriş olarak bir satırı / argümanı ( isim ) okuyun ve Happy Birthday, [name] 'i yazdırın ! .

  4. Tüm girdileri okuyun ve yazdırın Sekmeleri seviyorum! eğer bir veya daha fazla tablo tablosu içeriyorsa (0x09) ve boşluklardan nefret ederim! eğer değilse.

  5. İki satır / argüman oku ve ikincisi birinci olanın alt dizesiyse, ve eğer değilse sahte bir değer ise, bir gerçek değeri yaz.

  6. Bir çizgi / argüman oku ve eğer karakterleri kesinlikle artan bir düzendeyse, ve eğer değilse sahte bir değerse, gerçeğe uygun bir değer yaz.

  7. Bir çizgi / argüman ve bir karakter okuyun ve bu karakterin tüm oluşumlarının dizinlerini yazdırın.

  8. Bir çizgi / argüman oku ve en fazla tekrarlanan karakterlerden birini yazdır.

  1. 0 ile 255 arasındaki iki tam sayıyı okuyun ve toplamını yazdırın.

  2. 0 ile 255 arasında tek bir tamsayı okuyun ve bölümünün bölüm ve kalanını 7 ile yazdırın .

  3. 1 ile 255 arasındaki tek bir tamsayıyı okuyun ve eğer birleşik sayı (ne 1 ne de asal) değilse, gerçek olmayan bir değer ve eğer değilse sahte bir değer yazın.

  4. 1 ile 255 arasında tek bir tamsayı okuyun ve eğer 2 değerinde bir güçlüyse ve eğer değilse sahte bir değer ise bir gerçeğe uygun değer yazdırın.

  5. 0 ile 255 arasındaki iki tam sayıyı okuyun ve daha büyük olanı yazdırın.

  6. 0 ile 255 arasındaki ondalık bir tamsayıyı oku onaltılı gösterimini yazdırır.

  7. 0 ile 255 arasında tek bir tamsayı okuyun ve Hamming ağırlığını yazdırın (1 bit sayısı).

  8. Tek bir tamsayı Oku n arasındaki 1 ve 13 ve baskı F n , n inci Fibonacci sayı .

    Örneğin, giriş için 13yazdırın 233.

  1. Bir giriş satırını / argümanını oku ve çerçevele

    Örneğin, giriş için şunu Programming Puzzles & Code Golfyazdırın:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Dikdörtgen bir karakter bloğu okuyun ve saat yönünde çeyrek tur çevirin.

    Örneğin, giriş için

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    bunu yazdır:

    This  text
    is  simply
    unreadable
    
  3. 1 ile 40 arasında bir tam sayı okuyun ve bu kenar uzunluğundaki bir elması yazdırın.

    Örneğin, giriş için şunu 3yazdırın:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Bunu yazdır:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

puanlama

Tek bir 512 baytlık kümeye uyan tek bir dosyada en fazla sayıda programın birleştirilmesini sağlayan yanıt kazanır. Bağlar bayt sayısından kopar (alt kısım daha iyidir).

Ek kurallar

  • Puanınız için talep ettiğiniz her görev için, aynı dosya (bayt başına bayt), bu belirli görevi çözen tam bir program - seçtiğiniz bir dilde - oluşturmalıdır.

  • Her görev farklı bir dilde çözülmelidir.

    Diller, aynı dilin farklı versiyonları değilse farklı sayılır. Örneğin, yalnızca bir JavaScript, bir Python ve bir TI-BASIC var, ancak C, C ++, Octave ve MATLAB dört farklı dilde.

  • Her görev için seçilen dil, programlama dilindeki genel tanımımızı yerine getirmelidir .

    Ayrıca, dil 9 Eylül 2015'ten önce yayınlanmış ve uygulanmış olmalıdır.

  • Derleyiciniz / tercümanınız beklenen davranışı sağlamak için standart olmayan bayraklar gerektirmeyebilir.

    Bu kuralın istisnaları, belirli bir dili belirtmek, programı (tek bir) dosyadan okumak veya bir afişi bastırmak için gerekli bayrakları içerir.

  • Her görevin girişi, yazdırılabilir ASCII karakterlerinden (0x20 - 0x7E) ve satır beslemesinden (0x0A) oluşacak ve uzunluğu 255 baytı geçmeyecektir .

  • Görevde aksi belirtilmedikçe tüm tamsayılar ondalık ya da tekdüzen olarak okunabilir.

  • Geçersiz giriş için davranış tanımsız.

  • Girdileri STDIN'den (veya en yakın alternatifinden) veya komut satırı argümanlarından okuyabilirsiniz.

    Bir görevin iki girdi okumasını gerektiriyorsa, bunları - herhangi bir sırayla - seçtiğiniz bir bayt sınırlayıcıyla ayırarak, ayrı komut satırı argümanları veya biri STDIN'den diğeri komut satırı argümanı olarak okuyabilirsiniz.

    Giriş parçalarından biri bir çizgi ise, mümkün olan tek sınırlayıcı bir satır beslemesidir.

  • Çıktıyı STDOUT'a (veya en yakın alternatife) yazdırın. STDERR'ye tüm çıktılar göz ardı edilir.

  • Her görev için standart kuralları uygulanır.

    Özellikle, bu zorluğa açıkça izin verilen çıktının kodlanması dışında varsayılan olarak yasaklanan Loopholes'ları içerir .


1
JavaScript ve CoffeeScript, farklı diller olarak kabul edilebilecek kadar farklı mı?
Downgoat

Evet, bunlar farklı sayılır.
Dennis,

17
meydan
okumanız

Alıntı: STDERR'ye tüm çıktılar göz ardı edilecek. Bu, komut dosyası / programı çağırıp 2>/dev/nullstdout'a doğru çıktıyı aldığımızda , sorun değil mi? Sadece emin olmak için.
Cabbie407 16:15

2
@ Cabbie407 Kesinlikle. Başına meta üzerinde uzlaşma , bu kural aslında varsayılan olarak uygulanır bütün zorluklara. Sadece herkesin bildiğinden emin olmak istedim.
Dennis,

Yanıtlar:


17

12 dil, 418 bayt

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

Bu eğlenceli bir meydan okumadır. Daha fazla dile sığdırmak zorlaşıyor, ancak kalan bu bayt sayısı ile muhtemelen bir tane daha yapabilirim.

2B dillerin gereksiz kullanımını sağlar. Aranda Char unutmayın [ ]üzerinde @-[ ]e<çizgi bir sekme olduğunu. Ayrıca, bu \nTRANSCRIPT'in çalışması için satır sonları gerektirir .

Prelude (Görev 1 / Kedi)

( 
      )?(!?)

?(!?),[.,]BF sadece doğrudan bir çevirisidir . Başlangıç ()döngüleri BF []döngüleri gibi hareket eder , bu nedenle (en soldaki sütundan )ana programa kadar beklemeden her şey.

Prelude'un sözdizimi kuralları, parantezlerin eşleştirilmesi gerektiği anlamına gelir (soldan sağa sütuna doğru okuma) ve sütun başına yalnızca bir parantez olabilir. Bunun dışında, sığması oldukça kolay bir dil.

Emin olun NUMERIC_OUTPUTayarlandığında FalsePython yorumlayıcısı kullanıyorsanız.

TRANSCRIPT (Görev 2 / Merhaba dünya)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT etkileşimli kurguya dayanan tematik bir esolang'dır. TRANSCRIPT tarafından tanınmayan satırlar dikkate alınmaz ve bu sayede kolayca takılabilir.

Tr is here.Bir Trdize değişkeni bildirir ve ikinci satır değişken içeriğini ayarlar Hello, World!. X Tr( Xincelemek için) daha sonra dize çıktılar.

Her ne kadar TRANSCRIPT'e uyması çok kolay olsa da, oldukça ayrıntılı bir dil, bu yüzden en kolay mücadeleye girmesini sağladım.

Fisyon (Görev 3 / Doğum günü mesajı)

R"Happy Birthday, "[?S"!"*
                   \!/

ilk kısmı basarsa, girişi küçük bir 2B döngü ile yakalar, sonra izleyen ünlem işaretini çıkarır. RAnlamına hangi bir atom burada bu program yerde etrafında hareket ettirilebilir çünkü yararlıdır hangi sağa doğru hareket etmeye başlar söyledi.

Demiryolu (Görev 4 / Sekmeler)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Fission gibi, Rail de herhangi bir yere taşınabilme avantajına sahip 2D bir dildir. İcra $, mainfonksiyonun içinden başlar ve güneydoğuya doğru ilerler.

İlk önce \s aşağı yöneliriz, sola döneriz -, vururuz [<tab>]ki bu bir sekmeye basar. e<sonra EOF'ye dayanan şubeler - eğer EOF olursa durur, "I hate spaces!"önce durur ve yazdırırız ; Yukarı doğru gidersek, bir sonraki karakteri okur ve sekmeyle karşılaştırırız, bir kez daha dallar - eğer sekme "I love tabs!"durmadan önce başa basar ve yazdırır , aksi halde aşağı inip giriş döngüsüne devam edin.

Bu program oldukça pahalıdır, ancak TRANSCRIPT Hello World'ü seçtiğinden beri Rail için seçmek zor ve uygun bir iş oldu.

> <> (Görev 6 / Yükselen giriş)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Aksi 1takdirde kesinlikle yükseliyorsa yazdırır 0.

> <> başka bir 2D dilidir ve yürütme sol üstten başlar. "..."dize modudur, iç karakterleri birer birer itin. #IP'yi sola doğru yansıtan ilk dizgeden sonra, daha fazla ip itmek ve vurmadan önce etrafını sarmak (> <> toroidal) \, bizi yukarı doğru yansıtan bir ayna.

Programın altında, .91<bizi hangi noktalara ışınlayan (9, 1), çekirdek programın bulunduğu yer alıyor. Bundan sonra 0[dizeleri tüm önemsiz kaldırır, 0son karakter okumak temsil edecek bir sıfır iter ve bundan sonra sadece emin biz hala yükselen ediyoruz yapım CHARS birer birer okuyor.

Çekirdek programı teleporting yerine aşağı doğru taşımak muhtemelen daha iyidir, ancak gerekirse daha sonra anlatacağım.

Befunge (Görev 9 / Ekleme)

"1\"# &&+.@

Burada bulunan tercüman ile test edilmiştir . Bu oldukça basit bir programdır; işe yaramaz bir ipi basmaya başlar #ve uzayı aşar. Bundan sonra sadece çekirdek programdır &&+.@.

Labirent (Görev 10 / 7'ye Göre Divmod)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Elverişli 've "labirentte yürünebilir bir yol gibi davranan Labirent'teki NOP'lar. Dağınık navigasyonu atlayacağım, fakat ?temel programın başlangıcı olan, başlamadan önce etrafta dolaşmak ve dolaşmak için çok fazla şey var .

Program, Prelude’i hesaba katmak için tamamen temiz değildir (örneğin ?Prelude’deki girdiler okunur).

Python 2 (Görev 14 / Onaltılık)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

xxxS satırlı dizeleri veya yorumlar tarafından yorumladı alakasız bölümleri temsil eder. Arasında print hex(input())çekirdek progam var. Bu bir liderle sonuçlanır 0x, ancak bunun tamam olduğunu varsayarım (değilse bile, kolay bir düzeltmedir).

İlk satır, "1\"# &&+.@\""iki " "s ardından gelen bir dizedir . Bu üç dize ayrıştırıcı tarafından birleştirilir ve kullanılmaz bırakılır (bu ilk satır daha sonra Ruby ve Julia için benzer şekilde çalışır).

GolfScript (Görev 15 / Hamming ağırlığı)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

İlk satır üç karaktere basar ve ikinci satır bir yorumdur. ''''iki dizgiyi daha iter, sonra <<iki karşılaştırma yapar ( syoksayılır). Sonunda, ""'("'başka iki ipi iter.

Tüm bunlar önemsizdir, daha sonra bir diziye sarılarak ve ]0=başlangıçta yığına girdi olan ilk elemanı ( ) alarak kaldırılır . Daha sonra girişi değerlendiririz, ile ~ikili hale getiririz, 2basesonra bitleri toplarız {+}*. Bir sonraki }eşsiz ve programın geri kalanını süper yorumlar.

Julia (Görev 16, Fibonacci)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=çok satırlı bir yorum başlatır ve çok satırlı bir yorum =#bitirir. Çekirdek program, Fibonacci sayılarını ( Rosetta'dan alınan ) hesaplamak için matris üstelleştirmesini kullanır .

Yakut (Görev 17 / ASCII çerçevesi)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Bu program, girişin izleyen bir yeni satır ile bitmediğini varsayar.

Programın çoğunu yorumlayan işe yaramaz bir dize, bir yorum, başka bir işe yaramaz dize, sonra bir yorum yazıcımız var. Bundan sonra çekirdek program, ardından tek bir satır #yorumu var.

CJam (Görev 19 / Elmas)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

İlk satırın sonundaki iki boşluk dizgisi, #=iki ikili operatör olduğu için CJam'ı tatmin etmek içindir . Bununla çok fazla ayrıntıya girmeyeceğim, fakat temelde bir karmaşa var;

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

arasında.

GolfScript ve CJam arasındaki temel fark, CJam'da, tek bir teklifin 'dizeleri başlatıp bitirmemesi, bir sonraki karakteri yığına itmesidir . Bunun anlamı CJam’de

'("'

bir düğmeye basarsa (ilk karakteri olan ) (bir dize başlatır , oysa yukarıdaki GolfScript'te sadece düz bir dizedir."'

Çevrimiçi deneyin . Prelude için hesap 1>yerine kullanılır (.


İşte 12 dilde 373 bayt . Bazı görevler değişti, TRANSCRIPT kaldırıldı (Rail'i çok pahalı yaptı) ve Şema (tavuk) eklendi. Bu, ana gönderiyi güncellemek sonsuza dek sürdüğü için, sadece güncellemeler için golf sahalarım.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Sonlandırılmamış çok satırlı yorumlar STDERR'ye bir hata verdiğinden, Julia için birkaç bayt tasarruf edebilirim.


Harika şeyler. TRANSCRIPT'in görevi nedir?
Cabbie407

@ Cabbie407 Hala hangi dilin hangi görevi aldığını optimize etmeye çalışıyorum, ancak şu anda TRANSCRIPT Hello World'ü aldı ve Rail sekme görevine geçti.
Sp3000

Ah, şimdi anlıyorum ;)ki, uzun açıklama nedeniyle cevabımdaki herhangi bir şeyi değiştirmeyi ertelediğimi anladım. lol
Cabbie407

26

7 8 9 10 dil, 398 431 447 507 bayt

Bu muhtemelen şu anki çözüme en uygun olanı.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

Son satır, SE'nin yememesi için kodlanmış Boşluk kodunu içerir. Kodu çalıştırmak için hepsini Sboşluklarla, Tsekmelerle ve Nyeni satırlarla değiştirin.

C89, görev 16

İşte derleyicinin gördüğü:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Geriye kalan her şey yorum olarak veya içinde çıkarılır #if 0.

C ++, görev 14

Buradan çalınan bir numarayı C89 ve C ++ ' dan ayırt etmek için kullandım .

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Lua, görev 2

İşte temel yapı.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Brainfuck, görev 1

Sadece sonsuz döngü veya başıboş .,s bulunmamasını sağlamak zorunda kaldım . Lua'nın çok satırlı yorumları da BF yorumlarının iki katı. İlk 2 karakterden başka her şey büyük bir NOP döngüsüdür.

++,+-[.,][[,+++.+<--[[<,--[[+<>.++<<.>>+>,,,,,>..--->,+,]]--]]+++-+[++,.]]]

Python, görev 6

Yine NOP'da dile özgü özellikler kullanıyorum veya diğer kodu yorumluyorum.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pyth, görev 17

Pyth bu şey için güzel. Birincisini , yanlışlıkla sessizce çıkan# bir while True:döngü olarak alır . Bu yüzden sadece kodun çoğunu bir dizge haline getiriyorum ( döngüyü erken bitirmekten kaçınmak için), sonra sadece döngüyü sonlandırıyorum, Python yorumu tarafından yaratılan başka birinden çıkıyorum ve görevi yapıyorum. İşte tüm boş olmayan dizeler ile değiştirilir , hala işlevsel olarak eşdeğerdir:;" string "

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, görev 3

Bu çok ilginç. Yürütme, engellerin üstesinden gelmek için gerekli olan sıçramaları kullanarak kodun etrafında zıplar. İlgili parçalar:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Yıldızlı , görev 9

Burada “dil dışındaki bütün karakterleri yok et” dillerine girmeye başladım. Her şey elimden alındı, şöyle görünüyor:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

Kod, sadece kodun başlangıcını ve sonunu kullanarak zor zamanlardan kaçınmak için noktalama işaretlerinin çoğunu bir atlama ile atlar. Kod işlevsel olarak eşdeğerdir

      + +*,  + + +,*.*

Befunge-98, görev 10

> <> One ile benzer şekilde çalışır. Neyse ki, #> <> bir ayna ve Befunge'de bir atlama, bu yüzden farklı davranışlar uygulayabiliriz. Ayrıca 0/0 == 0,.

#if      + 0+0/*^
                >&:7/.7%.@

Boşluk , görev 13

Bu benim uydurduğum son şeydi. İlk birkaç satır sadece "normal" koddaki boşlukları ve yeni satırları içerdiklerinden yığının üzerine sıfırlar. Kod kodlanmış; hepsini Sboşlukla, Tsekmelerle ve Nyeni satırlarla değiştir.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N

9

17 farklı Pip sürümü, 383 bayt (geçersiz)

Bu soru sanal alandayken, Pip Pip'in tüm revizyonlarını taradım ve 17 tanesini kullanarak bir polyglot buldum . Ne yazık ki, aynı dilin sürümleri şimdi meydan okuma kuralları tarafından engelleniyor, ancak Dennis'in izniyle ve feragatname ile çalışmamı yine de gönderiyorum.

Ham kod

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

Strateji

Pip'de küçük harfler değişkendir. Büyük harfler daha karmaşıktır: operatörler veya değişkenler olabilen en fazla iki karakterden oluşan bölümlere ayrılırlar. Bir büyük harf belirteci özellikle bir değişken veya işleç olarak tanımlanmadıysa, sıfır olarak değerlendirilen tanımsız bir değişken olduğu varsayılır.

Bu yüzden, Pip'in iki versiyonunu ayırt etmek için, sadece ikisinin daha yenisine eklenen bazı değişken veya alfabetik bir operatör bulmalıyım. Büyük olanında, bunun yerine sıfır olacaktır. Kod v:uIN[...], test etmek istediğim her sürüm için bu kontrollerden birini içeren büyük bir listeyi bir araya getirir, bu listedeki kaç tane unil olduğunu bulur ( değişken açıkça nil olarak başlatılır) ve sayıyı v("sürüm" için) saklar .

Bazı diğer hesaplamalardan sonra, görevden 17 kişinin sonuçlarını hesaplayan büyük bir liste var ve vbu versiyonun ne olduğuna bağlı olarak birini seçmek için kullanıyor .

Sürümler ve görevler

0.15.09.04

Tanılama: (oTM0,0i)( bir dizgenin her bir ucundan 0 karakter kırpmanın boş dizgiyi vereceği Tri Mişleci ile ilgili bir hata düzeltildi ;

Görev 18: Iv<2W##YqlPBy(kurulum: v2'den küçükse stdin'deki tüm satırları oku ) ve ardından ((J_M ZRVl)|0)Jn(satırların ters listesini, transpoze ve dizgeye geri dönün)

0.15.08.06

Teşhis: EN1(eklenmiş ENişleç operatörü)

Görev 1: Iv<2W##YqlPBy(yukarıdaki ile aynı kurulum kodu) ardından da l?lJnl(yeni hatlara katılın)

0.15.08.03

Teşhis: 1N1( operatörün Nkısa versiyonu olarak eklendi IN)

Görev 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(kurulum: satranç tahtasının üst ve alt yarısını içeren bir liste oluşturun ve depolayın c) ardından cJn(yeni hatta katılın)

0.15.08.01

Teşhis: Y1( Yank operatörü eklendi )

Görev 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(kurulum: v3 ise , pırlantanın üst yarısını içeri yerleştirin d) ardından d.n.RVd(alt yarı için ters çevirin ve yeni hatta katılın)

0.15.06.19

Teşhis: RCk( Rayrıca and Choice operatörü eklendi )

Görev 17: m:'+.'-X#a+2.'+.n."| "(setup: build +----+\n| string in m) ardından bunu m.a.RVm(girişi girişi mve tersine m)

0.15.06.12

Teşhis: k(önceden başlatılmış kdeğişken ", "; önceden tanımlanmamış ve böylece sıfır)

Görev 16: Iv=5La{i+:oSio}(eğer v5 ise , içinde Fibonacci sayısını oluşturun i) ardındani

0.15.06.08 (not: sürüm numarası aşağıdaki işleme kadar değişmedi)

Teşhis: w(önceden başlatılmış wdeğişken `\s+`)

Görev 15: h:$+TBa(girişi ikili ve toplam rakamlara dönüştürün; hdaha sonra görev 12 için sonucu kaydedin )

0.15.05.29

Arıza tespit: (hR`1.+0``&2o`)@>3@AB0

Bu sürüm &, bir regex değişiminin içindeki tüm eşleşen dize için değiştirme deseni olarak eklendi (sed'den esinlenerek). Yukarıdaki kod alır h( 100) ve yerine geçer `&2o`(yani "1002o"daha yeni sürümlerde, ancak yalnızca "&2o"eski sürümlerde). Daha sonra 3. karakterden sonraki tüm karakterleri ( "2o"daha yeni sürümlerde, ""eski sürümlerde) dilimler ve bu dizgiye endekslemeye çalışır. Boş bir dizgiye indekslemek nil verir.

Görev 7: j:ak:b(kurulum: yerel değişkenleri a, bglobal değişkenlere kopyalar j, kböylece bir işlev içinde kullanılabilirler) ardından bunları ({j@aEQk}FI0,#a).s( akarşılık gelen karakterin eşit olduğu endeksleri filtreleyin bve uzayda birleştirin)

0.15.05.26

Tanılama: `u`(Eklenen Desen türü; önceki sürümlerde, geri tepmeler tanınmayan karakterler olarak göz ardı edilir ve ifade u, sıfır olanı değerlendirir )

Görev 14: aTB16(dönüştürmek TO B16 ase)

0.15.05.24

Teşhis: rZ4( rher başvurulandığında 0 ile 1 arasında rastgele bir değer veren özel bir değişken yarattı ; daha önce tanımsızdı ve böylece ifade sıfır olarak değerlendirildi)

Görev 13: a>b?ab(üçlü ifade)

0.15.05.12

Teşhis: rZ4(eklenmiş Zip operatörü)

Görev 12: h=1(15 görevindeki bitlerin toplamı 1 olmalıdır)

0.15.05.11

Teşhis: AB6(eklenmiş ABsolute value operatörü)

Görev 11: Pv=11?a>1&0INa%(2,a)[...]@v(eğer v11 ise , 1giriş 1'den büyükse çıktı ve daha küçük bir sayı tam olarak bölüştürürse, 0aksi takdirde; vbaşka bir şey varsa , vne çıkacağına karar vermek için listeye bir dizin olarak kullanın )

0.15.05.02

Teşhis: ({a}V7)( Voperatör eklendi ; Vtanımlanmadığında bu, nil ve 7 {a}argümanlarını ilk argümanını döndüren bir işleve gönderdi )

Görev 10: a//7.s.a%7(giriş int ile bölünmüş 7 ve mod 7, boşlukla ayrılmış)

0.15.04.26

Teşhis: BN8( Bitwise uygulama Noperatörü eklendi )

Görev 9: a+b

0.15.04.23

Teşhis: AZ( AZbüyük harfle önceden başlatılmış değişken)

Görev 5: bINa( INoluşum sayısını verir)

0.15.04.20

Teşhis: m@0:0ardından9@m

mDeğişken Bu, tamamlama olarak 1000 ile preinitialized olan @operatör Sol taraf dönüş giderilmiştir; daha önce m@0bir uyarı verdi ve hiçbir şey yapmadı. Böylece sonrası hata düzeltme, ilk deyimi setleri miçin 0000yasal endeksidir, 9; ön-düzeltme, yasal bir dizin olmayan mkalır 1000. (Endeksler henüz döngüsel değildi.)

Görev 3: "Happy Birthday, ".a.'!

0.15.04.18

Önceki tüm teşhisler, teşhis listesine bir sıfır eklenmesine neden olur.

Görev 2: "Hello, World!"


Diğer kodların çoğu, çeşitli sürümlerde hataları önlemek için yapmak zorunda kaldığım tweaks. Bu gönderi zaten çok uzun, bu yüzden açıklamamış olduğum herhangi bir şeyi bilmek istiyorsanız, tartışmayı ezoterik diller sohbet odasına alalım .


4

6 dil, 226 bayt (nasıl \x1bkabul edildiğine bağlı olarak 229 !)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Bu yüzden, en iyi dil seçimini yaptığımı düşünmüyorum ve bunun özellikle rekabetçi olmadığını düşünüyorum ama yine de ilginç bir meydan okuma buldum! Genel olarak, pek çok zorluk tamamlanmadı, ancak muhtemelen boşlukta veya benzeri bir şeyde bir meydan okumayı bırakabilirim, ama şu ana kadar sahip olduğum şey şu:


1. Brainfuck

[+.]>>+[>,]<[<]>>[.>]>[<.[],[][,],,[],[].]

Http://copy.sh/brainfuck/ ve http://brainfuck.tk/ adreslerinde test edilmiştir .

Tüm yok sayılan karakterleri çıkardıktan sonra, yukarıdaki program geriye kalan tek şeydir; bu, diğer dilleri sembollerin kullanımını atlamak için bazı ekstra boş döngüler içeren örnek bir cat programıdır.

2. Yakut

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Kullanımı:

ruby cluster

Yukarıdaki tüm yorumlar silindikten sonraki koddur. Sonra biz içeren bir dizi oluşturmak, Befunge-93 ve brainfuck kodu içeren bir normal ifadeleri tanımlayan birinci hattı Ruby tamamen yararsız Hellove Worldve kullanarak baskı printf(ekleyin ,ve !).

3. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Kullanımı:

perl cluster <name>

Ruby'ye çok benzer, bunun dışında bir dizi referansını sakladığımızdan $a, $a[0]boşa erişmeye çalıştığımızdan , 3. sorgusu için metni değiştirebiliriz, Happy Birthdayve pop(komut satırı programındaki son argümanı gösterir) ).

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Kullanımı: tarayıcı konsoluna yapıştırın ve çalıştırın.

Ruby ve Perl aynı birinci hat esas olarak yararsız oluşturur RegExpnesneleri, o zaman bir işe yaramaz dizi depolamak $ave örneğini iki gereksiz dizeleri bir Ruby / Perl kodu ihtiva eden ve bir yeni satır içeren bir ve bir #o zaman, prompt()giriş ve alert()sonuç tahmin meydan okuma için çoğu insan tarafından 4. RegExpBeyin fırtınası döngüsünü kapatmak için başka bir işe yaramaz nesneyle son buluruz.

9. Befunge-93

/&&#[+.#]@

Http://www.quirkster.com/iano/js/befunge.html adresinde test edilmiştir .

Anladığım kadarıyla /, yığını böler ve NaNyukarıdaki alana basmaktan başka kötü bir etkisi olmayan sonucu iter, &bir tamsayı girilmesini ister, böylece istif 9'un gerektirdiği her iki sayıyı da yığına okuruz #; [ki brainfuck için orada, +daha sonra, yığın üzerinde en iyi iki numara ekler ., bunları çıkarır #]tekrar brainfuck ve @çıkışlar.

13. PHP (Bash'de çalışıyor)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Kullanımı:

php cluster <x> <y>

PHP'de <?etiketlere dahil olmayan herhangi bir şey verbatim çıktısıdır, bu yüzden Befunge-93 ve brainfuck kodunu çıkarır, böylece die()derhal kodda oluruz , ilk iki argümandan \x1bcsonra temiz bir ekran çıkar max().


Değişmez ESCape karakterini değişmez dizgeye koyabilirsiniz, sadece orada olduğunu not edin ( the first character in the first string literal is the byte ASCII 27); puanınız 226.
kedi

@ cat Evet, sanırım haklısın, şimdilik olduğu gibi bıraktım ama başlığa 226 yazdım. Bu zorluktan ne kadar zevk aldığımı unuttum, muhtemelen şimdi biraz daha fazlasını yapabilirim ve ES6'yı kullanarak .match'\x09'(burada '`` dır ) belki bir noktada daha fazla ekleyebilir miyim diye bakarım !
Dom Hastings

4

6 dil, 450 404 bayt

bash, brainfuck, C, gawk4, JavaScript ve Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Güncelleme: Biraz aşağı Golf oynadı. Hala başka ne ekleyeceğinden emin değilim ve rakip üyelerin kendi dillerini farklı işler için kullanmayı nasıl düşüneceklerini bilmiyorum. Brainfuck algoritmasını açıklamaya çalışıyorum.

Bu benim ilk poliglot deneyimimdi / öyleydi, bu yüzden her şeyi sıfırdan öğrenmek zorunda kaldım. Awk ile başlamak, sanırım en zekice fikir değildi, çünkü nispeten affedilmez. Tamamlanan görevlerin sayısı önemli olduğundan ilk önce en kolay görevlerle başladım. Bunun akıllıca bir hareket olup olmadığından emin değilim. Bu çok fazla golf değil çünkü bu altıyı birlikte çalışırken sorun yaşamaya başladım, ancak kısa tutabilmek için elimden geleni yaptım.

Dilleri ve alfabetik sırayla yaptıklarını. Hepsini daha ileri düzeyde test etmenin kolay bir yolunu göstereceğim. Bunun bir kısmı sürüme özel olabileceğinden, size kullandığım araçların sürüm numaralarını vereceğim.

bash, görev 3

Evet, sed kullandığım belli. Her nasılsa baştan sona bir senaryo yazmaya çalıştım, ama işe yaramadı, ben de bash yoluna gittim. Bunu bırakma biçimim, bir C yorumunun içinde ve awk bunu değerlendirir False.

sed --version verir sed (GNU sed) 4.2.2

bash --version verir GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Yani baş kısmı aşağı iniyor

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Girişi gruplandırır, yeni bir dizgeye yapıştırır ve sonucu yazdırır. Oldukça yaygın şeyler.

beyin fırtınası, görev 20

Sanırım bu her zaman saklanması oldukça kolaydır. #//İle başlayan bir satır C ve awk tarafından yoksayılır. Ya da en azından arkasındaki çöplerle yaşayabilirler.

bf verir bf - a Brainfuck interpreter version 20041219

Bu yoğunlaştırılmış koddur. İlk satır sadece diğer dillerden gelen çöplerdir.

[,+.-<>.+.++.<>.,,,,[][][++]++<[--][]]
++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<
[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Nasıl çalıştığını açıklamaya çalışacağım

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

bu kaseti ve işaretçiyi buna göre düzenler

0 8 10 46 64 C2 C1
  ^

8 tutma hücresi, bir sonraki döngünün global sayacıdır,
3 aynı satırın basılma sayısıdır.

[>>>>>+++

kümeler C1aynı satır 3'e kadar numaralı

    [<++++

setleri C24'e, "sayısını ....@@@@(başlangıçta) bir çizgide"

        [<<....>....>-]<<<.>>>
    >-]

Sıfır olduğunda C2süreçte azalan tam bir satır, yeni bir satır ve azalmalar basar .
C2C1

eğer C1sıfır ise sihir gerçekleşir

    <<<[>>+<<-]
    <[[>+<-]<]

46, 64'ün ardına taşınırken
, global sayaç bir sağa kaydırılır

>>-]

daha sonra
programın çıkması sıfırsa küresel sayaç azalır

C, görev 2

Buradaki her küçük C yeteneğini "Merhaba, Dünya!" Yazdırarak tüketiyorum. Biri işi yapmak zorunda kaldı ...

gcc --version verir gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

Gerçek C kodu

#define func
func main(){puts("Hello, World!");}
#

Bununla #define functamamıyla uyuşmak. Bunun bir awk işlevi olduğunu düşünüyor. Func kısaltması bir gawk özelliğidir.

gawk4, görev 18

Buradaki hemen hemen her şey için awk kullandığımdan, bunun olması gerektiğine karar verdim.

awk --version verir GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

awk bunu görüyor

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

İçerdiği arama kalıpları \tdeğerlendirir false. Burada sekmeyi seçtim, çünkü girişte olamayacağını düşünüyorum. sedolarak değerlendirir false. "the string"&&0false olarak değerlendirir. Fonksiyon tamam. Herhangi bir giriş için olduğu gibi boş bir kalıp eşleşirse program yürütülür.

Bunu yapar

Giriş

elaic
parli
ucfit
srigs

Çıktı

supe
RCAL
formülü kullanılarak hesaplanmıştır
gili
stic

Tüm giriş hatlarının aynı uzunlukta olduğundan emin olmalısınız. Doldurmak için boşluk kullanın.

JavaScript, görev 9

Bunun yasal olup olmadığından emin değilim, çünkü bu çok kolaydı. Program dosyasına html biten ve bir tarayıcıda açarsanız (Firefox 40.0.3 ve chrome 45.0.2454.85 kullandım) sizden bir giriş yapmanızı ister. Boşluklarla ayrılmış iki sayı girmeniz gerekir, bu da bunların toplamını uyaracaktır.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Minimal-2D , görev 1

Bu yorum satırlarına sığması oldukça kolaydı. Bunu test etmek için python ile çalışan tercümanı kullandım . Girdiyi çıktıya yazdırır. Program bu gibi görünüyor

R,+/D
UL.-L

RUDL sağ, yukarı, aşağı ve sola doğru. Böylece doğru gitmeye başlar, stdin'den belleğe bir karakter okur ve bir tane ekler. Eğik çizgi, bellek 0 değerine sahipse, bir sonraki komutu atlar. -1 değerine sahip bir karakter okunursa, giriş sona erer. Böylece -1 okunursa, D'yi atlar ve sona erer. Başka bir şey okunursa sola doğru iner, 1'i tekrar belleğe ekler ve karakteri stdout'a yazdırır. Sonra sola ve yukarı gider ve baştan başlar.

Test yapmak

Feragatname: Bununla sisteminize yaptığınız zararlardan hiçbir sorumluluk kabul etmiyorum.

Bu, bash & co, gawk (en azından sürüm 4, çünkü bu çok boyutlu dizileri kullanır), gcc, python, bfc yorumlayıcı olarak FireFe ve Firefox yüklü olduğunu varsayar.

Kolaylaştırmak için program kaynağını adlı bir dosyaya kopyalayın cluster.html. Bash görevi için bu dosyayı çalıştırılabilir hale getirin. Minimal-2d tercümanını kopyalayıp minimal2D.pyaynı dizinde adı verilen bir dosyaya yapıştırın . Sonra aşağıdaki betiği kopyalayıp bir komut dosyasına yapıştırın ve aynı dizine yerleştirin, çalıştırılabilir hale getirin ve çalıştırın ... iyi, kiminle konuşuyorum. Eğer bunu okursanız, muhtemelen o kadar çok açıklamaya ihtiyacınız olmayacak ve yine de bir şekilde çalışmasını sağlayacaksınız.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Burada ayrıca testleri ayrı ayrı çalıştırma komutunu da bulabilirsiniz.

İyi eğlenceler!


Beyin fırtınası problemi var; Kodda dengesiz parantezler var ve doğru çalışmayacak (sadece ilgili kısmı değil tüm dosyayı çalıştırmanız gerekiyor). Ayrıca, dama tahtası kareleri aslında metinde daha kare görünmesi için 4x4 yerine 4x3'tür .
PurkkaKoodari 16:15

İpucu için teşekkürler. Peki burada iyi çalışıyor. Her zaman tüm dosyayı betiğimde gördüğünüz gibi çalıştırıyorum. Tercümanın çalıştırmadan önce destekleri kontrol edip etmediğinden emin değil. Benimki umrunda değil. Fakat bu satır sayımını göz ardı ettim. Bunu değiştirmeliyim.
Cabbie407 16:15

Tekrar aradım ve umarım düzelttim.
Cabbie407 16:15
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.