Часы (транслитерация) Шифр

12

Вступление:

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


С Шифром Часов мы используем следующее изображение для шифрования текста:

введите описание изображения здесь
Так что предложение вроде this is a clock cipherбы стало:

t  h i s     i s     a     c l  o  c k     c i p  h e r    (without additional spaces of course, but added as clarification)
19:7:8:18:00:8:18:00:AM:00:2:11:14:2:10:00:2:8:15:7:4:17

Вызов:

Получив строку sentence_to_encipher, зашифруйте ее, как описано выше.

Правила вызова:

  • Вы можете предполагать, что sentence_to_encipherзавещание будет содержать только буквы и пробелы.
  • Вы можете использовать либо строчные, либо прописные буквы (укажите, какой из них вы использовали в своем ответе).
  • Вы не можете добавить ведущие нули для одной цифры шифрованных писем bчерез j, но два нуля 00является обязательным для пространств.
  • Вы должны использовать в :качестве разделителя, и дополнительный ведущий или трейлинг :не допускается.
  • Вам разрешено использовать строчные буквы, amа pmне прописные AMи PM, если это не противоречит.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

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

Input:  "this is a clock cipher"
Output: "19:7:8:18:00:8:18:00:AM:00:2:11:14:2:10:00:2:8:15:7:4:17"

Input:  "test"
Output: "19:4:18:19"

Input:  "what time is it"
Output: "22:7:AM:19:00:19:8:12:4:00:8:18:00:8:19"

Input:  "acegikmoqsuwy bdfhjlnprtvxz"
Output: "AM:2:4:6:8:10:12:14:16:18:20:22:24:00:1:3:5:7:9:11:13:15:17:19:21:23:PM"

Input:  "easy peazy"
Output: "4:AM:18:24:00:15:4:AM:PM:24"
Кевин Круйссен
источник
Связанные
Кевин Круйссен
Разрешено ли выводить [7, ":", 8, ":", "00", ":", 1, ":", 14, ":", 1]для hi bobили нужно присоединиться к результату? Кстати, аккуратный шифр!
г-н Xcoder
@ Mr.Xcoder Извините, ради темы шифра я бы сказал, что она должна быть объединена в одну строку (или весь список в виде списка символов ['7', ':', '8', ':', '0', '0', ':', '1', ':', '1', '4', ':', '1']).
Кевин Круйссен

Ответы:

5

05AB1E , 22 21 байт

„AM24L„PM00)˜Að«s‡':ý

Попробуйте онлайн! или как тестовый набор

Некоторые альтернативные 21- байтовые решения:

':ýAð«24L„AMš„PMª00ª‡
00„AM24L„PM)˜AIk>è':ý
Emigna
источник
Хороший ответ, мне удалось получить 23 байта за несколько подходов (одним из которых был мой в настоящее время удаленный ответ). Это отличный способ упорядочить свой стек для сохранения байта!
Мистер Xcoder
1
Альтернативный 22-значный, сочетающий наши ответы: попробуйте онлайн!
г-н Xcoder
@ Mr.Xcoder: Моя первая идея на самом деле выглядела так, но на 2 байта хуже, потому что я не помню, чтобы ªэто изменилось :)
Emigna
Я нашел 20 байтов, используя часть подхода @ Mr.Xcoder , но я позволю вам разобраться с этим самостоятельно, прежде чем я открою это. :)
Кевин Круйссен
1
@KevinCruijssen: я дам вам знать после того, как
посмотрю
4

Perl 6 , 47 байт

*.ords>>.&{<<00 AM{1..24}PM>>[$_%32]}.join(":")

Попробуйте онлайн!

Анонимный Любая лямбда, которая принимает строку в любом случае и возвращает зашифрованную строку.

Объяснение:

*.ords>>.&{                         } # Map the ordinal values to
           <<              >>[$_%32]  # The index in the list
              00 AM{1..24}PM  # 00, AM, the numbers 1 to 24 and PM
                                     .join(":")   # And join with colons
Джо Кинг
источник
3

Pyth, 25 байт

j\:m@+++"AM"S24"PM""00"xG

Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .

