Pigpen Cipher Encryption
Votre mission est simple: écrire un programme qui reçoit du texte en entrée et en génère une représentation ASCII dans le Pigpen Cipher .
Contribution
Caractères ASCII uniquement (pas d'Unicode). Vous devez être capable de gérer au moins 16384 caractères et 256 lignes.
Production
- Remplacez tous les caractères qui ne sont pas de nouvelles lignes ou dans
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ouabcdefghijklmnopqrstuvwxyz
par des espaces. - Insensible à la casse, remplacez chaque lettre par sa forme cryptée (voir la section suivante), en insérant un espace de fin sur chacune des trois lignes après chacune. Chaque caractère encodé est un bloc 3 * 3 de l'art ASCII. Remplacez les espaces par 3 * 3 blocs d'espaces.
- Tous les caractères doivent être sur les mêmes trois lignes (appelez ces trois lignes une ligne pigpen), à moins qu'il n'y ait une nouvelle ligne, qui démarre une nouvelle ligne pigpen. Laissez une ligne normale vide entre les lignes de porcherie.
Le chiffre
| | | |
.| |.| |.
--+ for J +-+ for K +-- for L
--+ +-+ +--
.| |.| |.
--+ for M +-+ for N +-- for O
--+ +-+ +--
.| |.| |.
| for P | | for Q | for R
(ABCDEFGHI are the same as JKLMNOPQR, but with the . replaced by a space)
\./
V for W (note the row of 3 spaces on the top)
^
/.\ for Z (note the 3 spaces on the bottom)
\
.>
/ for X (note the leading spaces)
/
<.
\ for Y (note extra trailing spaces)
(STUV are like WXYZ, but with the . replaced by a space)
Exemple
L'entrée "hEllo, wORLd" devrait produire:
+-+ +-+ | | +-- +-- +-- | --+
| | | | |. |. |. \./ |. |. |. |
| | +-+ +-- +-- +-- V +-- | +-- --+
Le codage base64 de ce qui précède, avec une nouvelle ligne de fin, est ci-dessous. La somme md5 est 6f8ff1fed0cca4dd0492f9728ea02e7b
.
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK
Sans nouvelle ligne de fin, le md5sum est 581005bef7ee76e24c019d076d5b375f
et le base64 est:
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =
Règles
- Les failles standard sont interdites.
- C'est le golf de code. Le code le plus court gagne.
- Dans les langues qui ne peuvent pas accepter plusieurs lignes d'entrée à la fois (par exemple JavaScript avec
prompt()
), utilisez*
(ou un autre caractère) comme séparateur de ligne.
Erranda
- Il manquait quelques espaces à l'exemple (un espace doit être composé des espaces de fin du caractère précédent, le cas échéant, lui-même et de ses propres espaces de fin). Cela a maintenant été corrigé.
prompt
Est généralement utilisé pour la saisie, mais il n'accepte qu'une seule ligne. Puis-je utiliser un caractère spécial (comme '*') pour marquer une nouvelle ligne en entrée?.Réponses:
JavaScript (ES6) 312
327 340 372 446Sans compter les espaces blancs d'indentation et les nouvelles lignes
- pourrait être joué davantage. Utiliser un «*» pour marquer les nouvelles lignes en entrée, carprompt
accepte une seule ligne.Test dans la console FireFox / FireBug
Entrée: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!
la source
o
etw
dans "Hello world", l'OP n'en a que 4C # -
921720Évidemment pas une entrée gagnante, mais cela semblait trop amusant à faire passer :)
Le programme prend l'entrée comme un seul, puis imprime le porcher. Pour entrer plusieurs lignes, utilisez un trait de soulignement (_) comme indiqué dans la sortie .
Code
Concept
Le chiffrement utilise quelques séquences de caractères qui se reproduisent un peu. Par exemple, «-» apparaît 16 fois et «__» (deux espaces) apparaît 20 fois. Je remplace ces séquences par des symboles à un seul caractère et les éteins au moment de l'exécution, réduisant de moitié le nombre de caractères nécessaires pour stocker le chiffre du porcherie. De même, une nouvelle ligne nécessite généralement deux caractères, mais est remplacée par un symbole (n) et désactivée plus tard.
Le programme gère plusieurs lignes d'entrée en divisant l'entrée en un tableau où chaque élément est une seule ligne d'entrée. Le programme exécute ensuite simplement le chiffre sur chaque ligne séparément.
C'est mon premier golf dans n'importe quelle langue, donc il y a probablement beaucoup à faire pour améliorer ce code.
Production
la source
for(int i=0;i<p.Length; i++)
(près du milieu)m♥lti \n lin♣e \n input
, mon téléphone rend cela comme ayant un cœur au lieu de u en multi, et un club entre le n et le e en ligne. Pourquoi donc?Python 2, 180 + 78 + 1 + 3 = 262 caractères
Le programme à 180 octets (les deux dernières nouvelles lignes sont des onglets):
Nécessite un fichier de 78 octets appelé «f» pour être le même répertoire (+1 octet pour le nom de fichier), qui contient les éléments suivants:
L'encodage base64 du fichier
f
est:Le programme se ferme avec une exception,
2>_
supprime l'erreur (+3 octets):Explication :
J'ai créé une table de recherche,
L
qui est un mappage de{position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}
, stockée dans un tableau plat. Le programme imprime les lettres en effectuant une simple recherche pour chaque position.la source
f
et trois octets pour2>_
Perl 5
-lF
,297 288 261231 octetsEssayez-le en ligne!
Il y a probablement encore un peu ici qui pourrait être joué plus loin.
la source