Una cresta de oscuridad


11

Debe completar cuatro tareas en un idioma que:

  • no debe devolver resultados * cuando se busca en este sitio web (codegolf.se), por ejemplo ToffeeScript ;
  • debe tener una página listada en Esolang , Rosetta Code o Wikipedia ;
  • ser un lenguaje distinto, en lugar de una versión distinta (por ejemplo, python 2.1 sería válido si python cumpliera los dos primeros criterios).

* La excepción es este éxito para ToffeeScript.

Las cuatro tareas que debe completar son:

1) Escriba una descripción / promoción tuiteable (<140 caracteres) de su idioma elegido.

2) Imprima "¡Hola, mundo! Esto está escrito <programming language name>".

3) Imprima todos los números impares en un rango especificado por el usuario. (por ejemplo, 20 25debe regresar un stdin de 21 23 25).

4) Escriba un programa que le parezca mejor demuestra una característica interesante de su idioma elegido.

Puntuación:

  • Este es un concurso de popularidad
  • Bono de 10 puntos si aparece en dos de los directorios anteriores, 25 si está en los tres.
  • El puntaje es la suma de los votos recibidos a la medianoche UTC del 1 de julio de 2015, más los bonos.

Aclaraciones:

  • La Tarea 1) puede ser un programa tuiteable, pero también se acepta texto sin formato.
  • Muchos idiomas no tienen un intérprete existente; Las soluciones a estos están bien, pero se tomarán de buena fe.
  • El segundo criterio para la elección del idioma prohíbe las páginas cuya creación data después de esta publicación. Si, para un lenguaje dado, X, existe una solución a un problema en Rosetta Code pero no tiene una página propia en alguna parte, todavía es aceptable.

44
estás hablando con programadores, no tienes que decirlo and/or;)
undergroundmonorail

2
El "debe devolver ningún resultado" debe tomarse literalmente? Por ejemplo, hay un resultado para " mond ", pero ciertamente no es el mismo Mond que en la respuesta. ¿Cuenta como resultado?
manatwork

2
Probablemente deberías decir que las páginas en Esolangs, Rosetta Code o Wikipedia deben haber existido antes de este desafío.
Martin Ender

1
¿Podría aclarar si la tarea 1 requiere un programa de 140 caracteres que genera una descripción, o simplemente una descripción de 140 caracteres (que no es un programa)?
trichoplax

1
He aclarado los puntos planteados aquí (¡al menos eso espero!) Arriba
Kieran Hunt

Respuestas:


6

BlooP

Bonus: 10

Hay páginas para BlooP en Esolangs y Wikipedia . Una búsqueda de PPCG para BlooP no arroja resultados. Si te sientes particularmente descabellado, puede probarlo en repl.it .


Tarea 1: El Tweet

BlooP: Nada más que bucles limitados. ;) #programación #buenos tiempos

Utiliza el estilo estándar de Twitter, incluidos hashtags y emoticones. Esto sería atractivo para cualquier usuario de Twitter. *


Tarea 2: El Hola Mundo

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

GREETING[0];

Como puede ver, este es un excelente lenguaje de golf. *


Tarea 3: los números impares

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

Los únicos operadores disponibles en BlooP son asignación ( <=), suma, multiplicación, mayor que, menor que e igual. Debido a su sintaxis dolorosamente detallada, en realidad es bastante fácil saber lo que está sucediendo, incluso sin una comprensión profunda del lenguaje.


Tarea 4: lo interesante

Nota: Mi fragmento para esta tarea está sujeto a cambios si se me ocurre algo más interesante.

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

He aquí los números de Fibonacci.


* Puede no ser cierto


5

Mond *

  • * La búsqueda de 'Mond' da un resultado (a pesar de esta respuesta), pero es un falso positivo y en realidad no menciona el idioma.
  • Página de códigos de Rosetta . En realidad, esto se creó después de que se publicó el desafío, sin embargo, existe una solución para la tarea QuickSort desde septiembre de 2014.
  • Aunque mond se ve muy similar a JavaScript (de hecho, es bastante fácil escribir políglotas Mond / JS), no es un subconjunto, superconjunto o re-implementación. Es su propio lenguaje distinto.

Pruébalo en tu navegador

Divulgación completa : estoy involucrado con el proceso de desarrollo y diseño de Mond hasta cierto punto y he implementado personalmente varias características principales del lenguaje, incluidos los operadores definidos por el usuario que se demuestran en las tareas 3 y 4.

Tarea 1