j\:m@+++"AM"S24"PM""00"xGdQ   Implicit: Q=eval(input()), G=lowercase alphabet
                              Trailing dQ inferred
            S24               [1-24]
       +"AM"                  Prepend "AM"
      +        "PM"           Append "PM"
     +             "00"       Append "00" - this is the dictionary
   m                      Q   Map each element of Q, as d, using:
                       xGd      Get the index of d in G, -1 if not present (i.e. space)
    @                           Get the element from the dictionary at the above index
j\:                           Join the result on ":", implicit print
Sok
источник
3

Java (JDK) , 95 байт

s->{int a=0;for(var c:s)System.out.print((a++<1?"":":")+(c<33?"00":c<66?"AM":c>89?"PM":c-65));}

Попробуйте онлайн!

кредиты

  • -1 байт благодаря Кевину Круйссену
Оливье Грегуар
источник
Один легкий гольф: charдо var. :)
Кевин Круйссен
Благодарность! Теперь так очевидно, что ты мне это показываешь ...
Оливье Грегуар
3

C # (интерактивный компилятор Visual C #) , 70 байт

s=>string.Join(":",s.Select(a=>a<33?"00":a<66?"AM":a>89?"PM":a%65+""))

Принимает ввод в виде строчных букв. Сначала проверяется, является ли символ пробелом, и если это так, преобразует его в 00. Затем он проверяет, является ли символ A, и преобразует его в AM. Он снова проверяет Z и преобразует его в PMесли оно есть. Наконец, если символ проходит все проверки, он конвертируется в алфавитный порядок-1.

-2 байта благодаря @dana

Попробуйте онлайн!

// Input taking a string
s => 
// Join the following IEnumerable<char> with a ":" character
string.Join(":", 
// Map all the characters in the string
s.Select(a => 
// Is the char less than 33, aka a space?
a < 33 ? 
// If so, it's a "00"
"00" 
// Else, is this an 'A'?
: a < 66 ?
// If so, convert it to "AM"
"AM" : 
// If it's not 'A' or a space, could it be a 'Z'?
a > 89 ?
// If it is, turn the character into "PM"
"PM" : 
// If it fails all of the checks above, get the characters position in the alphabet and subtract one from that.
a % 65 + ""))
Воплощение невежества
источник
2

Рубин , 49 байтов

->a{a.map{|c|["00",:AM,*1..24,:PM][c.ord%32]}*?:}

Попробуйте онлайн!

Perl от Джо Кинга . Принимает ввод как массив символов, возвращает строку с AM / PM в верхнем регистре.

Кирилл Л.
источник
2

05AB1E , 20 байтов

':ýð00:A24L„AMš„PMª‡

Сильно вдохновлен 22-байтовым @ Mr.Xcoder в комментарии к существующему ответу 05AB1E @Emigna .

Принимает ввод как список строчных символов (будет 21 байт с лидирующим Sсимволом, если я возьму ввод в виде строки).

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

':ý            '# Join the (implicit) input list of characters by ":"
                #  i.e. ["e","a","s","y"," ","p","e","a","z","y"] → "e:a:s:y: :p:e:a:z:y"
ð00:            # Replace all spaces " " with "00"
                #  i.e. "e:a:s:y: :p:e:a:z:y" → "e:a:s:y:00:p:e:a:z:y"
A               # Push the lowercase alphabet
 24L            # Push a list in the range [1,24]
    AMš        # Prepend "AM" at the start of this list
        PMª    # And append "PM" at the end of the list
               # Transliterate; mapping letters to the list-items at the same indices
                # (and output the result implicitly)
                #  i.e. "e:a:s:y:00:p:e:a:z:y" → "4:AM:18:24:00:15:4:AM:PM:24"
Кевин Круйссен
источник
1
О да. Замена пробела отдельно экономит байт. Я должен был попробовать это. Ницца :)
Эминья
1

Древесный уголь , 26 байт

UB:Fθ«→≡ι ×0²a¦AM¦z¦PMI⌕βι

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод в нижнем регистре (можно тривиально изменить на верхний регистр). Объяснение:

UB:

Установите фоновый символ на :. Это заполняет промежутки между выходными значениями, созданными правильным движением.

Fθ«→

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

≡ι ×0²a¦AM¦z¦PM

Включите символ и, если это пробел, aили zвыведите соответствующий код. Я использую ×0²вместо этого, 00поскольку последний будет стоить два байта в дополнительных разделителях.

I⌕βι

В противном случае выведите позицию буквы 0 в алфавите строчных букв в виде строки.

Нил
источник