Частота анализа сценариев Bash уникальных букв и пар повторяющихся букв, как мне создать этот сценарий? - PullRequest
1 голос
/ 15 февраля 2011

Хорошо, первое сообщение ..

Итак, у меня есть это задание для расшифровки криптограмм вручную, но я также хотел немного автоматизировать процесс, если не все, по крайней мере, несколько частей, поэтому я просмотрел и нашел несколько лайнеров sed и awk one, чтобы сделать некоторые вещи, которые я хотел сделать, но не все, что хотел / нуждался.

Есть некоторые сайты, которые вроде как делают то, что я хочу, но я действительно хочу просто сделать это в bash по какой-то причине, просто потому, что я хочу понять это лучше и так далее:)

Сценарий примет имя файла в качестве параметра и выведет другой файл, такой как solution$1, когда будет готово.

if [ -e "$PWD/$1" ]; then
 echo "$1 exists"
else
  echo "$1 doesnt exists"   
fi

Запустил бы скрипт, чтобы увидеть, существует ли файл в параметре ..

Тогда я нашел этот лайнер

sed -e "s/./\0\n/g" $1 | while read c;do echo -n "$c"  ; done

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

Вот то, чего я пытаюсь добиться более или менее http://25yearsofprogramming.com/fun/ciphers.htm для подсчета уникальных буквенных случаев и тому подобное.

Затем мне нужно поместить все буквы в нижний регистр.

После этого я вижу сценарий, выполняющий эти вещи .. -скрипт, который сканирует файл словаря по определенному шаблону и размеру слов чем больше слов, тем лучше. Например: скажем, решением является слово «одежда», а зашифрованное слово - «zxxzgvk» существует ли способ регулярного выражения для выражения шаблона, который сравнивает эти два слова и перечисляет слово «одежда» в файле словаря, потому что «appa» и «zxxz» являются похожими шаблонами, а «zxxzgvk» имеет такую ​​же длину с «одеждой»

  1. Можно ли это сделать частично, и реалистично ли смотреть на проблему, как эта, или это просто надумано?

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

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

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

  1. Кто-нибудь видел эту проблему в прошлом и пытался решить ее с помощью шаблонов в словах как я описал, или это слишком сложно?

  2. Должен ли я регистрировать любой из свопов?

Может быть, просто отсканируйте все зашифрованные слова и поменяйте местами, а затем сделайте еще одну зачистку с наличием для ограничения в первом цикле, чтобы не изменять заглавные буквы (фактически использовать их как более точные шаблоны ..!)

Кто-нибудь делал похожий скрипт / программу в другом языке? Если да, то какой? Может быть, я могу как-то относиться :) 1052 *

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

Я с радостью включу криптограммы, которые я декодировал, и ту, которую мне еще предстоит расшифровать:)

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

Сама криптограмма основана на простой буквенной замене.

Я сделал пастин с кодом, который будет :) http://pastebin.com/UEQDsbPk

В псевдокоде я вижу это так:

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

Более или менее этос моей точки зрения, сценарий структурирован.

  1. Вы видите что-нибудь, что я должен добавить, я что-то пропустил?

Надеюсь, эта пересмотренная версия более понятна для всех!

Ответы [ 2 ]

1 голос
/ 15 февраля 2011
grep -o . inputfile | sort | uniq -c | sort -rn

Пример:

$ echo 'aAAbbbBBBB123AB' | grep -o . | sort | uniq -c | sort -rn
  5 B
  3 b
  3 A
  1 a
  1 3
  1 2
  1 1
1 голос
/ 15 февраля 2011

Tl, доктор, чтобы быть откровенным.На единственный вопрос, который я нашел - ответ да :) Пожалуйста, разделите его на более мелкие задачи, и мы будем рады помочь вам - если вы не найдете ответа на эти небольшие вопросы раньше.

Если вы можете поместить его в псевдокоде, это будет проще.В Unix есть все виды текстовых манипуляций.Способ применения зависит от того, насколько велики ваши тексты.Я считаю, что они не такие большие, иначе вы бы использовали какой-то скомпилированный язык.

Например, простой, но дорогой способ подсчета частот:

awk -F "" '{for(i=1;i<=NF;i++) freq[$i]++;}END{for(i in freq) printf("%c %d\n", i, freq[i]);}'

Что касается транслитерации, то здесь естьtr утилита.Вы можете подделать, а затем передать ему фактические строки в каждом случае (что верно для Цезарьоподобных шифров).

...