Une chrestomathie de l'obscurité


11

Vous devez effectuer quatre tâches dans une langue qui:

  • ne doit renvoyer aucun résultat * lors d'une recherche sur ce site (codegolf.se), par exemple ToffeeScript ;
  • doit avoir une page répertoriée sur Esolang , Rosetta Code ou Wikipedia ;
  • être un langage distinct, plutôt qu'une version distincte (par exemple, python 2.1 serait valide si python satisfaisait aux deux premiers critères).

* L'exception étant ce succès pour ToffeeScript.

Les quatre tâches que vous devez effectuer sont:

1) Rédigez une description / promotion tweetable (<140 caractères) de la langue choisie.

2) Imprimez "Bonjour tout le monde! C'est écrit <programming language name>."

3) Imprimez tous les nombres impairs dans une plage spécifiée par l'utilisateur. (par exemple, un stdin de 20 25devrait revenir 21 23 25).

4) Écrivez un programme qui, selon vous, démontre le mieux une caractéristique intéressante de la langue que vous avez choisie.

Notation:

  • Ceci est un concours de popularité
  • Bonus de 10 points si répertorié dans deux des répertoires ci-dessus, 25 si dans les trois.
  • Le score est la somme des votes reçus à minuit UTC le 1er juillet 2015, plus les bonus.

Clarifications:

  • La tâche 1) peut être un programme tweetable mais le texte brut est également acceptable.
  • De nombreuses langues n'ont pas d'interprète existant; les solutions à ces problèmes sont bonnes, mais seront prises de bonne foi.
  • Le deuxième critère de choix de langue interdit les pages dont la date de création est postérieure à ce post. Si, pour une langue donnée, X, une solution à un problème existe sur Rosetta Code mais qu'elle n'a pas de page distincte quelque part, elle est toujours acceptable.

4
vous parlez à des programmeurs, vous n'avez pas à le dire and/or;)
undergroundmonorail

2
Le «ne doit retourner aucun résultat» doit-il être pris à la lettre? Par exemple, il y a un résultat pour « mond », mais certainement pas le même Mond que dans la réponse. Est-ce que cela compte comme résultat?
manatwork

2
Vous devez probablement déclarer que les pages sur Esolangs, Rosetta Code ou Wikipedia doivent avoir existé avant ce défi.
Martin Ender

1
Pourriez-vous préciser si la tâche 1 nécessite un programme de 140 caractères qui génère une description, ou juste une description de 140 caractères (qui n'est pas un programme)?
trichoplax

1
J'ai clarifié les points soulevés ici (au moins j'espère que j'ai!) Ci
Kieran Hunt

Réponses:


6

BlooP

Bonus: 10

Il y a des pages pour BlooP sur Esolangs et Wikipedia . Une recherche PPCG pour BlooP ne renvoie aucun résultat. Si vous vous sentez particulièrement loufoque, vous pouvez l' essayer sur repl.it .


Tâche 1: le Tweet

BlooP: Rien que des boucles bornées. ;) #programming #goodtimes

Cela utilise un style Twitter standard, y compris des hashtags et des émoticônes. Cela plairait à tout utilisateur de Twitter. *


Tâche 2: The Hello World

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

GREETING[0];

Comme vous pouvez le voir, c'est une langue de golf de choix. *


Tâche 3: les nombres impairs

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

Les seuls opérateurs disponibles dans BlooP sont assignation ( <=), addition, multiplication, supérieur à, inférieur à et égal. En raison de sa syntaxe douloureusement verbeuse, il est en fait assez facile de dire ce qui se passe même sans une compréhension approfondie de la langue.


Tâche 4: L'intéressant

Remarque: mon extrait de code pour cette tâche est susceptible de changer si je trouve quelque chose de plus intéressant.

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

Voici les chiffres de Fibonacci.


* Peut ne pas être vrai


5

