UProLa

Неокріпші думки

K not С

with 2 comments

Ваш brain буде fucked. (c) Brainfuck

Якось один чувак в якомусь одному коментарі показав, як Lispоподібна мова вставляє С++ по розміру коду і Пітон по швидкодії в задачі зчитування з файлу матриці. Це було щось типу одкровення. Я не можу пройти даний інцидент стороною, все-таки є зміст погодитись з твердженням, що не одним імперативом можна жити.

Для завтравки – Conway’s game of Life in APL


А недарма нам на першому курсі давали Пролог і Брейнфак…

Не буду багато розпинатись про векторні мови програмування, й так я нічого про них не знаю. Проте я пропоную вам пройти цей швидкий курс, для підвищення ерудованості. Автор даної статті дотримується правила “Скільки мов ти знаєш, стільки разів ти людина”. Плюс, це мабуть перша україномовна стаття про K (врахуйте, що всього лиш 1000 програмістів у всьому світі знають добре K і заробляють ним на житття).

Одна опенсурсна реалізація – kona. Для установки робимо все рідмі:
1) $ mkdir ~/kona && cd ~/kona
2) $ git clone git://github.com/kevinlawler/kona.git
3) $ cd && make
4) $ ./k
Я рекомендую
4) apt-get install rlwrap
Це допоміжна програмка-враппер, для зручності вводу у інтерпретатор. Пишемо так
5) $ rlwrap ./k

(До-речі, прогляньте назви сорс-файлів або подивитись стиль форматування програми https://github.com/kevinlawler/kona/blob/master/0.c
Якщо вам здається, що kona написана на K, тоді розчарую вас – вона написана на C

“This is a very unusual style of C”

The unusual appearance is a side effect of writing C as concisely as possible. There are great benefits to writing code in this way. Someone familiar with the style can read and comprehend the code much faster than they could with traditional code. Brevity creates a discipline that reduces bugs. Some of the benefits will not be apparent until you try it. Some of the downsides of the style are inaccessibility and a steep learning curve.

)

Сторінки для ознайомлення з K
https://github.com/kevinlawler/kona/wiki
http://www.cs.nyu.edu/courses/fall02/G22.3033-007/kintro.html
http://www.langreiter.com/space/k3-notes

Представляю на суд общини короткий хелп-тутор по базовим принципам програмування K.

= 1 Вектор =

Запис чисел підряд створює вектор

  14 5 6
14 5 6

Вектор також утворюється за допомогою оператора “кома”

  2, 3, 4
2 3 4

Вектор з одного числа робиться ось так

  ,2
,2

= 2 Генерація векторів =

Вектор вигляду 0 1 2 3 4 … робиться так

  !10
0 1 2 3 4 5 6 7 8 9

Вектор випадкових чисел. Перше число – кількість, друге – максимальне+1

  4 _draw 10
7 2 9 0

Генерація вектора з одного елементу
(Зберіг як задачку для завдань :))

= 3 Модифікація вектора =

Тут варто розповісти про control flow. Програма виконується порядково, справа наліво. Тобто порядок має значення:

  2+2*2
6
  2*2+2
8

Зробити реверс вектора дуже просто:

  |!10
9 8 7 6 5 4 3 2 1 0

Як бачите, спочатку командою !10 був створений вектор перших 10 цілих, а потім він був реверсований вертикальною паличкою. Всього існує досить багато односимвольних команд модифікації векторів, перечислю найпростіші зараз

Інвертувати знак:

  -!10
0 -1 -2 -3 -4 -5 -6 -7 -8 -9

Інвертувати логічно:

  randomNumbers: 10 _draw 2
1 1 0 1 1 1 0 0 0 1
  ~ randomNumbers
0 0 1 0 0 0 1 1 1 0

Логіка тут проста – >0 True, 0 False.

= 4 Арифметика =

  2 + 2
4
  3 * 3
9
  9 % 4 / хех, ось таке тут ділення
2.25
  1 - 3
-2

Прогалики ставити не обов’язково в усіх приведених вище прикладах.

Пріоритет можна задавати дужками:

  2*2+2
8
  (2*2)+2
