Преобразование списка позиций, кортежей значений в один список

Я пишу код для работы с произвольными числами системы счисления в haskell. Они будут храниться в виде списков целых чисел, представляющих цифры.

Мне почти удалось заставить его работать, но я столкнулся с проблемой преобразования списка кортежей [(a_1,b_1),...,(a_n,b_n)] в один список, который определяется следующим образом:

для всех я L(a_i) = b_i. если не существует i такого, что a_i = k, a(k)=0

Другими словами, это список пар (позиция, значение) для значений в массиве. Если позиция не имеет соответствующего значения, она должна быть установлена ​​равной нулю.

Я прочитал это (https://wiki.haskell.org/How_to_work_on_lists), но не думаю, что какой-либо из этих методов подходит для этой задачи.

baseN :: Integer -> Integer -> [Integer]
baseN n b = convert_digits (baseN_digits n b)

chunk :: (Integer, Integer) -> [Integer]
chunk (e,m) = m : (take (fromIntegral e) (repeat 0))

-- This is broken because the exponents don't count for each other's zeroes
convert_digits :: [(Integer,Integer)] -> [Integer]
convert_digits ((e,m):rest) = m : (take (fromIntegral (e)) (repeat 0)) 
convert_digits []       = []

-- Converts n to base b array form, where a tuple represents (exponent,digit).
-- This works, except it ignores digits which are zero. thus, I converted it to return (exponent, digit) pairs.
baseN_digits :: Integer -> Integer -> [(Integer,Integer)]

baseN_digits n b | n <= 0 = [] -- we're done.
          | b <= 0 = [] -- garbage input. 
          | True   = (e,m) : (baseN_digits (n-((b^e)*m)) b)
                     where e = (greedy n b 0)      -- Exponent of highest digit
                           m = (get_coef n b e 1)  -- the highest digit

-- Returns the exponent of the highest digit.
greedy :: Integer -> Integer -> Integer -> Integer
greedy n b e | n-(b^e) <  0  = (e-1) -- We have overshot so decrement.
             | n-(b^e) == 0  = e     -- We nailed it. No need to decrement. 
             | n-(b^e) >  0  = (greedy n b (e+1)) -- Not there yet.

-- Finds the multiplicity of the highest digit
get_coef :: Integer -> Integer -> Integer -> Integer -> Integer
get_coef n b e m | n - ((b^e)*m) < 0  = (m-1) -- We overshot so decrement.
                 | n - ((b^e)*m) == 0 = m    -- Nailed it, no need to decrement.
                 | n - ((b^e)*m) > 0  = get_coef n b e (m+1) -- Not there yet.

Вы можете вызвать «baseN_digits n base», и он даст вам соответствующий массив кортежей, который необходимо преобразовать в правильный вывод.

Я не вижу здесь вопроса.

Michael Litchard 07.04.2019 07:04
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот что-то я собрал.

 f = snd . foldr (\(e,n) (i,l') -> ( e , (n : replicate (e-i-1) 0) ++ l')) (-1,[])
 f . map (fromIntegral *** fromIntegral) $ baseN_digits 50301020 10 = [5,0,3,0,1,0,2,0]

Кажется, я понял ваши требования (?)

Обновлено: Возможно, более естественно,

f xs = foldr (\(e,n) fl' i -> (replicate (i-e) 0) ++ (n : fl' (e-1))) (\i -> replicate (i+1) 0) xs 0

Интересное решение

firstname gklsodascb 07.04.2019 15:39

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