Sebuah Chrestomathy of Obscurity

11

Anda harus menyelesaikan empat tugas dalam bahasa yang:

  • tidak boleh mengembalikan hasil * saat dicari di situs web (codegolf.se) ini, misalnya ToffeeScript ;
  • harus memiliki halaman yang terdaftar di Esolang , Rosetta Code atau Wikipedia ;
  • menjadi bahasa yang berbeda, bukan versi yang berbeda (misalnya python 2.1 akan valid jika python memenuhi dua kriteria pertama).

* Pengecualian untuk hit ini untuk ToffeeScript.

Empat tugas yang harus Anda selesaikan adalah:

1) Tulis deskripsi / promosi tweetable (<140 karakter) dari bahasa pilihan Anda.

2) Cetak "Hello World! Ini ditulis <programming language name>."

3) Cetak semua angka ganjil dalam rentang yang ditentukan pengguna. (misalnya stdin dari 20 25harus kembali 21 23 25).

4) Tulis program yang menurut Anda paling baik menunjukkan fitur menarik dari bahasa pilihan Anda.

Mencetak:

  • Ini adalah kontes popularitas
  • Bonus 10 poin jika terdaftar di dua direktori di atas, 25 jika di ketiganya.
  • Skor adalah penjumlahan suara yang diterima pada tengah malam UTC pada 1 Juli 2015, ditambah bonus.

Klarifikasi:

  • Tugas 1) dapat berupa program tweetable tetapi teks biasa juga dapat diterima.
  • Banyak bahasa tidak memiliki juru bahasa yang ada; solusi untuk ini baik-baik saja, tetapi akan diambil dengan itikad baik.
  • Kriteria kedua untuk pilihan bahasa melarang halaman yang tanggal pembuatannya setelah posting ini. Jika, untuk bahasa tertentu, X, solusi untuk masalah ada pada Rosetta Code tetapi tidak memiliki halaman yang berbeda di suatu tempat, itu masih dapat diterima.
Kieran Hunt
sumber
4
Anda sedang berbicara dengan programmer, Anda tidak perlu mengatakan and/or;)
undergroundmonorail
2
"Harus mengembalikan hasil" harus diambil secara harfiah? Misalnya ada hasil untuk " mond ", tetapi tentu saja Mond tidak sama dengan di jawabannya. Apakah itu dihitung sebagai hasil?
manatwork
2
Anda mungkin harus menyatakan bahwa halaman-halaman di Esolangs, Rosetta Code atau Wikipedia harus sudah ada sebelum tantangan ini.
Martin Ender
1
Bisakah Anda menjelaskan apakah tugas 1 membutuhkan program 140 karakter yang menghasilkan deskripsi, atau hanya deskripsi 140 karakter (yang bukan program)?
trichoplax
1
Saya telah mengklarifikasi poin yang diajukan di sini (setidaknya saya harap saya punya!) Di atas
Kieran Hunt

Jawaban:

6

BlooP

Bonus: 10

Ada halaman untuk BlooP di Esolangs dan Wikipedia . Pencarian PPCG untuk BlooP tidak menghasilkan apa-apa. Jika Anda merasa sangat gila, Anda dapat mencobanya di repl.it .


Tugas 1: Tweet

BlooP: Hanya loop yang dibatasi. ;) #programming #goodtimes

Ini menggunakan gaya Twitter standar termasuk tagar dan emotikon. Ini akan menarik bagi setiap pengguna Twitter. *


Tugas 2: The Hello World

DEFINE PROCEDURE ''GREETING'' [N]:
BLOCK 0: BEGIN
  PRINT['Hello World! This is written in BlooP.']
BLOCK 0: END.

GREETING[0];

Seperti yang Anda lihat, ini adalah bahasa golf yang utama. *


Tugas 3: Angka Ganjil

