Pigpen Cipher Encryption

11

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 ABCDEFGHIJKLMNOPQRSTUVWXYZou abcdefghijklmnopqrstuvwxyzpar 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 581005bef7ee76e24c019d076d5b375fet 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é.

la source
1
Je me souviens d'avoir joué avec ça quand j'étais enfant, mais je n'en ai jamais connu le nom. Merci!
Geobits du
Puis-je utiliser une police personnalisée? :-)
Florian F
@FlorianF No ...
Codage en javascript. promptEst 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?.
edc65
@ edc65 Oui, vous pouvez

Réponses:

4

JavaScript (ES6) 312 327 340 372 446

Sans compter les espaces blancs d'indentation et les nouvelles lignes - pourrait être joué davantage . Utiliser un «*» pour marquer les nouvelles lignes en entrée, car promptaccepte une seule ligne.

console.log(prompt().split('*').map(s=>
  [0,1,2].map(r=>
  [...s].map(c=>o+=n+
    '   \\1/ \\ /1\\ /  V  ^  1><1 --++-++-- 1||1||1 '.substr(
    (c=(32|c.charCodeAt())-97)<0|c>25?0:c<18
     ?27+3*'330441552030141252033144255'[f=8,c%9*3+r]
     :3*'482630015274'[f=21,c%4*3+r],3,n=' ')
  .replace(1,' .'[r&c>f])
  ,n='\n'),o=''
)&&o).join('\n'))

Test dans la console FireFox / FireBug

Entrée: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

  | | | |   --+ +-+ +-- --+ +-+ +--
  | | | |     | | | |     | | | |  
--+ +-+ +-- --+ +-+ +--   | | | |  

  | | | |   --+ +-+ +-- --+ +-+ +--
 .| |.| |.   .| |.| |.   .| |.| |. 
--+ +-+ +-- --+ +-+ +--   | | | |  

     \   /   ^ 
\ /   > <   / \
 V   /   \     

     \   /   ^ 
\./  .> <.  /.\
 V   /   \     

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
la source
Vous avez 5 espaces entre le oet wdans "Hello world", l'OP n'en a que 4
Claudiu
@Claudiu chaque caractère (même vide, caractère 32) 3 espaces, séparateur entre caractères 1 espace. 1 + 3 + 1 == 5. Je vérifierai avec OP
edc65
Oui, cela a certainement plus de sens avec 5. Je pensais qu'il voulait spécifiquement 4 comme cas spécial, mais c'est une bonne chose que vous ayez demandé!
Claudiu
3

C # - 921 720

É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

using System;class P{static void Main(){
int i,y,j,k,w,z;string[]g=Console.ReadLine().ToLower().Split('_');
var d="_________  |b .|b--+_| |b|.|b+-+_|  b|. b+--_--+b .|b--+_+-+b|.|b+-+_+--b|. b+--_--+b .|b  |_+-+b|.|b| |_+--b|. b|  _____   b\\./b v _ \\ b .>b / _ / b<. b \\ _ ^ b/.\\b   _  b  b  ".Replace('b','\n').Split('_');
for(i=0;i<d.Length;i++){if(d[i]==""){d[i]=i<17?d[i+9]:d[i+4];d[i]=d[i].Replace('.',' ');}}
for(y=0;y<g.Length;y++){string o="",s,e=g[y];var r=new string[z=e.Length][];
for(i=0;i<z;i++){if(e[i]-97<0|e[i]-97>25)e=e.Replace(e[i],'{');
o+=d[e[i]-97]+'_';r[i]=(o.Split('_')[i].Split('\n'));}
for(j=0;j<3;j++)for(k=0;k<(w=r.Length);k++){
s=r[k][j];Console.Write(k==w-1?s+'\n':s+' ');}}
Console.ReadLine();}}

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

hEllo,wORLd
+-+ +-+ |   |   +--        +-- +-- |   --+
| | | | |.  |.  |.     \./ |.  |.  |.    |
| | +-+ +-- +-- +--     v  +-- |   +-- --+

code_golf
|   +-- --+ +-+
|   |.    | | |
+-- +-- --+ +-+
--+ +-- |   +--
  | |.  |.  |
  | +-- +-- +--

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
la source
1
Je ne connais pas C #, mais il semble y avoir un espace inutile for(int i=0;i<p.Length; i++)(près du milieu)
Merci professorfish, il y en a un autre que j'ai manqué aussi
jrbuchner
1
Dans 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?
Beta Decay du
2
@BetaDecay Je pense qu'il est destiné à montrer la gestion des caractères ASCII bas
edc65
Le cœur et le club ont été mis là pour démontrer le respect de la règle des défis: remplacer tous les caractères qui ne sont pas de nouvelles lignes ou dans ABCDEFGHIJKLMNOPQRSTUVWXYZ ou abcdefghijklmnopqrstuvwxyz avec des espaces
jrbuchner
2

Python 2, 180 + 78 + 1 + 3 = 262 caractères

Le programme à 180 octets (les deux dernières nouvelles lignes sont des onglets):

L=open('f','rb').read().decode('zip')
while 1:
 n=raw_input()
 for s in(0,3,6):
    for c in n:w=ord(c.lower())-97;print''.join(L[w+(s+i)*26]for i in(0,1,2))if-1<w<27 else'  ',
    print

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:

$ hexdump f
0000000 9c78 a853 d1a9 d6d5 2206 3805 0103 c174
0000010 c100 8b88 07d1 9ae1 051a 4ab0 385d ae03
0000020 2803 8a82 3a80 406c ae18 0f42 6006 0c1c
0000030 0a2d 31fa 6076 ee8c a030 0e14 2987 8428
0000040 7501 3080 c39a 5a10 0014 21c7 7333
000004e

L'encodage base64 du fichier fest:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Le programme se ferme avec une exception, 2>_supprime l'erreur (+3 octets):

$ echo "hEllo,wORLd" | python pigpen.py 2>_| ./md5.py
7ed49b7013a30cc3e84aa807f6585325

Explication :

J'ai créé une table de recherche, Lqui 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.

Claudiu
la source
Vous devez ajouter un octet pour fet trois octets pour2>_
0

Perl 5 -lF , 297 288 261 231 octets

$,=$";$_=' .||.||. ';chomp@F;map{@r=/.../g;say map{/[a-z]/i?$r[-65+ord uc]:$"x3}@F}(y/./ /r.y/.| /-+-/r x2)x2 .'    \\  /  ^ 'x2,y/./ /r x3 .$_ x3 .'\\ /  ><  / \\\\./ .><. /.\\',(y/.| /-+-/r x2 .y/./ /r)x2 .' V  /  \\    'x2;say''

Essayez-le en ligne!

Il y a probablement encore un peu ici qui pourrait être joué plus loin.

Xcali
la source