Nano Hash - криптовалюты, майнинг, программирование

кодировщик и декодер python

Я хотел бы создать кодировщик и декодер, используя текстовое кодирование.

Строка «AAABBBDDDDDDDDDDEEDDDD» в качестве входных данных, возвращающая строку «A3B4C1D10E2D4», где за каждым символом алфавита следует его частота в строке. Декодер меняет процесс.

Хотел бы помочь начать работу с python.

26.01.2013

  • вы пробовали что-нибудь .. любую строку кода ?? 26.01.2013
  • Что вы пробовали? 26.01.2013
  • Так что попробуйте, может быть, с циклом for. Так у вас больше шансов получить полезные ответы. 26.01.2013
  • @JohnWard Что ты имеешь в виду? Запустите блокнот или какую-нибудь другую IDE — это хорошее начало. Мы не будем (или, по крайней мере, не должны) давать вам решения. Попробуйте что-нибудь, а затем возвращайтесь к нам с тем фрагментом кода, который у вас будет. Тогда мы проанализируем это и поможем вам (или нет). Не ленись. Вы также можете понять, что вам даже не нужна помощь. 26.01.2013

Ответы:


1

Одним из возможных решений для cnoder было бы просто перебрать строку и подсчитать количество вхождений символов, не очень красиво, но O (n).

def encode(s):
    last  = s[0]
    count = 0
    for c in s:
        if last != c:
            yield '%s%i' % (last, count)
            last = c
            count = 0
        count += 1
    yield '%s%i' % (last, count)

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

import re

def decode(s):
    for c, n in re.findall(r'(\w)(\d+)', s):
        yield c * int(n)

учитывая ваш тестовый ввод

s = 'AAABBBBCDDDDDDDDDDEEDDDD'

encoded = ''.join(encode(s))
print encoded

decoded = ''.join(decode(encoded))
print decoded

приводит к

A3B4C1D10E2D4
AAABBBBCDDDDDDDDDDEEDDDD

Еще одно замечание: здесь нет реальной причины использовать yield, вы, конечно, также можете сначала создать строки в функциях en-/decode, а затем вернуть.

26.01.2013
  • -1: Прежде всего предполагается, что ввод не содержит цифр. Во-вторых: регулярные выражения? Серьезно? И, наконец, решение таких вопросов — это поведение против переполнения стека. 26.01.2013
  • Прежде всего, ввод вряд ли может содержать цифры, чтобы получить такой вывод, иначе вам понадобится какой-то разделитель между буквой и количеством букв. Во-вторых, да, регулярные выражения выполняют свою работу — используйте свои инструменты. И наконец: спасибо, что прояснили это, я постараюсь добиться большего успеха в будущем. 26.01.2013
  • Да, я думаю, вы правы насчет цифр. Что касается регулярных выражений: я просто нахожу это немного излишним в этом сценарии, особенно если мы исключаем цифры из ввода. 26.01.2013
  • Какая альтернатива? Просматривать строку символ за символом, по сути, создавая свой собственный небольшой парсер? Я бы согласился с вами, если бы счет мог быть только одной цифрой, но ясно, что он может быть произвольной длины, поэтому вам придется как-то его анализировать. 26.01.2013
  • @pyrrrat: есть однострочное решение groupby (две строки идут в другую сторону, хотя я думаю, что мог бы упаковать их в одну, если бы мне пришлось). 26.01.2013
  • @DSM Мне нравится решение с использованием groupby для кодировщика, я не знал об этой функции. Однако для декодера, о котором мы спорили, я все же думаю, что re.findall идеально подходит. Я не могу придумать почти читаемого решения с использованием groupby. 26.01.2013
  • +1: чтобы компенсировать недооцененное понижение и для decode() 27.01.2013

  • 2

    Проверьте эти вопросы не совсем то, что вы хотите, но это может помочь вам попытаться это сделать.

    Определение частоты букв шифрованного текста

    26.01.2013

    3

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

    Чтобы дать вам представление о силе батарей Python, я предлагаю решение с использованием groupby

    >>> ''.join("{}{}".format(k, sum(1 for e in v))
            for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
    'A3B4C1D10E2D4'
    

    Отличительные особенности этого решения

    1. itertools.groupby группирует похожие последовательные данные в виде пары ключей и значений где ключ — повторяющийся элемент, а значение — группа повторений
    2. Поскольку группа является генератором, len здесь может не работать, но возможна способ вычисления длины любой итерации, не связанной с последовательностью, заключается в использовании sum
    3. str.join объединяет итерируемый объект для создания строки с любым предоставленным разделитель, в данном случае это пустая строка
    26.01.2013
  • len(list(v)) может быть немного быстрее в некоторых случаях, хотя sum подходит, если v может быть бесконечным. 30.01.2013

  • 4

    Я бы начал с просмотра документации python string, в частности найти или подсчитать и работать оттуда. Хотя я не уверен, что вы действительно могли бы декодировать что-либо, что вы кодируете, если фактическое содержимое внутри строки имеет значение таким образом.

    26.01.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..