Szyfrowanie Pigpen

11

Szyfrowanie Pigpen

Twoja misja jest prosta: napisać program, który odbiera tekst jako dane wejściowe i wyświetla jego reprezentację ASCII w Szyfrze Pigpena .

Wejście

Znaki tylko ASCII (bez Unicode). Musisz mieć możliwość obsługi co najmniej 16384 znaków i 256 linii.

Wynik

  • Wymień wszystkie znaki, które nie są nowe linie lub w ABCDEFGHIJKLMNOPQRSTUVWXYZlub abcdefghijklmnopqrstuvwxyzspacjami.
  • Bez względu na wielkość liter, zamień każdą literę na zaszyfrowaną formę (patrz następna sekcja), wstawiając końcowe spacje w każdej z trzech linii po każdej. Każdy zakodowany znak to 3 * 3 blok sztuki ASCII. Zastąp spacje 3 * 3 blokami spacji.
  • Wszystkie postacie powinny znajdować się w tych samych trzech liniach (nazwać te trzy linie jedną linią świni), chyba że istnieje nowa linia, która rozpoczyna nową linię świnki. Pozostaw normalną linię pustą między liniami pigpen.

Szyfr

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

Przykład

Dane wejściowe „hEllo, wORLd” powinny dawać:

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

Powyższe kodowanie base64 z końcową nową linią znajduje się poniżej. Suma md5 jest 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Bez końcowej nowej linii, md5sum jest, 581005bef7ee76e24c019d076d5b375fa base64 to:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

Zasady

  • Standardowe luki są zabronione.
  • To jest kod golfowy. Najkrótszy kod wygrywa.
  • W językach, które nie mogą zaakceptować wielu wierszy wprowadzania naraz (np. JavaScript za pomocą prompt()), użyj *(lub jakiegoś innego znaku) jako separatora linii.

Erranda

  • W przykładzie brakowało kilku spacji (spacja powinna składać się z końcowych spacji poprzedniego znaku, jeśli w ogóle, i własnych spacji końcowych). To już zostało naprawione.

źródło
1
Pamiętam, że bawiłem się tym jako dziecko, ale nigdy nie znałem jego nazwy. Dzięki!
Geobits
Czy mogę użyć niestandardowej czcionki? :-)
Florian F
@FlorianF No ...
Kodowanie w javascript. Zwykle promptsłuży do wprowadzania danych, ale przyjmuje tylko jedną linię. Czy mogę użyć specjalnego znaku (takiego jak „*”), aby zaznaczyć nowy wiersz na wejściu ?.
edc65
@ edc65 Tak, możesz

Odpowiedzi:

4

JavaScript (ES6) 312 327 340 372 446

Nie licząc wcięć białych znaków i znaków nowej linii - można by bardziej zagrać w golfa . Użycie „*” do zaznaczenia nowych linii na wejściu, ponieważ promptakceptuje pojedynczy wiersz.

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

Przetestuj w konsoli FireFox / FireBug

Dane wejściowe: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

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

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

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

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

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
źródło
Masz 5 spacji między oi ww „Hello world”, OP ma tylko 4
Claudiu
@ Claudiu każda postać (nawet pusta, znak 32) 3 spacje, separator między znakami 1 spacja. 1 + 3 + 1 == 5. Sprawdzę za pomocą OP
edc65
Tak, z pewnością ma to większy sens w przypadku 5. Myślałem, że specjalnie chce 4 jako specjalny przypadek, ale dobrze, że o to prosiłeś!
Claudiu
3

C # - 921 720

Oczywiście nie jest to zwycięska praca, ale wyglądało to na zbyt zabawne, żeby zemdleć :)

Program pobiera dane wejściowe jako pojedyncze, a następnie drukuje chlew. Aby wprowadzić wiele wierszy, użyj podkreślenia (_), jak widać na wydruku .

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

Pojęcie

Szyfr wykorzystuje kilka sekwencji znaków, które dość często się duplikują. Na przykład „-” pokazuje się 16 razy, a „__” (dwie spacje) pokazuje się 20 razy. Zamieniam te sekwencje na symbole jednoznakowe i przełączam je w czasie wykonywania, zmniejszając liczbę znaków potrzebną do przechowywania szyfru świnki na pół. Podobnie nowa linia zwykle wymaga dwóch znaków, ale jest zastępowana przez symbol (n) i wyłączana później.

Program obsługuje wiele linii wejściowych, dzieląc dane wejściowe na tablicę, w której każdy element jest pojedynczą linią wejściową. Następnie program po prostu uruchamia szyfr na każdej linii osobno.

To jest mój pierwszy golf w dowolnym języku, więc prawdopodobnie można wiele zrobić, aby poprawić ten kod.

Wynik

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
źródło
1
Nie znam C #, ale wydaje się, że w for(int i=0;i<p.Length; i++)(w pobliżu środka) jest niepotrzebne miejsce
Dzięki professorfish, był też inny, za którym tęskniłem
jrbuchner,
1
W m♥lti \n lin♣e \n inputmój telefon sprawia, że jako mający serce zamiast U w multi, a klub pomiędzy n i e w kolejce. Dlaczego?
Beta Decay
2
@BetaDecay Myślę, że ma to na celu pokazanie obsługi niskich znaków ASCII
edc65
Serce i klub zostały umieszczone, aby zademonstrować zgodność z zasadą wyzwań: Zastąp wszystkie znaki, które nie są nowymi wierszami lub w ABCDEFGHIJKLMNOPQRSTUVWXYZ lub abcdefghijklmnopqrstuvwxyz spacjami
jrbuchner
2

Python 2, 180 + 78 + 1 + 3 = 262 znaków

Program 180-bajtowy (dwie ostatnie linie to zakładki):

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

Wymaga, aby 78-bajtowy plik o nazwie „f” był tym samym katalogiem (+1 bajt dla nazwy pliku), który zawiera następujące elementy:

$ 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

Kodowanie pliku base64 fto:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Program kończy pracę z wyjątkiem, 2>_pomija błąd (+3 bajty):

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

Objaśnienie :

Stworzyłem tabelę przeglądową, Lktóra jest mapowaniem {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, przechowywaną w płaskiej tablicy. Program drukuje litery, wykonując prosty przegląd dla każdej pozycji.

Claudiu
źródło
Należy dodać jeden bajt dla fi trzy bajty dla2>_
0

Perl 5 -lF , 297 288 261 231 bajtów

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

Wypróbuj online!

Prawdopodobnie jest tu jeszcze coś, co można by jeszcze pograć w golfa.

Xcali
źródło