Как соотнести значения со списком в Scheme? - Lisp

  1. После года самостоятельного изучения Python в качестве первого и основного ЯП, пришел я в университет в магистратуру, где в качестве функционального ЯП предлагается писать задачи на Scheme. Привыкнув писать по императивной парадигме, спотыкаться начал практически сразу же. Например. Требуется написать программу, которая вычисляет день недели по дате. Пусть процедура принимает год-месяц-день и возвращает числа от 0 (понедельник) до 6 (воскресенье). Покопавшись по вопросу реализации подобного алгоритма, набрёл на интересное решение на Python:Python1 2 3 4 5 6 7 def whatDay(day, month, year):     days = ["пн","вт","ср","чт","пт","сб","вс"]     a = (14 - month) // 12     y = year - a     m = month+12 * a-2     result = ((7000 + (day + y + y//4 - y//100 + y//400 + (31*m) // 12)) % 7) - 1     return days[result]Не получается перестроить данное решение под, собственно, Scheme. Пробовал так:


textual

Код к задаче: «Как соотнести значения со списком в Scheme? - Lisp»

(define (day-of-week day month year)
  (let* ((days '(mon tue wed thu fri sat sun))
         (a (quotient (- 14 month) 12))
         (y (- year a))
         (m (+ month (* 12 a) -2))
         (result (- (remainder (+ 7000
                                  day
                                  y
                                  (quotient y 4)
                                  (- (quotient y 100))
                                  (quotient y 400)
                                  (* m 31))
                               7)
                    1)))
    (list-ref days result)))

СДЕЛАЙТЕ РЕПОСТ

14   голосов, оценка 3.786 из 5



Похожие ответы
  1. Не могли бы помочь написать программу (common lisp) Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный. Результат вывести в стандартный поток вывода. Примеры преобразования: 65535 (11111111 11111111) ==> 13107 (00110011 00110011) 333444 (00000101 00010110 10000100) ==> 644740 (00001001 11010110 10000100)

  1. Здравствуйте! Помогите с задачей, пожалуйста: Написать функцию для вычисления значения полинома для заданного аргумента по схеме Горнера. Коэффициенты полинома заданы в виде списка или одномерного массива. Предусмотреть проверку корректности данных.

  1. Задание Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный. Результат вывести в стандартный поток вывода. Примеры преобразования: 65535 (11111111 11111111) ==> 13107 (00110011 00110011) 333444 (00000101 00010110 10000100) ==> 644740 (00001001 11010110 10000100)

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

  1. Определите функцию, которая возвращает в качестве значения свой вызов. Как это сделать?

  1. Определите функцию, которая возвращает в качестве значения форму своего определения (DEFUN). Как это сделать?

  1. Вычислить значения функции (y=10/1+x), где (0<=x<=20) с шагом 0,5. Все полученные значения хранить в списке. Использовать рекурсию.

  1. Нужно решить задачу Определите функцию, заменяющую в исходном списке все вхождения заданного значения другим. Как это сделать?