Eine Chrestomathie der Dunkelheit

11

Sie sollten vier Aufgaben in einer Sprache ausführen, die:

  • darf bei der Suche auf dieser Website (codegolf.se) keine Ergebnisse * zurückgeben, z. B. ToffeeScript ;
  • muss eine Seite bei Esolang , Rosetta Code oder Wikipedia haben ;
  • eine bestimmte Sprache sein, anstatt eine bestimmte Version (z. B. Python 2.1 wäre gültig, wenn Python die ersten beiden Kriterien erfüllt).

* Die Ausnahme ist dieser Hit für ToffeeScript.

Die vier Aufgaben, die Sie ausführen sollten, sind:

1) Schreiben Sie eine tweetbare (<140 Zeichen) Beschreibung / Werbung für Ihre gewählte Sprache.

2) Drucken Sie "Hallo Welt! Dies ist geschrieben in <programming language name>."

3) Drucken Sie alle ungeraden Zahlen in einem benutzerdefinierten Bereich. (zB sollte ein stdin von 20 25zurückkehren 21 23 25).

4) Schreiben Sie ein Programm, das Ihrer Meinung nach ein interessantes Merkmal Ihrer gewählten Sprache demonstriert.

Wertung:

  • Dies ist ein Beliebtheitswettbewerb
  • Bonus von 10 Punkten, wenn in zwei der oben genannten Verzeichnisse aufgeführt, 25 in allen drei.
  • Das Ergebnis ist die Summe der Stimmen, die am 1. Juli 2015 um Mitternacht UTC eingegangen sind, zuzüglich der Boni.

Erläuterungen:

  • Aufgabe 1) kann ein tweetbares Programm sein, aber auch einfacher Text ist akzeptabel.
  • In vielen Sprachen gibt es keinen Dolmetscher. Lösungen für diese sind in Ordnung, werden aber in gutem Glauben getroffen.
  • Das zweite Kriterium für die Sprachauswahl verbietet Seiten, deren Erstellung nach diesem Beitrag erfolgt. Wenn für eine bestimmte Sprache, X, eine Lösung für ein Problem in Rosetta Code vorhanden ist, diese jedoch nicht über eine eigene Seite verfügt, ist dies weiterhin akzeptabel.
Kieran Hunt
quelle
4
du sprichst mit Programmierern, das musst du nicht sagen and/or;)
UndergroundMonorail
2
Das "muss keine Ergebnisse zurückgeben" sollte wörtlich genommen werden? Zum Beispiel gibt es ein Ergebnis für " Mond ", aber sicherlich nicht den gleichen Mond wie in der Antwort. Zählt es als Ergebnis?
Manatwork
2
Sie sollten wahrscheinlich angeben, dass die Seiten auf Esolangs, Rosetta Code oder Wikipedia vor dieser Herausforderung existiert haben müssen.
Martin Ender
1
Können Sie klären, ob Aufgabe 1 ein 140-Zeichen-Programm erfordert, das eine Beschreibung ausgibt, oder nur eine 140-Zeichen-Beschreibung (die kein Programm ist)?
Trichoplax
1
Ich habe die hier angesprochenen Punkte (zumindest hoffe ich!) Oben geklärt
Kieran Hunt

Antworten:

6

BlooP

Bonus: 10

Es gibt Seiten für BlooP auf Esolangs und Wikipedia . Eine PPCG-Suche nach BlooP liefert keine Ergebnisse. Wenn Sie sich besonders durchgeknallt fühlen, können Sie es auf repl.it ausprobieren .


Aufgabe 1: Der Tweet

BlooP: Nichts als begrenzte Schleifen. ;) #programmieren #gute Zeiten

Dies verwendet das Standard-Twitter-Styling einschließlich Hashtags und Emoticons. Dies würde jeden Twitter-Nutzer ansprechen. *


Aufgabe 2: Die Hallo Welt

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

GREETING[0];

Wie Sie sehen können, ist dies eine erstklassige Golfsprache. *


Aufgabe 3: Die ungeraden Zahlen

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

Die einzigen verfügbaren Operatoren in BlooP sind Zuweisung ( <=), Addition, Multiplikation, größer als, kleiner als und gleich. Aufgrund seiner schmerzhaft ausführlichen Syntax ist es eigentlich ziemlich einfach zu sagen, was los ist, auch ohne ein tiefes Verständnis der Sprache.


Aufgabe 4: Das Interessante

Hinweis: Mein Snippet für diese Aufgabe kann sich ändern, falls ich etwas Interessanteres finde.

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

Siehe, die Fibonacci-Zahlen.


* Kann nicht wahr sein

Alex A.
quelle
5

Mond *

  • * Die Suche nach 'Mond' ergibt ein Ergebnis (trotz dieser Antwort), aber es ist falsch positiv und erwähnt die Sprache nicht wirklich.
  • Rosetta Codepage . Dies wurde tatsächlich erstellt, nachdem die Herausforderung veröffentlicht wurde. Seit September 2014 gibt es jedoch eine Lösung für die QuickSort- Aufgabe.
  • Obwohl Mond JavaScript sehr ähnlich sieht (tatsächlich ist es ziemlich einfach, Mond / JS-Polyglots zu schreiben), handelt es sich nicht um eine Teilmenge, Obermenge oder Neuimplementierung. Es ist eine eigene Sprache.

Probieren Sie es in Ihrem Browser aus

Vollständige Offenlegung : Ich bin bis zu einem gewissen Grad in den Entwicklungs- und Designprozess von Mond involviert und habe persönlich mehrere wichtige Sprachfunktionen implementiert, einschließlich benutzerdefinierter Operatoren, die in den Aufgaben 3 und 4 demonstriert werden.