DEFINE PROCEDURE ''IS-ODD'' [N]:
BLOCK 0: BEGIN
  OUTPUT <= 0;
  CELL(0) <= 2;
  LOOP AT MOST N+1 TIMES:
  BLOCK 1: BEGIN
    IF N+1 = CELL(0), THEN:
    BLOCK 2: BEGIN
      OUTPUT <= 1;
      ABORT LOOP 1;
    BLOCK 2: END;
    CELL(0) <= CELL(0) + 2
  BLOCK 1: END;
BLOCK 0: END.

DEFINE PROCEDURE ''ODDS-IN-RANGE'' [A,B]:
BLOCK 0: BEGIN
  CELL(0) = A;
  LOOP AT MOST B TIMES:
  BLOCK 1: BEGIN
    IF CELL(0) > B, THEN:
    ABORT LOOP 1;
    IF IS-ODD[CELL(0)] = 1, THEN:
    PRINT[CELL(0)];
    CELL(0) <= CELL(0) + 1;
  BLOCK 1: END;
BLOCK 0: END.

ODDS-IN-RANGE[20,25];

Satu-satunya operator yang tersedia di BlooP adalah penugasan ( <=), penjumlahan, perkalian, lebih dari, kurang dari, dan sama dengan. Karena sintaks verbose yang menyakitkan, sebenarnya cukup mudah untuk mengatakan apa yang terjadi bahkan tanpa pemahaman mendalam tentang bahasa tersebut.


Tugas 4: Yang Menarik

Catatan: Cuplikan saya untuk tugas ini dapat berubah jika saya membuat sesuatu yang lebih menarik.

DEFINE PROCEDURE ''MINUS'' [M,N]:
BLOCK 0: BEGIN
  IF M < N, THEN:
  QUIT BLOCK 0;
  LOOP AT MOST M + 1 TIMES:
  BLOCK 1: BEGIN
    IF OUTPUT + N = M, THEN:
    ABORT LOOP 1;
    OUTPUT <= OUTPUT + 1;
  BLOCK 1: END;
BLOCK 0: END.

DEFINE PROCEDURE ''FIB''[N]:
BLOCK 0: BEGIN
  IF N < 1, THEN:
  QUIT BLOCK 0;
  OUTPUT <= 1;
  IF N < 3, THEN:
  QUIT BLOCK 0;
  OUTPUT <= FIB[MINUS[N,1]] + FIB[MINUS[N,2]];
BLOCK 0: END.

FIB[10];

Lihatlah, angka-angka Fibonacci.


* Mungkin tidak benar

Alex A.
sumber
5

Mond *

  • * Mencari 'Mond' memberikan satu hasil (walaupun jawaban ini), tetapi itu adalah false positive dan tidak benar-benar menyebutkan bahasa.
  • Halaman Kode Rosetta . Ini sebenarnya dibuat setelah tantangan diposting, namun solusi untuk tugas QuickSort telah ada sejak September 2014.
  • Meskipun mond terlihat sangat mirip dengan JavaScript (memang, cukup mudah untuk menulis polyglots Mond / JS), itu bukan subset, superset, atau implementasi ulang. Ini adalah bahasa yang berbeda.

Cobalah di browser Anda

Pengungkapan penuh : Saya terlibat dalam proses pengembangan dan desain Mond hingga tingkat tertentu dan secara pribadi telah mengimplementasikan beberapa fitur bahasa utama termasuk operator yang ditentukan pengguna yang diperlihatkan dalam tugas 3 & 4.

Tugas 1

Operator pipa ( |>) adalah gula sintaks yang mengubah panggilan fungsi di sisi kanan menjadi panggilan fungsi dengan nilai di sisi kiri dimasukkan sebagai argumen pertama. foo |> bar()adalah sama dengan bar( foo ).

"Simple, elegant scripting language implemented in C# for .NET/Mono" |> printLn();

Tugas # 2

"Hello World! This is written in Mond." |> printLn();

Tugas # 3

