Pigpen Şifreleme Şifresi


11

Pigpen Şifreleme Şifresi

Göreviniz basit: Girdi olarak metin alan ve Pigpen Şifresinde ASCII temsili çıkaran bir program yazmak .

Giriş

Yalnızca ASCII karakterleri (Unicode yok). En az 16384 karakteri ve 256 satırı işleyebilmelisiniz.

Çıktı

  • Yeni satır olmayan ABCDEFGHIJKLMNOPQRSTUVWXYZya abcdefghijklmnopqrstuvwxyzda boşluklu ya da boşluklu tüm karakterleri değiştirin .
  • Büyük / küçük harfe duyarlı olmayan bir şekilde, her bir harfi şifreli formuyla değiştirin (sonraki bölüme bakın) ve her bir satırdan sonra üç satırın her birine bir boşluk bırakın. Her kodlanmış karakter ASCII sanatının 3 * 3 bloğudur. Boşlukları 3 * 3 blok boşlukla değiştirin.
  • Yeni bir pigpen çizgisi başlatan yeni bir çizgi yoksa, tüm karakterler aynı üç satırda olmalıdır (bu üç satıra bir pigpen-çizgi çağırın). Pigpen çizgileri arasında normal bir çizgi boş bırakın.

Şifre

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

Misal

"HEllo, wORLd" girdisi aşağıdakileri üretmelidir:

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

Yukarıdakilerin yeni bir satırla base64 kodlaması aşağıdadır. Md5sum olduğunu 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Yeni bir çizgi olmadan, md5sum 581005bef7ee76e24c019d076d5b375fve base64:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

kurallar

  • Standart boşluklar yasaktır.
  • Bu kod golf. En kısa kod kazanır.
  • Bir seferde birden fazla girdi satırını kabul edemeyen dillerde (ör. JavaScript ile prompt()), *satır ayırıcı olarak (veya başka bir karakter) kullanın .

Erranda

  • Örnekte birkaç boşluk eksikti (Bir boşluk, varsa önceki karakterin son boşluklarından ve kendi son boşluklarından oluşmalıdır). Bu şimdi düzeltildi.

1
Bununla çocukken oynadığımı hatırlıyorum, ama adını hiç bilmiyordum. Teşekkürler!
Geobits

Özel bir yazı tipi kullanabilir miyim? :-)
Florian F

@FlorianF No ...

Javascript kodlama. Genellikle promptgiriş için kullanılır, ancak yalnızca tek bir satırı kabul eder. Girişte yeni bir satır işaretlemek için özel bir karakter kullanabilir miyim ('*' gibi)?
edc65

@ edc65 Evet, şunları yapabilirsiniz

Yanıtlar:


4

JavaScript (ES6) 312 327 340 372 446

Girinti beyaz boşluk ve yeni satırlar sayılmaz - daha fazla golf olabilir . Girişteki yeni satırları prompttek bir satır olarak kabul etmek için '*' kullanmak .

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

FireFox / FireBug konsolunda test

Giriş: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

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

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

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

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

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

"Merhaba dünya" arasında ove warasında 5 boşluk var , OP sadece 4
Claudiu

@Claudiu her karakter (hatta boş, karakter 32) 3 boşluk, karakter 1 boşluk arasında ayırıcı. 1 + 3 + 1 == 5. OP ile kontrol edeceğim
edc65

Evet kesinlikle 5 ile daha mantıklı. Ben özellikle özel bir durum olarak 4 istediğini düşündüm, ama sorduğunuz iyi bir şey!
Claudiu

3

C # - 921 720

Açıkçası kazanan bir giriş değil, ama bu geçmek için çok eğlenceli görünüyordu :)

Program girişi tek olarak alır, ardından pigpen'i yazdırır. Birden çok satır girmek için, çıktıda görüldüğü gibi bir alt çizgi (_) kullanın .

kod

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

kavram

Şifre, biraz kopyalanan bazı karakter dizileri kullanır. Örneğin, '-' 16 defa, '__' (iki boşluk) 20 defa görünür. Bu dizileri tek karakterli sembollerle değiştiriyorum ve çalışma zamanında değiştirip, pigpen şifresini yarıya kadar saklamak için gereken karakter sayısını kesiyorum. Benzer şekilde, bir yeni satır genellikle iki karakter gerektirir, ancak bunun yerine bir sembol (n) gelir ve daha sonra kapatılır.

Program, girişi, her öğenin tek bir girdi satırı olduğu bir diziye bölerek birden çok girdi satırını işler. Program daha sonra şifreyi her satırda ayrı ayrı çalıştırır.

Bu benim herhangi bir dilde ilk golf, bu yüzden muhtemelen bu kodu geliştirmek için yapılabilecek çok şey var.

Çıktı

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /

1
C # bilmiyorum, ama for(int i=0;i<p.Length; i++)(ortada yakın) içinde gereksiz bir alan var gibi görünüyor

Teşekkürler professorfish, ben de özledim başka bir vardı
jrbuchner

1
İçinde m♥lti \n lin♣e \n input, benim telefon bunu multi yerine u yerine bir kalp ve n ile e arasında bir kulüp olarak yapar. Neden?
Beta Çürümesi

2
@BetaDecay Düşük ASCII karakterlerinin işlendiğini göstermenin amaçlandığını düşünüyorum
edc65

Kalp ve kulüp, meydan okuma kuralına uyumu göstermek için oraya konuldu: Yeni satır olmayan veya ABCDEFGHIJKLMNOPQRSTUVWXYZ veya abcdefghijklmnopqrstuvwxyz içindeki tüm karakterleri boşluklarla değiştirin
jrbuchner 14:14

2

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

180 baytlık program (son iki yeni satır sekmelerdir):

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

'F' adında 78 baytlık bir dosyanın aynı dizin olmasını gerektirir (dosya adı için +1 bayt) ve aşağıdakileri içerir:

$ 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

Dosyanın base64 kodlaması f:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Program bir istisna dışında çıkar 2>_, hatayı bastırır (+3 bayt):

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

Açıklama :

Düz bir dizide saklanan Lbir eşleme tablosu olan bir arama tablosu oluşturdum {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}. Program harfleri her pozisyon için basit bir arama yaparak yazdırır.


İçin bir bayt fve üç bayt eklemeniz gerekir2>_

0

Perl 5 -lF , 297288261223 bayt

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

Çevrimiçi deneyin!

Muhtemelen burada biraz daha golf olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.