Хрестоматія неясності


11

Ви повинні виконати чотири завдання мовою, яка:

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

* Виняток - це хіт для ToffeeScript.

Чотири завдання, які ви повинні виконати:

1) Напишіть твіттер (<140 символів) опис / просування вибраної мови.

2) Роздрукуйте "Привіт, світ! Це написано в <programming language name>".

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

4) Напишіть програму, яка, на вашу думку, найкраще демонструє цікаву особливість обраної вами мови.

Оцінка:

  • Це конкурс на популярність
  • Бонус у 10 балів, якщо зазначено у двох вищезазначених каталогах, 25, якщо у всіх трьох.
  • Оцінка - це підсумок голосів, отриманих о півночі UTC 1 липня 2015 року, плюс бонуси.

Роз'яснення:

  • Завдання 1) може бути програмою, яку можна твітувати, але звичайний текст також прийнятний.
  • Багато мов не мають перекладача; рішення для них прекрасні, але будуть прийняті добросовісно.
  • Другий критерій вибору мови забороняє сторінки, створення яких датується після цієї публікації. Якщо для даної мови X існує рішення проблеми, що існує в коді Розетти, але вона десь не має власної окремої сторінки, вона все одно прийнятна.

4
ти розмовляєш з програмістами, не треба говорити and/or;)
undergroundmonorail

2
"Потрібно повернути жодних результатів" слід сприймати буквально? Наприклад, є результат для " mond ", але, звичайно, не такий же Mond, як у відповіді. Чи вважається це результатом?
манатура

2
Напевно, ви повинні стверджувати, що сторінки в Esolangs, Rosetta Code або Wikipedia повинні існувати до цього виклику.
Мартін Ендер

1
Чи можете ви пояснити, чи потрібна задача 1 на 140 символів, яка видає опис, чи просто опис символів 140 (що не є програмою)?
трихоплакс

1
Я уточнив питання, порушені тут (принаймні, я сподіваюся, що у мене є!) Вище
Кіран Хант

Відповіді:


6

BlooP

Бонус: 10

Є сторінки для BlooP на Esolangs та Wikipedia . Пошук за допомогою PPCG для BlooP не дає результатів. Якщо ви відчуваєте себе особливо неосудним, ви можете спробувати його на repl.it .


Завдання 1: Твіт

BlooP: нічого, крім обмежених петель. ;) # програмування #goodtimes

Для цього використовується стандартний стиль 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 є присвоєння ( <=), додавання, множення, більше ніж, менше та дорівнює. Через болісно багатослівний синтаксис насправді досить легко розповісти, що відбувається, навіть без глибокого розуміння мови.


Завдання 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 *

  • * Пошук "Mond" дає один результат (незважаючи на цю відповідь), але це помилковий позитив і фактично не згадує мову.
  • Сторінка коду розетки . Це фактично було створено після опублікування виклику, проте рішення завдання QuickSort існує з вересня 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, як він отримує бонус на 25 pt?
Scimonster

@Scimonster Моя інтерпретація бонусних балів полягає в тому, що мова повинна мати 0 результатів пошуку, бути переліченими на одному з: Код Розетти, Есоланг або Вікіпедія, і бути чіткою мовою, щоб отримати право на 25 балів. Якщо я помиляюся, і єдиним критерієм є те, що на ньому повинні бути сторінки в Кодексі Розетти, Есоланг та Вікіпедії, я редагую їх відповідно.
Тоні Елліс

Ні, 3 перераховані вами речі - це критерії для того, щоб взагалі бути дозволеними у виклику. Це право на бонус у 10 балів, якщо, скажімо, Вікіпедія та Код Розетти їх перераховують. Бонус на 25 очок - це якщо він знаходиться на Розетті, Есоланге та Вікіпедії.
Scimonster

@Scimonster Я бачу, моя помилка. Я оновив свою відповідь.
Тоні Елліс

4

jq

Жоден із 14 результатів на codegolf.se не стосується мови. ( jq(і великі варіанти), здається, є частою заявою в Pyth.)

Існує категорія jq на коді Rosetta .

Ви можете спробувати в Інтернеті, але для деяких прикладів нижче потрібна остання версія 1.5.

Завдання 1: Твіт

jq - як sed для JSON; Ви можете використовувати їх для обробки структурованих даних з такою ж легкістю, що sed, awk, grep та друзі дозволяють грати з текстом

(Безсоромно щебетав перший абзац зі свого сайту.)

Завдання 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 Kb за даними JSON, що ускладнює читання.

Досить роздрукувати дані JSON:

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

До. 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

оок

Так, я запізнився на місяць. І що???

Завдання 1

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

135 байт! Це було близько!

Також підроблені бонусні бали за шалено крутий логотип ASCII-мистецтва 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.