Kode untuk tugas ini mengasumsikan beberapa hal:

  1. Kisaran angka akan dimasukkan pada satu baris
  2. Batas atas dan bawah akan dipisahkan oleh satu ruang
  3. Angka-angka yang diberikan adalah bilangan bulat di basis-10 dan hanya berisi karakter 0-9

Coba di sini

// parse a string to a number
fun toNumber( str ) {
    var n = 0, pow = str.length();

    for( var i = 0; i < str.length(); ++i )
        n += ( str.charCodeAt( i ) - 48 ) * ( 10 ** --pow );

    return n;
}

fun map( arr, fn ) {
    var ret = [ ];

    foreach( var item in arr )
        fn( item ) |> ret.add();

    return ret;
}

// user-defined operator to create an upper-bound inclusive range a-la Ruby
// (i.e. 1 .. 5 produces [ 1, 2, 3, 4, 5 ])
seq( .. )( start, end ) {
    for( var i = start; i <= end; ++i )
        yield i;
}

// read a line from STDIN, trim leading and trailing whitespace,
// split the string to an array, map the array to parse all strings to numbers.
var nums = readLn().trim().split( " " ) |> map( toNumber );

// nums[0] .. nums[1] makes use of the user-defined operator declared on line 22.
// nums[0] is the lower bound, nums[0] is the upper bound.
foreach( var n in nums[0] .. nums[1] ) {
    if( n % 2 != 0 ) printLn( n );
}

Tugas # 4

Tugas ini mendemonstrasikan operator yang ditentukan pengguna , yang memungkinkan programmer untuk mendefinisikan operator yang sewenang-wenang (asalkan belum ada) seperti fungsi, dan menggunakannya seperti yang akan mereka lakukan pada operator lain. Mereka datang dalam rasa unary dan biner.

Coba di sini .

// forward function compositing user-defined operator.
// the function on the right-hand side is called with
// the result of the function on the left-hand side.
fun( >>> )( fn1, fn2 ) {
    return fun( ...args ) {
        return fn1( ...args ) |> fn2();
    };
}

// the mythical "goes down to" operator of legend.
// a lazy sequence that returns all numbers starting from 'hi'
// down to (and including) 'lo'
seq( --> )( hi, lo ) {
    for( var i = hi; i >= lo; --i )
        yield i;
}

seq map( iterable, callback ) {
    foreach( var item in iterable )
        yield item |> callback();
}

// doubles the value of n
fun double( n ) -> n *  2;

// squares the value of n (** is the power operator, a-la Python or Ruby)
fun square( n ) -> n ** 2;

// gets the sequence for 10 down to 0, passes it into
// map, which maps it through the composited function of
// double and square, which first doubles the given value
// then squares it.
var nums = ( 10 --> 0 ) |> map( double >>> square );

foreach( var n in nums )
    printLn( n );
Tony Ellis
sumber
4
Itu hanya terdaftar di Rosetta Code, bagaimana cara mendapatkan bonus 25 pt?
Scimonster
@Scimonster Interpretasi saya tentang bonus penilaian adalah bahwa bahasa tersebut harus memiliki 0 hasil pencarian, dicantumkan pada salah satu dari: Kode Rosetta, Esolang, atau Wikipedia, dan menjadi bahasa yang berbeda untuk memenuhi syarat untuk 25 poin. Jika saya salah dan satu-satunya kriteria adalah bahwa itu harus memiliki halaman pada Kode Rosetta, Esolang, dan Wikipedia, saya akan mengedit sesuai.
Tony Ellis
Tidak, 3 hal yang Anda daftarkan adalah kriteria untuk diizinkan dalam tantangan sama sekali. Itu memenuhi syarat untuk bonus 10 poin jika, katakanlah, Wikipedia dan Kode Rosetta keduanya mencantumkannya. Bonus 25 poin adalah jika ada di Rosetta, Esolang, dan Wikipedia.
Scimonster
@Scimonster saya mengerti, kesalahan saya. Saya telah memperbarui jawaban saya.
Tony Ellis
4

jq

Tak satu pun dari 14 hasil pada codegolf.se adalah tentang bahasa. ( jq(dan varian huruf besar) tampaknya sering pernyataan dalam Pyth.)

Ada kategori jq pada Kode Rosetta .

Anda dapat mencobanya secara online tetapi beberapa contoh di bawah ini membutuhkan versi terbaru 1.5.

Tugas 1: Tweet

jq seperti sed untuk JSON; Anda dapat menggunakannya untuk memproses data terstruktur dengan kemudahan yang sama seperti sed, awk, grep, dan teman memungkinkan Anda bermain dengan teks

(Tanpa malu-malu mengubah paragraf pertama dari situsnya.)

Tugas 2: The Hello World

bash-4.3$ jq -n -r '"Hello World! This is written in jq."'
Hello World! This is written in jq.

Tugas 3: Angka Ganjil

bash-4.3$ jq -R 'split(" ") | range(.[0] | tonumber; .[1] | tonumber + 1) | select(. % 2 == 1)' <<< '20 25'
21
23
25

Tugas 4: Yang Menarik

File ~ / .mozilla / firefox / *. Default / extensions.json yang berisi informasi tentang ekstensi Firefox yang diinstal memiliki 0 baris baru dalam 171 Kb pada data JSON, yang membuatnya sulit dibaca.

Cukup cetak data JSON:

