Enkripsi Pigpen Cipher

11

Enkripsi Pigpen Cipher

Misi Anda sederhana: untuk menulis sebuah program yang menerima teks sebagai input dan menampilkan representasi ASCII di dalam Pigpen Cipher .

Memasukkan

Hanya karakter ASCII (tanpa Unicode). Anda harus dapat menangani setidaknya 16384 karakter dan 256 baris.

Keluaran

  • Ganti semua karakter yang bukan baris baru atau dalam ABCDEFGHIJKLMNOPQRSTUVWXYZatau abcdefghijklmnopqrstuvwxyzdengan spasi.
  • Secara case-insensitive, gantilah setiap huruf dengan form terenkripsi (lihat bagian selanjutnya), masukkan spasi tambahan pada masing-masing dari tiga baris setelah masing-masing. Setiap karakter yang dikodekan adalah blok 3 * 3 seni ASCII. Ganti spasi dengan 3 * 3 blok ruang.
  • Semua karakter harus berada di tiga baris yang sama (sebut tiga baris ini satu garis pigpen), kecuali ada baris baru, yang memulai garis pigpen baru. Biarkan garis normal kosong di antara garis pigpen.

Cipher

  |       | |       |
 .|       |.|       |.
--+ 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)

Contoh

Input "hEllo, wORLd" harus menghasilkan:

+-+ +-+ |   |   +--         +-- +-- |   --+
| | | | |.  |.  |.      \./ |.  |.  |.    |
| | +-+ +-- +-- +--      V  +-- |   +-- --+

Pengkodean base64 di atas, dengan garis baru yang tertinggal, ada di bawah. MD5sum adalah 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Tanpa garis trailing baru, md5sum adalah 581005bef7ee76e24c019d076d5b375fdan base64 adalah:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

Aturan

  • Celah standar dilarang.
  • Ini golf kode. Kode terpendek menang.
  • Dalam bahasa yang tidak dapat menerima beberapa baris input sekaligus (mis. JavaScript dengan prompt()), gunakan *(atau beberapa karakter lain) sebagai pemisah baris.

Erranda

  • Contoh hilang beberapa spasi (spasi harus terdiri dari ruang trailing dari karakter sebelumnya, jika ada, itu sendiri, dan ruang trailing sendiri). Ini sekarang sudah diperbaiki.

sumber
1
Saya ingat bermain dengan ini sebagai seorang anak, tetapi tidak pernah tahu nama itu. Terima kasih!
Geobits
Bisakah saya menggunakan font khusus? :-)
Florian F
@FlorianF Tidak ...
Pengodean dalam javascript. Biasanya promptdigunakan untuk input, tetapi hanya menerima satu baris. Bisakah saya menggunakan karakter khusus (seperti '*') untuk menandai baris baru di input ?.
edc65
@ edc65 Ya, Anda boleh

Jawaban:

4

JavaScript (ES6) 312 327 340 372 446

Tidak termasuk lekukan spasi dan baris baru - bisa lebih banyak golf . Menggunakan '*' untuk menandai baris baru dalam input, karena promptmenerima satu baris.

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'))

Uji di konsol FireFox / FireBug

Input: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

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

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

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

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

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
sumber
Anda memiliki 5 ruang antara odan wdi "Halo dunia", OP hanya memiliki 4
Claudiu
@Claudiu setiap karakter (bahkan kosong, karakter 32) 3 spasi, pemisah antara karakter 1 spasi. 1 + 3 + 1 == 5. Saya akan periksa dengan OP
edc65
Ya itu pasti lebih masuk akal dengan 5. Saya pikir dia secara khusus ingin 4 sebagai kasus khusus, tetapi hal yang baik yang Anda tanyakan!
Claudiu
3

C # - 921 720

Jelas bukan entri yang menang, tapi ini sepertinya terlalu menyenangkan untuk dilewatkan :)

Program mengambil input sebagai tunggal, lalu mencetak pigpen. Untuk memasukkan beberapa baris, gunakan garis bawah (_) seperti yang terlihat pada output .

Kode

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();}}

Konsep

Cipher menggunakan beberapa urutan karakter yang bisa diduplikasi sedikit. Misalnya, '-' muncul 16 kali dan '__' (dua spasi) muncul 20 kali. Saya mengganti urutan ini dengan simbol karakter tunggal dan beralih keluar saat runtime, memotong jumlah karakter yang diperlukan untuk menyimpan cipherpenpen menjadi dua. Demikian pula, baris baru biasanya membutuhkan dua karakter, tetapi diganti dengan simbol (n) dan diganti kemudian.

Program ini menangani beberapa baris input dengan memisahkan input ke dalam array di mana setiap elemen adalah satu baris input. Program kemudian menjalankan cipher pada setiap baris secara terpisah.

Ini golf pertama saya dalam bahasa apa pun, jadi mungkin ada banyak yang bisa dilakukan untuk meningkatkan kode ini.

Keluaran

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
sumber
1
Saya tidak tahu C #, tetapi tampaknya ada ruang yang tidak perlu di for(int i=0;i<p.Length; i++)(dekat tengah)
Terima kasih professorfish, ada satu lagi yang saya lewatkan
jrbuchner
1
Dalam m♥lti \n lin♣e \n input, ponsel saya menyatakan bahwa memiliki hati, bukan Anda dalam multi, dan sebuah klub antara n dan e in line. Mengapa demikian?
Beta Decay
2
@BetaDecay Saya pikir ini dimaksudkan, untuk menunjukkan penanganan karakter ASCII rendah
edc65
Jantung dan klub ditempatkan di sana untuk menunjukkan kepatuhan terhadap aturan tantangan: Ganti semua karakter yang bukan baris baru atau dalam ABCDEFGHIJKLMNOPQRSTUVWXYZ atau abcdefghijklmnopqrstuvwxyz dengan spasi
jrbuchner
2

Python 2, 180 + 78 + 1 + 3 = 262 karakter

Program 180-byte (dua baris terakhir adalah tab):

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

Memerlukan file 78-byte yang disebut 'f' untuk menjadi direktori yang sama (+1 byte untuk nama file), yang berisi yang berikut ini:

$ 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

Pengkodean file base64 fadalah:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Program keluar dengan pengecualian, 2>_menekan kesalahan (+3 byte):

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

Penjelasan :

Saya membuat tabel pencarian L, yang merupakan pemetaan dari {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, disimpan dalam array datar. Program mencetak huruf dengan melakukan pencarian sederhana untuk setiap posisi.

Claudiu
sumber
Anda harus menambahkan satu byte untuk fdan tiga byte untuk2>_
0

Perl 5 -lF , 297 288 261 231 byte

$,=$";$_=' .||.||. ';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''

Cobalah online!

Mungkin masih ada sedikit di sini yang bisa bermain golf lebih lanjut.

Xcali
sumber