Диадические функции
Имя (а) | Обозначение | Значение |
Кодовая точка Unicode |
---|---|---|---|
Добавлять | Сумма A и B | U + 002B + | |
Вычесть | А минус В | U + 2212 — | |
Умножить | Умножить на B | U + 00D7 × | |
Разделять | A делится на B | U + 00F7 ÷ | |
Возведение в степень | Повышен до B власти | U + 22C6 ⋆ | |
Круг | Тригонометрические функции B, выбранные A
A = 1: sin ( B ) A = 5: sinh ( B ) A = 2: cos ( B ) A = 6: cosh ( B ) A = 3: tan ( B ) A = 7: tanh ( B ) Отрицательные числа производят обратные соответствующие функции. |
U + 25CB ○ | |
По рукам | Через различных целых числа , выбранные случайным образом из первых B целых чисел | U + 003F ? | |
Членство, Эпсилон | 1 для элементов A, присутствующих в B ; 0 где нет. | U + 2208 ∈ | |
Найди, Эпсилон Андербар | 1 для начальной точки многоэлементного массива A, присутствующего в B ; 0 где нет. | U + 2377 ⍷ | |
Максимум , потолок | Большее значение A или B | U + 2308 ⌈ | |
Минимум , Этаж | Меньшее значение A или B | U + 230A ⌊ | |
Reshape, Dyadic Rho | Массив формы A с данными B | U + 2374 ⍴ | |
Брать | Выберите первый (или последний) элемент A из B в соответствии с × A | U + 2191 ↑ | |
Уронить | Удалите первый (или последний) элемент A из B согласно × A | U + 2193 ↓ | |
Декодировать | Значение полинома, коэффициенты которого равны B в точке A | U + 22A5 ⊥ | |
Кодировать | База — представление значения B | U + 22A4 ⊤ | |
Остаток | B по модулю A | U + 2223 ∣ | |
Цепочка | Элементы B добавлены к элементам A | U + 002C , | |
Расширение, диадическая обратная косая черта | Вставьте нули (или пробелы) в B, соответствующие нулям в A | U + 005C \ | |
Сжатие, Диадический слэш | Выберите элементы в B , соответствующие элементам в A | U + 002F | |
Индекс, диадическая йота |
Расположение (индекс) B в A ; если не найден |
U + 2373 ⍳ | |
Разделение матрицы, разделение на два квадрата | Решение системы линейных уравнений , множественная регрессия A x = B | U + 2339 ⌹ | |
Вращение | Элементы B повернуты на позиции A |
U + 233D ⌽ | |
Вращение | Элементы B повернуты на позиции A по первой оси | U + 2296 ⊖ | |
Логарифм | Логарифм B по основанию A | U + 235F ⍟ | |
Диадический формат | Отформатируйте B в символьную матрицу в соответствии с A | U + 2355 ⍕ | |
Общее транспонирование | Оси B упорядочены A | U + 2349 ⍉ | |
Комбинации | Количество комбинаций B, взятых A за раз | U + 0021 ! | |
Диэрезис, Дерезис, Двойная точка | Над каждым, или выполнять каждое отдельно; B = на них; A = операция для выполнения или использования (например, йота) | U + 00A8 ¨ | |
Меньше, чем | Сравнение: 1, если истина, 0, если ложь | U + 003C < | |
Меньше или равно | Сравнение: 1, если истина, 0, если ложь | U + 2264 ≤ | |
Равный | Сравнение: 1, если истина, 0, если ложь | U + 003D = | |
Больше или равно | Сравнение: 1, если истина, 0, если ложь | U + 2265 ≥ | |
Лучше чем | Сравнение: 1, если истина, 0, если ложь | U + 003E > | |
Не равный | Сравнение: 1, если истина, 0, если ложь | U + 2260 ≠ | |
Или | Логическая логика: (Ложь), если и A, и B = , 1 в противном случае. Alt: 1 (Верно), если A или B = 1 (Верно) | U + 2228 ∨ | |
И | Логическая логика: 1 (Истина), если и A, и B = 1 , 0 (Ложь) в противном случае | U + 2227 ∧ | |
Ни | Логическая логика: 1, если и A, и B равны 0, в противном случае 0. Alt: ~ ∨ = not Or | U + 2371 ⍱ | |
Nand | Логическая логика: 0, если и A, и B равны 1, иначе 1. Alt: ~ ∧ = not And | U + 2372 ⍲ | |
Левый | А | U + 22A3 ⊣ | |
Правильно | B | U + 22A2 ⊢ |
Problem 6 – Merge (1 task)
Level of Difficulty: Medium
Mail merge – gotta love it. Your spam folder is full of bad examples of this: “Dear $FIRSTNAME, do you want to purchase a bridge?” We’re given a template file with patterns such as which are to be replaced with values stored in a JSON file. Here’s a smart approach from a competitor who knows their way around the operator:
The key insight here is that since each template starts and ends with the same marker, we can partition the data on sections beginning with and then we’ll have a vector where every other element is a template to be substituted. Here’s an example of this:
I added the second row for clarity to show the alternating templates. Cool, huh? However, this only works correctly if the data leads with a template. Consider:
We still have the alternating templates, but the prefix () is lost. We can tweak the function a bit to cater for this if we need to:
Now, the competition is pitched such that “proper array solutions” are preferred – and for good reasons, most of the time. However, it’s hard to overlook some industrial regex action in this case. Strictly for Perl-fans:
8: Zigzag Numbers
The solution to problem 8 returns a if its integer argument’s digits consecutively rise and fall throughout. For example, is a zigzag number, but is not.
We saw a handful of solutions of this type:
We can decompose it like so:
It constitutes a good example of how the pattern in trains often is a natural one (this is actually an 8-train), and also shows off two uses of pairwise application to compute the pairwise difference (the sign of which indicates the direction from digit to digit) and then the pairwise product (which due to the rules for multiplication of signed numbers indicates if a change has happened or not).
Перевод чисел из одной системы счисления в другую
Наиболее простым способом перевода числа с одной системы счисления в другую, является перевод числа сначала в десятичную систему счисления, а затем, полученного результата в требуемую систему счисления.
Перевод чисел из любой системы счисления в десятичную систему счисления
Для перевода числа из любой системы счисления в десятичную достаточно пронумеровать его разряды, начиная с нулевого (разряд слева от десятичной точки) аналогично примерам 1 или 2. Найдём сумму произведений цифр числа на основание системы счисления в степени позиции этой цифры:
1. Перевести число в десятичную систему счисления.Решение: = = = Ответ: =
2. Перевести число в десятичную систему счисления.Решение: = = = Ответ: =
Перевод чисел из десятичной системы счисления в другую систему счисления
Для перевода чисел из десятичной системы счисления в другую систему счисления целую и дробную части числа нужно переводить отдельно.
Перевод целой части числа из десятичной системы счисления в другую систему счисления
Целая часть переводится из десятичной системы счисления в другую систему счисления с помощью последовательного деления целой части числа на основание системы счисления до получения целого остатка, меньшего основания системы счисления. Результатом перевода будет являться запись из остатков, начиная с последнего.
3. Перевести число в восьмиричную систему счисления.Решение: 273 / 8 = 34 и остаток 1, 34 / 8 = 4 и остаток 2, 4 меньше 8, поэтому вычисления завершены. Запись из остатков будет иметь следующий вид: 421Проверка: = = = , результат совпал. Значит перевод выполнен правильно.Ответ: =
Рассмотрим перевод правильных десятичных дробей в различные системы счисления.
Перевод дробной части числа из десятичной системы счисления в другую систему счисления
Напомним, правильной десятичной дробью называется вещественное число с нулевой целой частью. Чтобы перевести такое число в систему счисления с основанием N нужно последовательно умножать число на N до тех пор, пока дробная часть не обнулится или же не будет получено требуемое количество разрядов. Если при умножении получается число с целой частью, отличное от нуля, то целая часть дальше не учитывается, так как последовательно заносится в результат.
4. Перевести число в двоичную систему счисления.Решение: (0 — целая часть, которая станет первой цифрой результата), (0 — вторая цифра результата), (1 — третья цифра результата, а так как дробная часть равна нулю, то перевод завершён).Ответ: =
Примеры [ править ]
В следующей сортируемой таблице показаны 24 перестановки четырех элементов с разными векторами, связанными с инверсией . Подсчеты левой и правая инверсии и (последний часто называют код Лехмера ), особенно правом быть истолкована как факторные числа. дает позицию перестановки в обратном колексикографическом порядке (порядок по умолчанию в этой таблице), а последняя — позицию в лексикографическом порядке (оба отсчитываются от 0).
л{\ displaystyle l}р{\ displaystyle r}л{\ displaystyle l}
При сортировке по столбцу, в котором справа пропущен 0, факториальные числа в этом столбце соответствуют номерам индексов в неподвижном столбце слева. Маленькие столбцы являются отражением соседних столбцов, и их можно использовать для приведения их в колексикографический порядок. В крайнем правом столбце показаны суммы цифр факториалов ( OEIS : A034968 в порядке по умолчанию в таблицах).
Факториальные числа заданной длины образуют пермутоэдр, когда они упорядочены поразрядным отношением. Это правильные подсчеты инверсии (также известные как коды Лемера) перестановок четырех элементов.≤{\ displaystyle \ leq}
|
|
В другом примере, наибольшее число, которое может быть представлено шестью цифрами, будет 543210 ! что равно 719 в десятичной системе :
- 5 × 5! + 4 × 4! + 3×3! + 2 × 2! + 1 × 1! + 0 × 0 !.
Очевидно , что следующий факториала число представление после того, как 5: 4: 3: 2: 1: 0 ! это 1: 0: 0: 0: 0: 0: 0 ! что обозначает 6! = 720 10 , разрядная цифра системы счисления 7. Таким образом, первое число и его суммированное выражение, приведенное выше, равно:
- 6! — 1.
Факториальная система счисления обеспечивает уникальное представление каждого натурального числа с заданным ограничением используемых «цифр». Ни одно число не может быть представлено более чем одним способом, потому что сумма последовательных факториалов, умноженная на их индекс, всегда равна следующему факториалу за вычетом единицы:
- ∑язнак равнопя⋅я!знак равно(п+1)!-1.{\ displaystyle \ sum _ {i = 0} ^ {n} {i \ cdot i!} = {(n + 1)!} — 1.}
Это можно легко доказать с помощью математической индукции или просто заметив, что : последующие члены компенсируют друг друга, оставляя первый и последний член (см. Серию Телескопирования )
∀я,я⋅я!знак равно(я+1-1)⋅я!знак равно(я+1)!-я!{\displaystyle \forall i,i\cdot i!=(i+1-1)\cdot i!=(i+1)!-i!}
Однако при использовании арабских цифр для записи цифр (без учета нижних индексов, как в приведенных выше примерах) их простая конкатенация становится неоднозначной для чисел, у которых «цифра» больше 9. Самый маленький из таких примеров — это число 10 × 10! = 36 288 000 10 , что может быть записано как A0000000000 ! = 10: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 ! а не 100000000000 ! = 1: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0 ! что означает 11! = 39 916 800 10. Таким образом, используя буквы A – Z для обозначения цифр 10, 11, 12, …, 35, как в другой системе счисления N, получается наибольшее представимое число 36 × 36! — 1. Для произвольно больших чисел необходимо выбрать основу для представления отдельных цифр, например десятичную, и поставить разделительный знак между ними (например, путем добавления индекса каждой цифры по ее основанию, также заданному в десятичном виде, например 2 4 0 3 1 2 0 1 , это число также можно записать как 2: 0: 1: 0 ! ). Фактически, факториальная система счисления сама по себе не является системой счисления в том смысле, что она обеспечивает представление всех натуральных чисел с использованием только конечного алфавита символов, поскольку для этого требуется дополнительный знак разделения.
Problem 3 – Past Tasks Blast (1 task)
Level of Difficulty: Medium
The task here was to scrape the Dyalog APL Problem Solving Competition webpage to extract all links to PDF files. We get the suggestion to use either Dyalog’s or shell out to a system mechanism for fetching a web page.
To use , we first need to load it:
Here’s a slightly tweaked competition submission, showing great flair in how to process XML:
The problem statement suggests that a regex-based solution might be tolerable. Here’s a stab at that approach:
So which is the “better” solution? Well, the first approach has a number of advantages: firstly, is much more robust (provided that the web page is valid XHTML, which we are told is a given), meaning that we can abdicate responsibility for dealing with markup quirks (single vs double quotes, whitespace etc) to the built-in system function, and secondly, there is that (in)famous quote from Jamie Zawinski:
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems. – jwz
Mixing in a liberal helping of regular expressions in with APL is perhaps not helping APL’s unfair reputation for being write-only.
However, when dealing with patterns in textual data, as we unquestionably are here, regular expressions – even in a powerful language like APL – are sharp tools that are hard to beat, and any programmer worth their salt owes it to themselves to master them. In the case above, had the data not neatly been parseable as XML, it would have been more awkward to solve a problem like this relying only on APL primitives.
7: See You in a Bit
Problem 7 involved writing a function to compare set bits in the base-2 representations of its integer arguments. For example:
Eleven solutions used this method:
Indeed, the problem is about finding particular set bits in a binary number, hence the . The overall function is a 2-train or , where the right-hand function is itself a 3-train or .
We can break it down as follows:
The function less than or equal to only returns where a left bit is not found in the right argument:
This is pretty impressive, as it both demonstrates array orientation (in treating both arguments together) and uses Dyalog APL’s fancy inverse operator to use as many bits as necessary, while keeping the two representations aligned.
Problem 1: Take a Dive (1 task)
Level of Difficulty: Low
So let’s kick off with problem 1. The task was to calculate the score of an Olympic dive, consisting of a technical difficulty rating and a vector containing either 3, 5 or 7 judges’ scores. Only the central three ordered judges’ scores should be considered, which should be summed and multiplied by the technical difficulty rating.
Here is a cunning trick that wasn’t at all obvious:
This contestant figured out that if a vector of length 3, 5 or 7 is rotated 51 steps, then the original central three items will always end up at the beginning. No, really. It turns out that 51 is the first number such that . They tabulated the options and picked the first solution, guessing that it’d be less than 100:
But there is another way – this is one of those situations where the Chinese Remainder Theorem comes in handy, especially since it’s available on :
If you figured that out, award yourself a well-deserved pat on the back. For us mortals, we probably all did something rather more pedestrian:
9: Rise and Fall
Problem 9 involved writing a function to verify if a numeric vector has two properties:
- The elements increase or stay the same until the “apex” (highest value) is reached
- After the apex, any remaining values decrease or remain the same
For example:
Actually, nobody had this exact solution, however, a handful came very close:
Instead of trying to analyse the numbers, it does a running maximum from the left and from the right. If the minimum of those matches the original numbers, then we have exactly one peak.
We can visualise by stacking its arguments on top of one another:
When used with the two max-scans, we can see how this solution works.
Определение [ править ]
Факториальная система счисления представляет собой смешанную систему счисления с основанием системы счисления : i -я цифра справа имеет основание i , что означает, что цифра должна быть строго меньше i , и что (с учетом оснований младших цифр) ее значение, которое нужно умножить на ( i — 1) ! (его разрядная стоимость).
Radix | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
Место значение | 7! | 6! | 5! | 4! | 3! | 2! | 1! | 0! |
Поместите значение в десятичную дробь | 5040 | 720 | 120 | 24 | 6 | 2 | 1 | 1 |
Максимально допустимая цифра | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
Из этого следует, что крайняя правая цифра всегда равна 0, вторая может быть 0 или 1, третья — 0, 1 или 2 и так далее (последовательность A124252 в OEIS ). Факториальная система счисления иногда определяется как 0! место пропущено, потому что оно всегда равно нулю (последовательность A007623 в OEIS ).
В этой статье представление факториального числа будет помечено нижним индексом «!», Например, 3: 4: 1: 0: 1: 0 ! обозначает 3 5 4 4 1 3 0 2 1 1 0 , значение которого
- = 3 × 5! + 4 × 4! + 1 × 3! + 0 × 2! + 1 × 1! + 0 × 0!
- = ((((3 × 5 + 4) × 4 + 1) × 3 + 0) × 2 + 1) × 1 + 0
- = 463 10 .
(Разрядная величина на единицу меньше, чем позиция системы счисления, поэтому эти уравнения начинаются с 5 !.)
Общие свойства смешанных систем счисления счисления также применимы к факторной системе счисления. Например, можно преобразовать число в факториальное представление, производя цифры справа налево, путем многократного деления числа на основание системы счисления (1, 2, 3, …), принимая остаток как цифры и продолжая с целочисленного частного. , пока это частное не станет 0.
Например, 463 10 можно преобразовать в факторное представление следующими последовательными делениями:
|
Процесс завершается, когда частное достигает нуля. Чтение остатков назад дает 3: 4: 1: 0: 1: 0 ! .
В принципе, эта система может быть расширена для представления дробных чисел, хотя вместо естественного расширения разрядов (−1) !, (−2) !, и т.д., которые не определены, симметричный выбор значений системы счисления n = 0 , 1, 2, 3, 4 и т. Д. После точки могут использоваться вместо этого. Опять же, места 0 и 1 могут быть опущены, поскольку они всегда равны нулю. Следовательно, соответствующие значения разряда — 1/1, 1/1, 1/2, 1/6, 1/24, …, 1 / n !, и т. Д.
Шрифты
Базовая многоязычная плоскость Unicode включает символы APL в блоке Miscellaneous Technical , которые, таким образом, обычно точно отображаются из более крупных шрифтов Unicode, установленных в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Таким образом, несмотря на точность, глифы могут показаться незнакомыми программистам APL или их трудно отличить друг от друга.
Некоторые шрифты Unicode были разработаны для правильного отображения APL: APLX Upright, APL385 Unicode и SimPL.
До Unicode интерпретаторы APL поставлялись со шрифтами, в которых символы APL отображались в менее часто используемые позиции в наборах символов ASCII, обычно в верхних 128 кодовых точках. Эти сопоставления (и их национальные варианты) иногда были уникальными для интерпретатора каждого поставщика APL, что делало отображение программ APL в Интернете, в текстовых файлах и руководствах — часто проблематичным.
внешние ссылки
- Ссылка на символы APL: страница 1 , страница 2 , страница 3 , страница 4
- Страница шрифтов Британской ассоциации APL
- Кодовая страница IBM 293, также известная как кодовая страница APL на мэйнфреймах
- Общая информация о APL-символах в APL wiki
- расширение APL и его символы-операторы клавиатуры.
- Ли, Ха. «Как создать раскладку клавиатуры APL или математических символов» . Проверено 13 января 2015 .
Общие онлайн-руководства
- Практическое введение в APL 1 и APL 2 от Грэма Дональда Робертсона
- APL для ПК, серверов и планшетов — полнофункциональный NARS , без ограничений, бесплатно загружаемый APL / 2 с вложенными массивами от Sudley Place Software
- GNU APL бесплатно загружаемый интерпретатор для APL от Юргена Зауэрмана
- YouTube APL Tutorials, загруженные Чимином Паком, 8 вводных / обучающих видео для начинающих.
- Список скомпилированных руководств SIGAPL
- Изучите APL: Учебное пособие по APL от MicroAPL
Правила синтаксиса
- Игра Конвея в жизни в APL, на YouTube
- Айверсон, Кеннет Э. (1983). «Синтаксис и семантика APL» . ACM SIGAPL APL Quote Quad . 13 (3): 223–231. DOI : 10.1145 / 800062.801221 . ISBN 978-0897910958.
- Гффер, М. (1989). «Будущее APL: примеры и проблемы» . ACM SIGAPL APL Quote Quad . 19 (4): 158–163. DOI : 10.1145 / 75144.75166 . ISBN 978-0897913270.
vтеМатематические обозначения , символы и формулы | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
Перестановки [ править ]
Существует естественное отображение между целыми числами 0, …, п ! — 1 (или , что эквивалентно число с п цифрами в факторном представлении) и перестановками из п элементов в лексикографическом порядке, когда целые числа выражены в factoradic формы. Это отображение получило название кода Лемера (или таблицы инверсии). Например, при n = 3 такое отображение будет
десятичный | факторский | перестановка |
---|---|---|
0 10 | 0: 0: 0 ! | (0,1,2) |
1 10 | 0: 1: 0 ! | (0,2,1) |
2 10 | 1: 0: 0 ! | (1,0,2) |
3 10 | 1: 1: 0 ! | (1,2,0) |
4 10 | 2: 0: 0 ! | (2,0,1) |
5 10 | 2: 1: 0 ! | (2,1,0) |
В каждом случае вычисление перестановки происходит с использованием крайней левой факторадической цифры (здесь 0, 1 или 2) в качестве первой цифры перестановки, а затем удаления ее из списка вариантов (0, 1 и 2). Думайте об этом новом списке вариантов как об индексированном нулем и используйте каждую последующую фактическую цифру для выбора из оставшихся элементов. Если вторая фактическая цифра равна «0», то первый элемент списка выбирается для второй цифры перестановки и затем удаляется из списка. Точно так же, если вторая фактурная цифра равна «1», вторая выбирается и затем удаляется. Последняя фактическая цифра всегда равна «0», и поскольку список теперь содержит только один элемент, он выбирается как последняя цифра перестановки.
Процесс может стать понятнее на более длинном примере. Допустим, нам нужна 2982-я перестановка чисел от 0 до 6. Число 2982 равно 4: 0: 4: 1: 0: 0: 0 ! Фактически радикально, и это число выбирает цифры (4,0,6,2,1,3,5) по очереди, индексируя убывающий упорядоченный набор цифр и выбирая каждую цифру из набора на каждом шагу:
4: 0: 4: 1: 0: 0: 0 ! ─► (4,0,6,2,1,3,5)
Естественным индексом для группового прямого произведения двух групп перестановок является конкатенация двух факторадических чисел с двумя нижними индексами «!» S.
соединенный
Problem 9 – Upwardly Mobile (1 task)
Level of Difficulty: Hard
And so for the final question. We were offered strong hints that a neat array-oriented solution might not be possible, but that the judges were prepared to be proven wrong.
Here’s a nicely compact, recursive solution:
Finally, someone took the suggestion that an array-based solution might not be possible as a personal challenge and produced the following:
I take my hat off in admiration of the audacity: “An array solution might not be possible, eh? Hold my beer.”
So there we have it, a smörgåsbord of clever solutions to serve as an inspiration for us all. The 2020 edition of the competition sported a slightly simplified format where you were expected to tackle every problem instead of the approach in previous years where you had to make a subset selection from themed groups – this new approach remains for the current (2021) edition.
You are taking part, aren’t you?