bash-4.3$ jq '' ~/.mozilla/firefox/*.default/extensions.json

Doh. 8000 ++ baris terlalu panjang, jadi berikan ke pager, tetapi tetap sorot:

bash-4.3$ jq -C '' ~/.mozilla/firefox/*.default/extensions.json | less -r

Aduh. Berapa banyak ekstensi yang ada?

bash-4.3$ jq '.addons | length' ~/.mozilla/firefox/*.default/extensions.json
58

Ok, tetapi beberapa dari mereka dinonaktifkan. Berapa tepatnya?

bash-4.3$ jq '[.addons[] | select(.active | not)] | length' ~/.mozilla/firefox/*.default/extensions.json
7

Beberapa dari mereka cukup ditinggalkan dan tidak berfungsi dengan Firefox saat ini lagi:

bash-4.3$ jq -r '.addons[] | [.defaultLocale.name, (.targetApplications[] | select(.id == "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"))] | select(.[1].maxVersion | gsub("[^\\d.]"; "") | tonumber < 38.0) | .[0]' ~/.mozilla/firefox/*.default/extensions.json
Unity Desktop Integration
Unity Websites integration
Ubuntu Firefox Modifications

(Ini nanti tidak benar. Untuk beberapa alasan ekstensi.json berisi rentang versi lain dari install.rdf ekstensi. Tapi itu bukan kesalahan jq.)

manatwork
sumber
4

ooc

Ya, saya terlambat satu bulan. Terus???

Tugas 1

ooc adalah bahasa pemrograman yang mengkompilasi ke C99 yang memiliki sintaks elegan, dan mendukung pengembangan level tinggi dan rendah.

135 byte! Hampir saja!

Juga, poin bonus palsu untuk logo ASCII-art ooc yang keren :

           +(NNhBBhss+'                  ~+'(sNBND=~.         
           -(=NDhNN+=+=' .   .  .    . .+='+~DNND+=.          
           .+-DBDDh+(D-<'      .....  -<+ (=~DNh+<(           
            '+<NNNB=~=z-(<-<<(+('-'~<<=- .+'sBNh~+            
             (~=NNND+=DB~(-.    . .    ...(=BNB+s--      ALL YOUR 
             .=-=DBDz-'~. .   ..'. .... '  '~s<<szh<.         
               <(~'. .  .  ..sD='-~'-'-DDs.. . .~sD(     CODEBASE  
            . ~+'  '  .-(-..sBNB~(~~+=hNNNz'<<z='-z(               
           . .=. -DDz<~s~  'BNNN=~+<shNNNND(sNNNh~(+    ARE BELONG
            .=<.(NNNNDDs. (hhs+=s=hNDNNBNBBs<BNND<<=.             
            .'-'~sNNs((- .''. ' -~NNDz+((~---~sB<'''.     TO US!
                '=(++(-..  . ...-~+B~'....'.''-+(     .             
                -=z<<'.. .'-...'-~hz~-'.''''-~-<=                     
                 .~+~s~  ~z<~'-'--hN=~((~'---(~~z~                    
                   (+<-.'+=''''~(+=Bz--~(((=+s+~(s                     
  IT'S OVER      . '+-..~<----~-+(sBNh+zBNNBNh+<z'                     
                   .<-'--''(<~=B=hDDD=<<<++=++<=.                   
  9000 BUGS!     .. s~..'h=++ss=D<<~+B(<(+<=Nz=+                     
                    +'.''+NNDN(+z(((sB<((s+hNh<+             
                   .= -~(~(zDNz+z+zhNDz=szhhBz++.       MADNESS?        
                   '+. ss<'~=NBNBBDzBzhshDD=+<<-                   
                   -= . +s~-(+==hhDBNBDDs==hz+<     THIS! IS! LLAMA!
                 '(<-  . '~~(<+<=+<sz=+sshzs(..               
                .+<.    '('-~(((((<++(<<((= .                 
                 .--.. ....'.'.'.'..''..'-..

Tugas 2

"Hello, world!" println()

Tugas 3

import text/StringTokenizer
import structs/ArrayList
input := stdin readLine() split(' ', false)
(begin, end) := (input[0] toInt(), input[1] toInt())
for (i in begin..end+1) {
    if (i % 2 != 0) { "%d " printf(i) }
}
println()

Implementasi yang cukup mudah. Juga, ini menampilkan aspek menarik dari ooc: pemanggilan metode menggunakan spasi sebagai pembatas, bukan titik. Misalnya, pemberitahuan di stdin readLine() split(' ', false)atas. Dalam sebagian besar bahasa, itu akan ditulis sebagai stdin.readLine().split(' ', false), tetapi ooc cadangan itu untuk panggilan rantai (gulir ke bawah ke contoh kode).

Tugas 3

Ini menampilkan fitur ooc favorit saya: jenis yang cocok. Ini seperti pencocokan pola. Dalam bahasa OO. Luar biasa.

import structs/ArrayList
import math/Random

Animal: abstract class {
    makeNoise: abstract func
}

Sheep: class extends Animal {
    init: func
    makeNoise: func {
        "Baaaaaaa!" println()
    }
}

Wolf: class extends Animal {
    init: func
    makeNoise: func {
        "Hooooowl!" println()
    }
}

animals := [Sheep new(), Sheep new(), Sheep new()] as ArrayList<Animal>
badNumber := Random randRange(0, 3)
animals[badNumber] = Wolf new()
animal: Animal

"Enter a number between 0 (inclusive) and 3 (exclusive)" println()
inputNumberString := stdin readLine()
for (chr in inputNumberString) {
    if (!(chr.digit?())) {
        "NUMBER, not CHARACTER! Can't you read!?" println()
        exit(1)
    }
}
inputNumber := inputNumberString toInt()
try {
    animal = animals[inputNumber]
} catch (e: OutOfBoundsException) {
    "I said a number between one and three, you idiot!" println()
    exit(1)
}
"Animal noise:" println()
animal makeNoise()
match (animal) {
    case sheep: Sheep => { "It's a stupid, annoying sheep!" println() }
    case wolf: Wolf => { "AHH! A WOLF! You got eaten. :/ R.I.P." println() }
}
kirbyfan64sos
sumber