Mond *

  • * La recherche de «Mond» donne un résultat (malgré cette réponse), mais c'est un faux positif et ne mentionne pas réellement la langue.
  • Page de code Rosetta . Cela a été créé après la publication du défi, mais une solution à la tâche QuickSort existe depuis septembre 2014.
  • Bien que mond ressemble beaucoup à JavaScript (en effet, il est assez facile d'écrire des polyglottes Mond / JS), il ne s'agit pas d'un sous-ensemble, d'un sur-ensemble ou d'une réimplémentation. C'est son propre langage distinct.

Essayez-le dans votre navigateur

Divulgation complète : Je suis impliqué dans le processus de développement et de conception de Mond dans une certaine mesure et j'ai personnellement implémenté plusieurs fonctionnalités linguistiques majeures, y compris les opérateurs définis par l'utilisateur, qui sont illustrés dans les tâches 3 et 4.

Tache 1

L'opérateur de pipeline ( |>) est un sucre de syntaxe qui transforme l'appel de fonction du côté droit en un appel de fonction avec la valeur du côté gauche insérée comme premier argument. foo |> bar()est le même que bar( foo ).

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

Tâche n ° 2

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

Tâche n ° 3

Le code de cette tâche suppose plusieurs choses:

  1. La plage de nombres sera saisie sur une seule ligne
  2. Les limites supérieure et inférieure seront séparées par un seul espace
  3. Les nombres donnés sont des entiers en base 10 et ne contiennent que les caractères 0-9

Essayez-le ici

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

Tâche n ° 4

Cette tâche présente les opérateurs définis par l'utilisateur , qui permettent au programmeur de définir n'importe quel opérateur arbitraire (tant qu'il n'existe pas déjà) comme une fonction, et de l'utiliser comme n'importe quel autre opérateur. Ils viennent dans des saveurs unaires et binaires.

Essayez-le ici .

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

4
Il n'est répertorié que dans Rosetta Code, comment obtient-il un bonus de 25 pt?
Scimonster

@Scimonster Mon interprétation des bonus de notation est que la langue doit avoir 0 résultats de recherche, être répertoriée sur l'un des codes Rosetta, Esolang ou Wikipedia, et être une langue distincte pour se qualifier pour les 25 points. Si je me trompe et que le seul critère est qu'il doit contenir des pages sur Rosetta Code, Esolang et Wikipedia, je vais modifier en conséquence.
Tony Ellis

Non, les 3 choses que vous avez énumérées sont des critères pour être autorisé à participer au défi. Il se qualifie pour le bonus de 10 points si, disons, Wikipedia et Rosetta Code le mentionnent tous les deux. Le bonus de 25 points est si c'est sur Rosetta, Esolang et Wikipedia.
Scimonster

@Scimonster je vois, mon erreur. J'ai mis à jour ma réponse.
Tony Ellis

4

jq

Aucun des 14 résultats sur codegolf.se ne concerne la langue. ( jq(et les variantes majuscules) semblent être des déclarations fréquentes en Pyth.)

Il existe une catégorie jq sur Rosetta Code .

Vous pouvez l' essayer en ligne, mais certains des exemples ci-dessous nécessitent la dernière version 1.5.

Tâche 1: le Tweet

jq est comme sed pour JSON; vous pouvez l'utiliser pour traiter des données structurées avec la même facilité que sed, awk, grep et amis vous permettent de jouer avec du texte

(Twittified sans vergogne le premier paragraphe de son site.)

Tâche 2: The Hello World

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

Tâche 3: les nombres impairs

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

Tâche 4: L'intéressant

Le fichier ~ / .mozilla / firefox / *. Default / extensions.json contenant des informations sur les extensions Firefox installées a 0 retour à la ligne à 171 Ko sur les données JSON, ce qui le rend difficile à lire.

Assez imprimer les données JSON:

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

Doh. Les lignes 8000 ++ sont trop longues, alors passez-les au pager, mais gardez la surbrillance:

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

Aie. Combien d'extensions existe-t-il de toute façon?

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

D'accord, mais certains d'entre eux sont désactivés. Combien exactement?

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

Certains d'entre eux sont assez abandonnés et ne fonctionnent plus avec Firefox actuel:

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

(Ce n'est pas vrai plus tard. Pour une raison quelconque, extensions.json contient d'autres plages de versions que install.rdf des extensions. Mais ce n'est pas la faute de jq de toute façon.)


4

ooc

Ouais, j'ai environ un mois de retard. Et alors???

Tache 1

ooc est un langage de programmation qui se compile jusqu'à C99 qui a une syntaxe élégante et prend en charge le développement de haut et de bas niveau.

135 octets! C'était fermé!

En outre, de faux points bonus pour le logo ASCII incroyablement cool d'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(..               
                .+<.    '('-~(((((<++(<<((= .                 
                 .--.. ....'.'.'.'..''..'-..

Tâche 2

"Hello, world!" println()

Tâche 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()

Implémentation assez simple. En outre, cela présente un aspect intéressant de ooc: les appels de méthode utilisent des espaces comme délimiteurs, pas des points. Par exemple, notez stdin readLine() split(' ', false)ci-dessus. Dans la plupart des langues, cela serait écrit comme stdin.readLine().split(' ', false), mais ooc le réserve pour le chaînage d'appels ( faites défiler jusqu'à l'exemple de code).

Tâche 3

Cela présente ma fonction ooc préférée: la mise en correspondance des types. C'est comme la correspondance de motifs. Dans une langue OO. Impressionnant.

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() }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.