El operador de canalización ( |>) es el azúcar de sintaxis que transforma la llamada de función en el lado derecho a una llamada de función con el valor del lado izquierdo insertado como primer argumento. foo |> bar()es el mismo que bar( foo ).

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

Tarea 2

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

Tarea n. ° 3

El código para esta tarea supone varias cosas:

  1. El rango de números se ingresará en una sola línea
  2. Los límites superior e inferior estarán separados por un solo espacio
  3. Los números dados son enteros en base-10 y contienen solo los caracteres 0-9

Pruébalo aquí

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

Tarea n. ° 4

Esta tarea muestra operadores definidos por el usuario , que permiten al programador definir cualquier operador arbitrario (siempre que no exista) como una función, y usarlo como lo harían con cualquier otro operador. Vienen en sabores unarios y binarios.

Pruébalo aquí .

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

44
Solo aparece en el código de Rosetta, ¿cómo obtiene un bono de 25 puntos?
Scimonster

@Scimonster Mi interpretación de los bonos de puntuación es que el idioma debe tener 0 resultados de búsqueda, aparecer en uno de los siguientes: Código Rosetta, Esolang o Wikipedia, y ser un idioma distinto para calificar para los 25 puntos. Si me equivoco y el único criterio es que debe tener páginas en Rosetta Code, Esolang y Wikipedia, editaré en consecuencia.
Tony Ellis

No, las 3 cosas que enumeró son criterios para poder participar en el desafío. Califica para el bono de 10 puntos si, por ejemplo, Wikipedia y Rosetta Code lo enumeran. La bonificación de 25 puntos es si está en Rosetta, Esolang y Wikipedia.
Scimonster

@Scimonster Ya veo, mi error. He actualizado mi respuesta.
Tony Ellis

4

jq

Ninguno de los 14 resultados en codegolf.se trata sobre el lenguaje. ( jq(y variantes en mayúsculas) parece ser una declaración frecuente en Pyth).

Hay una categoría jq en el código de Rosetta .

Puede probarlo en línea, pero algunos de los ejemplos a continuación necesitan la última versión 1.5.

Tarea 1: El Tweet

jq es como sed para JSON; puedes usarlo para procesar datos estructurados con la misma facilidad que sed, awk, grep y amigos te permiten jugar con texto

(Descaradamente twittizó el primer párrafo de su sitio).

Tarea 2: El Hola Mundo

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

Tarea 3: los números impares

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

Tarea 4: lo interesante

El archivo ~ / .mozilla / firefox / *. Default / extensions.json que contiene información sobre las extensiones de Firefox instaladas tiene 0 líneas nuevas en 171 Kb en datos JSON, lo que hace que sea de alguna manera difícil de leer.

Bastante imprimir los datos JSON:

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

Doh Las líneas 8000 ++ son demasiado largas, así que páselo al localizador, pero mantenga el resaltado:

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

Ay. ¿Cuántas extensiones hay de todos modos?

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

Ok, pero algunos de ellos están deshabilitados. ¿Cuántos exactamente?

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

Algunos de ellos están bastante abandonados y ya no funcionan con Firefox actual:

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

(Esto más tarde no es cierto. Por alguna razón, extensiones.json contiene otros rangos de versiones que no sean las extensiones 'install.rdf. Pero de todos modos eso no es culpa de jq.)


4

ooc

Sí, llego un mes tarde. ¿¿¿Y qué???

Tarea 1

ooc es un lenguaje de programación que compila hasta C99 que tiene una sintaxis elegante y admite el desarrollo de alto y bajo nivel.

135 bytes! ¡Eso estuvo cerca!

Además, los puntos de bonificación falsos para el logotipo ASCII-art increíblemente genial de 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(..               
                .+<.    '('-~(((((<++(<<((= .                 
                 .--.. ....'.'.'.'..''..'-..

Tarea 2

"Hello, world!" println()

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

Implementación bastante sencilla. Además, esto muestra un aspecto interesante de ooc: las llamadas a métodos usan espacios como delimitadores, no puntos. Por ejemplo, aviso stdin readLine() split(' ', false)arriba. En la mayoría de los idiomas, eso se escribiría como stdin.readLine().split(' ', false), pero ooc lo reserva para el encadenamiento de llamadas (desplácese hacia abajo hasta el ejemplo de código).

Tarea 3

Esto muestra mi característica ooc favorita: coincidencia de tipos. Es como la coincidencia de patrones. En un idioma OO. Increíble.

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() }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.