Хрестоматия неизвестности


11

Вы должны выполнить четыре задания на языке, который:

  • не должен возвращать результаты * при поиске на этом сайте (codegolf.se), например, ToffeeScript ;
  • должна иметь страницу, указанную в Esolang , Rosetta Code или Wikipedia ;
  • быть отдельным языком, а не отдельной версией (например, python 2.1 был бы действительным, если бы python удовлетворял первым двум критериям).

* Исключением является этот хит для ToffeeScript.

Четыре задачи, которые вы должны выполнить:

1) Напишите описание / продвижение выбранного вами языка (<140 символов).

2) Печать "Hello World! Это написано в <programming language name>."

3) Распечатать все нечетные числа в указанном пользователем диапазоне. (например, 20 25должен возвращаться стандартный ввод 21 23 25).

4) Напишите программу, которая, по вашему мнению, лучше всего демонстрирует интересную особенность выбранного вами языка.

Подсчет очков:

  • Это конкурс популярности
  • Бонус 10 баллов, если они указаны в двух из вышеперечисленных каталогов, 25, если во всех трех.
  • Счет представляет собой сумму голосов, полученных в полночь по UTC 1 июля 2015 года, плюс бонусы.

Разъяснения:

  • Задача 1) может быть программой с возможностью твиттинга, но простой текст также приемлем.
  • Многие языки не имеют существующего переводчика; решения для них хороши, но будут приняты добросовестно.
  • Второй критерий выбора языка запрещает страницы, даты создания которых после этого поста. Если для данного языка X решение проблемы существует в Rosetta Code, но у него где-то нет отдельной страницы, оно все равно приемлемо.

4
вы говорите с программистами, вам не нужно говорить and/or;)
подземный

2
«Не должно возвращать никаких результатов» следует понимать буквально? Например, есть результат для « монда », но, конечно, не тот же Монд, что и в ответе. Это считается результатом?
manatwork

2
Вы, вероятно, должны заявить, что страницы с Esolangs, Rosetta Code или Wikipedia должны были существовать до этого вызова.
Мартин Эндер

1
Не могли бы вы уточнить, требуется ли для задачи 1 программа из 140 символов, которая выводит описание, или просто описание из 140 символов (которое не является программой)?
Трихоплакс

1
Я разъяснил вопросы, поднятые здесь (по крайней мере, я надеюсь, что у меня есть!) Выше
Kieran Hunt

Ответы:


6

Bloop

Бонус: 10

Есть страницы для BlooP на Esolangs и Wikipedia . Поиск PPCG для BlooP не возвращает результатов. Если вы чувствуете себя особенно невменяемым, вы можете попробовать его на repl.it .


Задача 1: Твит

BlooP: ничего, кроме ограниченных петель. ;) # программирование # хорошие времена

При этом используются стандартные стили Twitter, включая хэштеги и смайлики. Это подойдет любому пользователю Twitter. *


Задача 2: Привет, мир

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

GREETING[0];

Как видите, это основной язык игры в гольф. *


Задача 3: Нечетные числа

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

В BlooP доступны только операторы: assignment ( <=), сложение, умножение, больше чем, меньше и равно. Из-за его болезненно многословного синтаксиса на самом деле довольно легко сказать, что происходит, даже без глубокого понимания языка.


Задача 4: Интересное

Примечание: мой фрагмент для этой задачи может быть изменен, если я придумаю что-нибудь более интересное.

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

Вот числа Фибоначчи.


* Может не быть правдой


5

Монд *

  • * Поиск 'Mond' дает один результат (несмотря на этот ответ), но это ложный положительный результат и фактически не упоминается язык.
  • Кодовая страница Розетты . Фактически это было создано после публикации запроса , однако решение задачи быстрой сортировки существует с сентября 2014 года.
  • Хотя mond очень похож на JavaScript (на самом деле, писать полиглоты Mond / JS довольно просто), он не является подмножеством, надмножеством или повторной реализацией. Это свой особый язык.

Попробуйте это в вашем браузере

Полное раскрытие : я в какой-то степени участвовал в процессе разработки и проектирования Mond и лично реализовал несколько основных языковых функций, включая определяемые пользователем операторы, которые продемонстрированы в задачах 3 и 4.

Задание 1

Оператор конвейера ( |>) является синтаксическим сахаром, который преобразует вызов функции с правой стороны в вызов функции со значением в левой части, вставленным в качестве первого аргумента. foo |> bar()так же, как bar( foo ).

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

Задача № 2

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

Задача № 3

Код для этой задачи предполагает несколько вещей:

  1. Диапазон чисел будет введен в одну строку
  2. Верхняя и нижняя границы будут разделены одним пробелом
  3. Указанные числа являются целыми числами в базе 10 и содержат только символы 0-9

Попробуй здесь

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

Задача № 4

Эта задача демонстрирует пользовательские операторы , которые позволяют программисту определять любой произвольный оператор (если он еще не существует), как функцию, и использовать его так же, как любой другой оператор. Они бывают одинарные и бинарные.

Попробуй это здесь .

// 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
Он указан только в Rosetta Code, как получить бонус в 25 пунктов?
Scimonster

@Scimonster Моя интерпретация начисляемых бонусов заключается в том, что для языка необходимо иметь 0 результатов поиска, они должны быть указаны в одном из: Rosetta Code, Esolang или Wikipedia и быть отличным языком для получения 25 баллов. Если я ошибаюсь и единственным критерием является то, что на нем должны быть страницы, посвященные Rosetta Code, Esolang и Wikipedia, я отредактирую соответственно.
Тони Эллис

Нет, три вещи, которые вы перечислили, являются критериями для участия в конкурсе вообще. Это дает право на бонус в 10 баллов, если, скажем, в Wikipedia и Rosetta Code есть оба. Бонус в 25 баллов - это если вы играете в Rosetta, Esolang и Wikipedia.
Scimonster

@ Scimonster Понятно, моя ошибка. Я обновил свой ответ.
Тони Эллис

4

JQ

Ни один из 14 результатов на сайте codegolf.se не касается языка. ( jq(и заглавные варианты), кажется, часто встречается в Pyth.)

На Rosetta Code есть категория jq .

Вы можете попробовать это онлайн, но некоторые из примеров ниже нуждаются в последней версии 1.5.

Задача 1: Твит

jq подобен sed для JSON; вы можете использовать его для обработки структурированных данных с той же легкостью, что sed, awk, grep и friends позволяют вам играть с текстом

(Бесстыдно вычитал первый абзац со своего сайта.)

Задача 2: Привет, мир

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

Задача 3: Нечетные числа

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

Задача 4: Интересное

Файл ~ / .mozilla / firefox / *. Default / extensions.json, содержащий информацию об установленных расширениях Firefox, содержит 0 строк в 171 Кбайт данных JSON, что затрудняет его чтение.

Довольно распечатать данные JSON:

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

Doh. 8000 ++ строк слишком длинные, поэтому передайте их на пейджер, но сохраните выделение:

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

Уч. Сколько расширений в любом случае?

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

Хорошо, но некоторые из них отключены. Сколько именно?

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

Некоторые из них совершенно заброшены и больше не работают с текущим 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

(Это позже неверно. По некоторым причинам extensions.json содержит другие диапазоны версий, кроме install.rdf расширений. Но в любом случае это не ошибка jq.)


4

OOC

Да, я опоздал примерно на месяц. Ну и что???

Задание 1

ooc - это язык программирования, который компилируется до C99, имеет элегантный синтаксис и поддерживает разработку как высокого, так и низкого уровня.

135 байтов! Это было близко!

Кроме того, поддельные бонусные очки за безумно крутой логотип ASCII-art от 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(..               
                .+<.    '('-~(((((<++(<<((= .                 
                 .--.. ....'.'.'.'..''..'-..

Задача 2

"Hello, world!" println()

Задача 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()

Довольно простая реализация. Кроме того, это демонстрирует интересный аспект вызовов ooc: метод использует пробелы в качестве разделителей, а не точек. Например, обратите внимание stdin readLine() split(' ', false)выше. На большинстве языков это записывается как stdin.readLine().split(' ', false), но ooc резервирует это для цепочки вызовов (прокрутите вниз до примера кода).

Задача 3

Это демонстрирует мою любимую функцию ooc: сопоставление типов. Это как сопоставление с образцом. На ОО языке. Потрясающие.

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() }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.