Aufgabe 1

Der Pipeline-Operator ( |>) ist Syntaxzucker, der den Funktionsaufruf auf der rechten Seite in einen Funktionsaufruf umwandelt, wobei der Wert auf der linken Seite als erstes Argument eingefügt wird. foo |> bar()ist das gleiche wie bar( foo ).

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

Aufgabe 2

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

Aufgabe 3

Der Code für diese Aufgabe setzt verschiedene Dinge voraus:

  1. Der Zahlenbereich wird in einer einzigen Zeile eingegeben
  2. Die oberen und unteren Grenzen werden durch ein einzelnes Leerzeichen getrennt
  3. Die angegebenen Zahlen sind Ganzzahlen in Basis 10 und enthalten nur die Zeichen 0-9

Probieren Sie es hier aus

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

Aufgabe 4

Diese Aufgabe demonstriert benutzerdefinierte Operatoren , mit denen der Programmierer einen beliebigen Operator (sofern dieser noch nicht vorhanden ist) wie eine Funktion definieren und wie jeden anderen Operator verwenden kann. Sie kommen in unären und binären Geschmacksrichtungen.

Probieren Sie es hier aus .

// 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
quelle
4
Es ist nur im Rosetta Code aufgeführt. Wie erhält man einen 25-Punkte-Bonus?
Scimonster
@Scimonster Meine Interpretation der Bewertungsboni ist, dass die Sprache 0 Suchergebnisse haben muss, in einer der folgenden Kategorien aufgeführt sein muss: Rosetta Code, Esolang oder Wikipedia und eine bestimmte Sprache sein muss, um sich für die 25 Punkte zu qualifizieren. Wenn ich falsch liege und das einzige Kriterium ist, dass es Seiten zu Rosetta Code, Esolang und Wikipedia geben muss, werde ich entsprechend bearbeiten.
Tony Ellis
Nein, die 3 Dinge, die Sie aufgelistet haben, sind Kriterien, um überhaupt an der Herausforderung teilnehmen zu können. Es qualifiziert sich für den 10-Punkte-Bonus, wenn beispielsweise Wikipedia und Rosetta Code ihn beide auflisten. Der 25-Punkte-Bonus gilt für Rosetta, Esolang und Wikipedia.
Scimonster
@ Scimonster Ich verstehe, mein Fehler. Ich habe meine Antwort aktualisiert.
Tony Ellis
4

jq

Keines der 14 Ergebnisse auf codegolf.se bezieht sich auf die Sprache. ( jq(und Großbuchstabenvarianten) scheint eine häufige Aussage in Pyth zu sein.)

Es gibt eine JQ-Kategorie für Rosetta Code .

Sie können es online ausprobieren, aber einige der folgenden Beispiele benötigen die neueste Version 1.5.

Aufgabe 1: Der Tweet

jq ist wie sed für JSON; Sie können damit strukturierte Daten mit der gleichen Leichtigkeit verarbeiten, mit der Sie mit sed, awk, grep und Freunden mit Text spielen können

(Schamlos zwitscherte der erste Absatz von seiner Website.)

Aufgabe 2: Die Hallo Welt

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

Aufgabe 3: Die ungeraden Zahlen

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

Aufgabe 4: Das Interessante

Die Datei ~ / .mozilla / Firefox / *. Default / extensions.json mit Informationen zu den installierten Firefox-Erweiterungen enthält 0 Zeilenumbrüche in 171 KB für JSON-Daten, was das Lesen irgendwie erschwert.

Drucken Sie die JSON-Daten hübsch aus:

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

Doh. 8000 ++ - Zeilen sind zu lang, geben Sie sie also an den Pager weiter, aber behalten Sie die Hervorhebung bei:

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

Autsch. Wie viele Erweiterungen gibt es überhaupt?

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

Ok, aber einige von ihnen sind deaktiviert. Wie viele genau?

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

Einige von ihnen sind ziemlich verlassen und funktionieren nicht mehr mit dem aktuellen Firefox:

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

(Dies ist später nicht der Fall. Aus irgendeinem Grund enthält extensions.json andere Versionsbereiche als die install.rdf der Erweiterungen. Dies ist jedoch ohnehin nicht die Schuld von jq.)

Mann bei der Arbeit
quelle
4

ooc

Ja, ich bin ungefähr einen Monat zu spät. Na und???

Aufgabe 1

ooc ist eine Programmiersprache, die bis zu C99 kompiliert wird, eine elegante Syntax aufweist und sowohl die Entwicklung auf hoher als auch auf niedriger Ebene unterstützt.

135 Bytes! Das war knapp!

Außerdem gefälschte Bonuspunkte für das wahnsinnig coole ASCII-Art-Logo von ooc :

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

Aufgabe 2

"Hello, world!" println()

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

Ziemlich einfache Implementierung. Dies zeigt auch einen interessanten Aspekt von ooc: Methodenaufrufe verwenden Leerzeichen als Trennzeichen, nicht als Punkte. Beachten Sie zum Beispiel stdin readLine() split(' ', false)oben. In den meisten Sprachen würde das so geschrieben sein stdin.readLine().split(' ', false), aber ooc behält sich das für die Anrufverkettung vor (scrollen Sie nach unten zum Codebeispiel).

Aufgabe 3

Dies zeigt meine Lieblings-OOC-Funktion: Typanpassung. Es ist wie ein Mustervergleich. In einer OO-Sprache. Genial.

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
quelle