Chrestomathy of Obscurity

11

Powinieneś wykonać cztery zadania w języku, który:

  • nie może zwracać żadnych wyników * podczas wyszukiwania w tej witrynie (codegolf.se), na przykład ToffeeScript ;
  • musi mieć stronę wymienioną na stronach Esolang , Rosetta Code lub Wikipedia ;
  • być odrębnym językiem, a nie odrębną wersją (np. python 2.1 byłby prawidłowy, gdyby python spełniał dwa pierwsze kryteria).

* Wyjątkiem jest ten hit dla ToffeeScript.

Cztery zadania, które należy wykonać, to:

1) Napisz tweetable (<140 znaków) opis / promocję wybranego języka.

2) Wydrukuj „Witaj świecie! To jest napisane w <programming language name>”.

3) Wydrukuj wszystkie liczby nieparzyste w zakresie określonym przez użytkownika. (np. standardowe wyjście 20 25powinno powrócić 21 23 25).

4) Napisz program, który według Ciebie najlepiej pokazuje interesującą funkcję wybranego języka.

Punktacja:

  • To konkurs popularności
  • Bonus 10 punktów, jeśli jest wymieniony w dwóch powyższych katalogach, 25, jeśli we wszystkich trzech.
  • Wynik to suma głosów otrzymanych o północy UTC 1 lipca 2015 r. Plus bonusy.

Wyjaśnienia:

  • Zadanie 1) może być programem tweetowanym, ale akceptowany jest również zwykły tekst.
  • Wiele języków nie ma istniejącego tłumacza; rozwiązania tych problemów są w porządku, ale zostaną podjęte w dobrej wierze.
  • Drugie kryterium wyboru języka zabrania stron, których utworzenie nastąpiło po tym poście. Jeśli dla danego języka X istnieje rozwiązanie problemu w Kodzie Rosetta, ale nie ma on gdzieś odrębnej strony, jest to do przyjęcia.
Kieran Hunt
źródło
4
mówisz do programistów, nie trzeba powiedzieć and/or;)
undergroundmonorail
2
„Czy nie trzeba zwracać żadnych wyników” należy brać dosłownie? Na przykład istnieje wynik dla „ mon ”, ale na pewno nie ten sam Mond, co w odpowiedzi. Czy to się liczy jako wynik?
manatwork
2
Prawdopodobnie powinieneś powiedzieć, że strony w Esolangs, Rosetta Code lub Wikipedii musiały istnieć przed tym wyzwaniem.
Martin Ender
1
Czy możesz wyjaśnić, czy zadanie 1 wymaga 140-znakowego programu, który generuje opis, czy tylko 140-znakowego opisu (który nie jest programem)?
trichoplax
1
Wyjaśniłem kwestie poruszone tutaj (przynajmniej mam nadzieję!) Powyżej
Kieran Hunt

Odpowiedzi:

6

BlooP

Bonus: 10

Istnieją strony BlooP na Esolangs i Wikipedii . Wyszukiwanie PPCG dla BlooP nie zwraca żadnych wyników. Jeśli czujesz się szczególnie loopy, można go wypróbować na repl.it .


Zadanie 1: Tweet

BlooP: Nic poza ograniczonymi pętlami. ;) #programowanie #goodtimes

Wykorzystuje to standardową stylizację Twittera, w tym hashtagi i emotikony. Spodobałoby się to każdemu użytkownikowi Twittera. *


Zadanie 2: Hello World

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

GREETING[0];

Jak widać, jest to główny język golfa. *


Zadanie 3: Dziwne liczby

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

Jedynymi dostępnymi operatorami w BlooP są przypisanie ( <=), dodawanie, mnożenie, większe niż, mniejsze niż i równe. Ze względu na bolesną pełną składnię naprawdę łatwo jest powiedzieć, co się dzieje, nawet bez głębokiego zrozumienia języka.


Zadanie 4: Interesujące

Uwaga: mój fragment tego zadania może ulec zmianie, jeśli wymyślę coś ciekawszego.

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

Oto liczby Fibonacciego.


* Może nie być prawdą

Alex A.
źródło
5

Poniedziałek *

  • * Wyszukiwanie „Mond” daje jeden wynik (pomimo tej odpowiedzi), ale jest to wynik fałszywie dodatni i tak naprawdę nie wspomina o języku.
  • Strona z kodem Rosetty . Zostało to faktycznie utworzone po opublikowaniu wyzwania, jednak rozwiązanie zadania QuickSort istnieje od września 2014 r.
  • Chociaż mon wygląda bardzo podobnie do JavaScript (w rzeczywistości pisanie poliglotów Mond / JS jest dość łatwe), nie jest to podzbiór, nadzbiór ani ponowna implementacja. Jest to własny, odrębny język.

Wypróbuj w swojej przeglądarce

Pełne ujawnienie : jestem zaangażowany w proces rozwoju i projektowania Mond do pewnego stopnia i osobiście wdrożyłem kilka głównych funkcji językowych, w tym operatorów zdefiniowanych przez użytkownika, które są zademonstrowane w zadaniach 3 i 4.

Zadanie 1

Operator potoku ( |>) to cukier składniowy, który przekształca wywołanie funkcji po prawej stronie w wywołanie funkcji z wartością po lewej stronie wstawioną jako pierwszy argument. foo |> bar()jest taki sam jak bar( foo ).

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

Zadanie nr 2

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

Zadanie nr 3

Kod tego zadania zakłada kilka rzeczy:

  1. Zakres liczb zostanie wprowadzony w jednym wierszu
  2. Górne i dolne granice zostaną oddzielone pojedynczą spacją
  3. Podane liczby są liczbami całkowitymi w bazie-10 i zawierają tylko znaki 0-9

Wypróbuj tutaj

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

Zadanie # 4

To zadanie pokazuje operatory zdefiniowane przez użytkownika , które pozwalają programiście zdefiniować dowolny dowolny operator (o ile jeszcze nie istnieje) tak jak funkcję i używać go tak, jak każdego innego operatora. Występują w jedno- i dwójkowych smakach.

Wypróbuj tutaj .

// 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
źródło
4
Jest wymieniony tylko w kodzie Rosetty, w jaki sposób otrzymuje premię 25 pkt?
Scimonster,
@ Scimonster Moja interpretacja bonusów punktowych polega na tym, że język musi mieć 0 wyników wyszukiwania, być wymieniony na jednym z: Kod Rosetta, Esolang lub Wikipedia i być odrębnym językiem, aby zakwalifikować się do 25 punktów. Jeśli się mylę, a jedynym kryterium jest to, że musi on mieć strony w Kodach Rosetta, Esolang i Wikipedii, odpowiednio je zmodyfikuję.
Tony Ellis,
Nie, wymienione 3 rzeczy to kryteria dopuszczenia do wyzwania. Kwalifikuje się do premii 10 punktów, jeśli powiedzmy, że Wikipedia i kod Rosetta wymieniają ją. Bonus 25 punktów jest, jeśli dotyczy on Rosetta, Esolang i Wikipedii.
Scimonster,
@ Scimonster Widzę, mój błąd. Zaktualizowałem swoją odpowiedź.
Tony Ellis,
4

jq

Żaden z 14 wyników na codegolf.se nie dotyczy języka. ( jq(i duże litery) wydaje się być częstym poleceniem w Pyth.)

W kodzie Rosetta znajduje się kategoria jq .

Możesz spróbować online, ale niektóre z poniższych przykładów wymagają najnowszej wersji 1.5.

Zadanie 1: Tweet

jq jest jak sed dla JSON; możesz go używać do przetwarzania danych strukturalnych z taką samą łatwością, jak sed, awk, grep i znajomi pozwalają bawić się tekstem

(Bezwstydnie zapisał pierwszy akapit na swojej stronie).

Zadanie 2: Hello World

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

Zadanie 3: Dziwne liczby

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

Zadanie 4: Interesujące

Plik ~ / .mozilla / firefox / *. Default / extensions.json zawierający informacje o zainstalowanych rozszerzeniach Firefoksa ma 0 nowych linii w 171 Kb na danych JSON, co sprawia, że ​​jest trudny do odczytania.

Dość wydrukuj dane JSON:

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

Doh Linie 8000 ++ są za długie, więc przekaż je do pagera, ale zaznaczaj:

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

Auć. Ile jest w ogóle rozszerzeń?

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

Ok, ale niektóre z nich są wyłączone. Ile dokładnie?

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

Niektóre z nich są dość porzucone i nie działają już w obecnym Firefoksie:

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

(To później nie jest prawdą. Z jakiegoś powodu rozszerzenie.json zawiera inne zakresy wersji niż install.rdf rozszerzeń. Ale i tak nie jest to wina jq.)

człowiek w pracy
źródło
4

ooc

Tak, spóźniłem się około miesiąca. Więc co???

Zadanie 1

ooc to język programowania, który kompiluje się do C99, który ma elegancką składnię i obsługuje zarówno programowanie na wysokim, jak i na niskim poziomie.

135 bajtów! Było blisko!

Ponadto fałszywe punkty bonusowe za niesamowicie fajne logo ooc ASCII-art :

           +(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(..               
                .+<.    '('-~(((((<++(<<((= .                 
                 .--.. ....'.'.'.'..''..'-..

Zadanie 2

"Hello, world!" println()

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

Dość prosta implementacja. Pokazuje to również interesujący aspekt ooc: wywołania metod używają spacji jako ograniczników, a nie kropek. Na przykład zauważ stdin readLine() split(' ', false)powyżej. W większości języków byłoby to napisane jako stdin.readLine().split(' ', false), ale ooc zastrzega to do łączenia łańcuchów (przewiń w dół do przykładu kodu).

Zadanie 3

Prezentuje moją ulubioną funkcję ooc: dopasowanie typu. To jak dopasowanie wzoru. W języku OO. Niesamowite.

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
źródło