Код-Гольф — Близость К Шифрам

  • Автор темы Glucklichman
  • Обновлено
  • 22, Oct 2024
  • #1

Описание

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

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


Описание

Вы должны вывести то, что, по вашему мнению, является решением заданной задачи. Аффинный шифр. Короче говоря, аффинные шифры кодируются по следующей формуле для каждого символа открытого текста:

 
 
 
 -100 byte 
where Nh wrteq tfwrx, tgy t yezvxh gjnmgrxx stpgx / Nh xrgxr, tx qwzjdw zk wrnuzfb p wty yejgb, / Ze rnsqpry xznr yjuu zsptqr qz qwr yetpgx / Zgr npgjqr stxq, tgy Urqwr-vteyx wty xjgb. My heart aches, and a drowsy numbness pains / My sense, as though of hemlock I had drunk, / Or emptied some dull opiate to the drains / One minute past, and Lethe-wards had sunk. и Ugifc ism ozsmvd kpync g fssw st ryceco sb estbcnny. Maybe you should write a book on pieces of confetti. are constants, Yeq lkcv bdk xcgk ez bdk uexlv'm qplqgwskmb. You lead the race of the world's unluckiest. - буква зашифрованного текста, и @nLWc@ wc! m neCN. @tHIs@ is! a teST. is the plaintext letter. In this case, the letter "a" has the value of 0, "b" 1, and so on and so forth.

Правила

  1. Что касается моего предыдущего уравнения, в шифрах вы будете расшифровывать dictionary.txt will только быть числом, взаимно простым с 26.

  2. Для проверки достоверности расшифрованных слов вы можете использовать словарь по вашему выбору (обратите внимание, что слова «i» и «a» должны быть перечислены; достоверность остальных букв не имеет значения, но я рекомендую писать только «i» и «a». «а» действителен).

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

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

  5. Когда вы выводите свою декодировку, вам следует вывести ту, которая, по вашему мнению, является наиболее правильной (т. е. ту, в которой больше всего английских слов).

  6. Если ты это сделаешь нет воспользуйся словарем, потребуй tyyrbd bonus on your submission.

  7. При проверке слов на предмет их достоверности проверяйте только смежные алфавитные символы (например, вы проверяете 20, 21, 21, 18, 2, 4 as one word but b как двое: 18, 19, 19, 12, 0, 2 and 18, 45, 45, 12, 0, 54 ). Слова не обязательно будут одного падежа.

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

  9. Хотя было бы неплохо, если бы вы это сделали, оптимизация скорости не требуется и не принесет вам никаких бонусов.

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

  11. Если вы не используете словарь, вы не можете читать внешние файлы (т. е. логика, используемая для определения того, является ли слово словом в английском языке или нет, должна содержаться внутри программы).

Пример кодировки

Вот пример кодирования, выполненный с помощью простых чисел ( a )

6, 15, 15, 2, 0, 18

Сначала мы выражаем наши входные данные численно

foobar

Затем умножаем на a = 3, b = 2

word

При необходимости уменьшить до наименьшего положительного остатка

pa

Добавлять pa$$word

#affineciphers

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

-100 byte

Вход

Вы должны иметь возможность обрабатывать любые символы, но закодированы будут только алфавитные символы (как заглавные, так и строчные).

Выход

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


Тестовые случаи

Ввод, за которым следует ожидаемый результат. Здесь — словарь, который вы должны использовать (если вы его используете). Сохраните это как a (or whatever you want, really), and input its name for testing. This dictionary should have almost all the words in the test cases, with some left out intentionally to test if your program will still output.

Тестовый пример 1:

P

Тестовый пример 2:

C

Тестовый пример 3:

b

Тестовый пример 4:

a

Примечания

C ≡ aP + b (mod 26) bonus is subject to increase (i.e. more bytes will be subtracted) if I deem it to be too low. If it's not low enough (i.e. it's too much of a bonus), I will not change it provided that there are answers that have claimed it already.

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

#код-гольф #криптография

Glucklichman


Рег
07 Feb, 2011

Тем
64

Постов
166

Баллов
526
  • 26, Oct 2024
  • #2

Ява 8, 608

 
 import java.nio.file.*;
import java.util.*;
import java.util.function.*;

public class C {

static final Consumer<String> f = s -> {

try {

List<String> d = Files.readAllLines(Paths.get("d"));

int v = java.util.stream.IntStream.range(0, 676).mapToObj(I -> new int[]{I, (int) Arrays.stream(s.toLowerCase().split("[^a-z]+")).map(u -> {

char[] x = new char[u.length()];

for (int i = x.length; i-- > 0;) {

x[i] = (char) (((u.charAt(i) - 'a') * (I % 26) + I / 26) % 26 + 'a');

}

return new String(x);

}).filter(d::contains).count()}).max((m, n) -> m[1] - n[1]).get()[0],

a = v % 26,

b = v / 26;

s.chars().forEach(h -> System.out.print((char) (h >= 'a' && h <= 'z' ? ((h - 'a') * a + b) % 26 + 'a' : h >= 'A' && h <= 'Z' ? ((h - 'A') * a + b) % 26 + 'A' : h)));

} catch (Exception e) {

}

};

public static void main(String[] args) {

f.accept("@nLWc@ wc! m neCN.");

}
}
 

Это куча импорта, а затем лямбда-выражение. Ниже приведен работоспособный и читаемый код:

import java.nio.file.*;import java.util.*;import java.util.function.*;s->{try{List<String>d=Files.readAllLines(Paths.get("d"));int v=java.util.stream.IntStream.range(0,676).mapToObj(I->new int[]{I,(int)Arrays.stream(s.toLowerCase().split("[^a-z]+")).map(u->{char[]x=new char[u.length()];for(int i=x.length;i-->0;)x[i]=(char)(((u.charAt(i)-'a')*(I%26)+I/26)%26+'a');return new String(x);}).filter(d::contains).count()}).max((m,n)->m[1]-n[1]).get()[0],a=v%26,b=v/26;s.chars().forEach(h->System.out.print((char)(h>='a'&&h<='z'?((h-'a')*a+b)%26+'a':h>='A'&&h<='Z'?((h-'A')*a+b)%26+'A':h)));}catch(Exception e){}}

Словарь должен храниться в файле с именем «d» без расширения. По одному слову в строке.

 

Kokosik_6


Рег
21 May, 2020

Тем
73

Постов
210

Баллов
605
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно