Как печатать значения между двумя числами в APL?

Я не могу печатать значения от 30 до 50 включительно в APL.

На самом деле я пробовал так много операторов, но не работал.

Указание того, какую реализацию и версию APL вы используете, поможет людям дать вам лучший ответ.

Adám 19.04.2023 12:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
87
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Каковы ваши ограничения? Вы хотите определить функцию или просто хотите знать, как выполнять итерацию? Означает ли «печать» возврат в качестве результата или буквально печать куда-то (выход/файл)?

Самый простой способ — использовать iota для перебора расстояния между двумя границами, а затем добавить к результатам меньшую. Предполагая, что начало индекса IO установлено на 0:

    30 + ⍳21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Если IO установлено на 1, опустите нижнюю границу:

    29 + ⍳21
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Вы всегда можете проверить или установить IO с помощью ⎕IO, если хотите переключиться:

    ⎕IO ← 0
0

На самом деле я хотел напечатать случайные 12 значений от 8 до 30.

Akshay Atanure 02.05.2023 12:35

Решение @pmf простое, но может быть очень неэффективным (для двух больших, но близких значений) и дает сбой, если любое число отрицательное.

Если мы назовем границы и , то ⍺+¯1+⍳1+⍵-⍺ будет одновременно эффективным и общим. Удалите ¯1+, если ⎕IO равно 0. Вы можете создать функцию to, используя эту формулу, следующим образом:

      to←{(⍺-⎕IO)+¯1+⍳1+⍵-⍺}
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

В качестве альтернативы, если вы используете Dyalog APL, вы можете использовать служебную функцию to из рабочей области dfns следующим образом:

      'to' ⎕CY 'dfns'
      30 to 50
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Что касается вашего первого решения, не будет ли to←{(⍺-⎕IO)+⍳1+⍵-⍺} решать его независимо от ⎕IO?

Jeff Zeitlin 19.04.2023 13:37

@JeffZeitlin Да, конечно, но я хотел, чтобы формула была простой. Однако я изменю определение функции.

Adám 19.04.2023 17:27

На самом деле я хотел напечатать случайные 12 значений от 8 до 30.

Если для ⎕IO установлено значение 1, вы можете сгенерировать случайное целое число, большее или равное 1 и меньшее или равное 23, используя ?23 (или ?1+30-8). Затем добавьте 7 (или 8-1) к результату, и он будет сдвинут между 8 и 30 включительно: 7+?23. (Если для ⎕IO установлено значение 0, сгенерированное случайное число будет варьироваться от 0 до 22, поэтому для достижения диапазона назначения вам придется добавить 8, а не 7, или (8-⎕IO) в более общем смысле, если независимость от ⎕IO вызывает беспокойство.)

Теперь, чтобы получить более одного случайного числа из этого диапазона, укажите ? в его левом аргументе количество розыгрышей, которые вы хотели бы увидеть. В результате получается массив такой длины.

      7+12?23
23 21 9 8 10 27 12 30 28 19 26 14

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

      7+?12⍴23
9 8 30 16 13 25 26 8 26 19 19 18

Другие вопросы по теме