6

= 5 Арифметика над векторами =

Абсолютно так само чотири базові операції працюють із векторами. Якщо говорити в загальному, є 3 типи арифм. операцій:
1) число – число
2) число – вектор (впринципі, у даній реалізації можна робити і вектор – число)
3) вектор – вектор (однакової довжини!!!!!!!!!!!!!!!!!)

Приклади
1) – див вище
2)

  -5 - 1 2 3 4 5
-6 -7 -8 -9 -10
  10 * !10	/ домножуємо кожен елемент списку на 10
0 10 20 30 40 50 60 70 80 90
  10 * |!10	/ домножуємо кожен елемент реверсованого списку на 10
90 80 70 60 50 40 30 20 10 0
  10 * ~|!10	/ домножуємо кожен елемент інвертованого реверсованого списку на 10
0 0 0 0 0 0 0 0 0 10
  10 * ~(-5 + |!10) / ну і так далі...
0 0 0 0 10 0 0 0 0 0

3)

  1 2 3 + 3 2 0
4 4 3
  1 2 3 + !3
1 3 5
  !3 + !3
domain error
  (!3) + !3
0 2 4

Як бачите, іноді в дужки треба брати й списки. Чому виникла помилка?

  !3			/ створюємо список
0 1 2
  3 + 0 1 2		/ додаємо до кожного елементу число
3 4 5
  ! 3 4 5		/ а як зробити послідовність по списку?
domain error

= Summary =

    Закріплення знань відбувається через досвід. Пропоную виконати наступні завдання

  1. Обнулити перше, 3-є, 5-е, 7-е числа арифметичної прогресії з 10 чисел за допомогою логічної маски.
  2. Створити арифметичну прогресію, починаючи з числа -5 і кроком 4 (кількість чисел не менше 21).
  3. Показати, що у арифметичної прогресії сума 1 і n-ого числа = сумі 2 і (n-1)-ого і тд.
    1. Тепер ви знаєте метод створення списку з однакових чисел, грац ). Зможете створити список з 21 сімірки?
    2. Виконайте те саме, але використайте недокументовану особливість рандомайзера _draw🙂
    1. створити вектор (назвати myRandom) випадових НЕнульових чисел (штук 10)
    2. Обнулити 3тє число (рахуючи з одиниці) вектора myRandom.
    3. Записати на його місце число 100000.

Ну, нічого складного немає, чи не так? Ось ще раз короткий хелп

  • !<число> – створити послідовність 0 1 2 …
  • |<вектор> – обернути порядок чисел у вектора
  • -<вектор> – інверсія знаку чисел у вектора
  • ~<вектор> – логічне ні
  • + – сума або логічне АБО
  • * – добуток або логічне І

[spoiler]
1)
1 0 1 0 1 0 1 0 1 1 * !10
0 0 2 0 4 0 6 0 8 9

2)
-5+4*!22
-5 -1 3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 79

3)
(|!10) + !10
9 9 9 9 9 9 9 9 9 9
3а)
7* ((|!21)+!21) % 20
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7.0
3б)
7+ 21 _draw 1
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

4а)
myRandom: 1 + 10 _draw 9
5 4 7 2 7 8 8 3 3 6
4б)
mask: ~(!10)-2
0 0 1 0 0 0 0 0 0 0
(~mask)*myRandom
5 4 0 2 7 8 8 3 3 6
4в)
(100000 * mask) + (~mask) * myRandom
5 4 100000 2 7 8 8 3 3 6
[/spoiler]

Written by danbst

Квітень 20, 2011 at 22:52

Оприлюднено в Програмування

Відповідей: 2

Subscribe to comments with RSS.

  1. Ок. Я пройшов курс. Дякую.

    Я так зрозумів K це щось схоже на APL тільки без хитрих юнікодівських символів?

    bunyk

    Квітень 22, 2011 at 13:13

    • Тобі дякую, першопроходець. Адаптовану на англійську версію туторіалу виклав на вікі проекту.

      Так, ти правий. Цитата: K is an ASCII-based APL.

      danbst

      Квітень 22, 2011 at 22:55


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: