เหยี่ยว, 163 + 165 = 328
ทดสอบกับ gawk 4.1.1 แต่ควรทำงานใน gawk เวอร์ชั่นเก่าเช่นกัน จำเป็นต้องได้รับการแก้ไขเล็กน้อย (ยาวขึ้น) เพื่อทำงานกับ mawk
เข้ารหัส (163):
{for(gsub(", ",_);sprintf("%c",++r)!=$NF;asort(a))split($1,a,_);r-=r>64?53:46;for(k=4^5;r-=_~i;j=_)for(i=++k;gsub(++j,_,i);)split(k,b,_);for(j in b)printf a[b[j]]}
ถอดรหัส (165):
{split($1,a,_);for(i in a)d[a[i]]=a[i];asort(d);for(k=4^5;c!~$1;x+=_~i){i=++k;for(c=j=_;gsub(++j,_,i);split(k,b,_));for(g in b)c=c d[b[g]]}printf"%c",x+(x>10?54:47)}
มันใช้งานได้ แต่ฉันรู้ว่านี่อาจไม่ใช่วิธีที่ดีที่สุดสำหรับสิ่งนี้ ฉันไม่รู้ว่าตัวอักษรราคาไม่แพงตัวที่ห้านั้นเป็นเพราะฉันใช้แค่สี่ตัวเท่านั้น
สิ่งเหล่านี้มีไว้สำหรับการใช้งานเพียงครั้งเดียวเท่านั้น หากคุณต้องการป้อนรหัสที่สองคุณต้องเริ่มต้นใหม่ ช่องว่างหลังจากเครื่องหมายจุลภาคจำเป็นต้องใช้ในการป้อนข้อมูลในการเข้ารหัส
สิ่งที่ฉันคิดเกี่ยวกับ
คำถามแรกของฉันคือ "ตัวถอดรหัสจะได้อะไรจากอักขระ 4 ตัวนี้" (ฉันจะเรียกพวกเขาว่า a, b, c และ d) และความคิดเริ่มต้นของฉันคือรับข้อมูล 6 บิตจากความสัมพันธ์ต่อไปนี้:
a>b
a>c
a>d
b>c
b>d
c>d
ว้าว 6 บิตนั่นยอดเยี่ยมมาก! ฉันคิดว่ามันเป็นอัจฉริยะ แต่การทดสอบแสดงให้เห็นว่านี่จะไม่ทำงาน มีเพียง 24 ชุดค่าผสมที่เป็นไปได้ ประณาม.
ขั้นตอนต่อไปคือการพยายามนับตามสิ่งที่ฉันรู้แล้ว ดังนั้นตัวอักษรตัวแรกที่ปรากฏในสตริงจะกลายเป็น 0 ดังนั้นตัวอักษรตัวที่สองที่แนะนำในสตริงจะกลายเป็น 1 เป็นต้น แต่มันจะไม่นำพาฉันไปสู่ชุดค่าผสม 62 อย่างที่ฉันต้องการ
0000
0001
0010
0011
0012
0100
0101
0102
0110
0111
0112
0120
0121
0122
0123
แต่ฉันชอบความคิด แต่อย่างใด
จากนั้นมันทำให้ฉันรู้สึกแย่ที่ฉันสามารถรวมสองสิ่งนี้ได้เพราะตัวละครในอินพุตมีความสัมพันธ์อยู่แล้วและฉันไม่ต้องรอจนกว่าพวกเขาจะได้รับการแนะนำเพื่อให้คุณค่ากับพวกเขา
มันทำงานอย่างไร
หมายเหตุ: นี่ไม่ใช่วิธีการทำงานของรุ่น golfed อีกต่อไป แต่หลักการยังคงเหมือนเดิม
สำหรับตัวถอดรหัส:
อาเรย์ถูกสร้างขึ้นซึ่งดัชนีมีตัวเลขสี่หลักทั้งหมดที่มีตัวเลขที่ใหญ่ที่สุดไม่เกินจำนวนของตัวเลขที่แตกต่างกันในจำนวนนั้น มี 75 ตัวเลขสี่หลักที่แตกต่างกันซึ่งตรงตามเงื่อนไขนั้น ฉันเดียรัจฉานบังคับให้พวกเขาเพราะจนถึงตอนนี้ฉันไม่สามารถหาวิธีสร้างพวกเขาได้และฉันไม่แน่ใจว่าสิ่งนี้จะสั้นกว่าที่จะทำในสิ่งที่แปลกหรือไม่ ในขณะที่ฉันพบสิ่งเหล่านี้ฉันกำหนดตัวละครที่มีราคาแพงให้กับพวกเขา
จากนั้นฉันจะแทนที่อักขระทุกตัวจากสตริงอินพุตด้วยตัวเลข ขนาดเล็กที่สุด (ตัวอย่างเช่น 'B' เล็กกว่า 'a') กลายเป็น 1, ขนาดเล็กที่สุดที่สองกลายเป็น 2 และอื่น ๆ จนถึง 4 แน่นอนขึ้นอยู่กับจำนวนอักขระที่แตกต่างกันในอินพุตสิ่งที่ตัวเลขสูงสุดใน สตริงผลลัพธ์จะเป็น
จากนั้นฉันก็พิมพ์องค์ประกอบอาร์เรย์ซึ่งมีสตริงนั้นเป็นดัชนี
เครื่องเข้ารหัสทำงานตาม
วิธีใช้
ให้คัดลอกรหัสโดยตรงในคำสั่ง awk bash line หรือสร้างสองไฟล์ "encode.awk" และ "decode.awk" และวางรหัสตามนั้น หรือดียิ่งขึ้นใช้รหัสต่อไปนี้ซึ่งออกโดยอัตโนมัติหลังจาก en / ถอดรหัสหรือสามารถใช้หลายครั้งโดยการลบคำสั่งออกในตอนท้าย
encode.awk
{
if(!x) # only do first time
for(i=1e3;i++<5e3;delete a)
{
for(m=j=0;p=substr(i,++j,1);p>m?m=p:0)++a[p];
length(a)>=m&&i!~0?c[(x>9?55:48)+x++]=i:_
}
r=u=_; # clear reused variables
for(gsub(",",FS);sprintf("%c",++r)!=$NF;); # more flexible concerning
--NF; # spaces in input
split($0,b);
asort(b);
split(c[r],a,_);
for(j in a)u=u b[a[j]]; # prettier printing than golfed version
print u
exit # <=== remove to encode input file
}
decode.awk
{
if(!x) # only do first time
for(i=1e3;i++<5e3;delete a)
{
for(m=j=0;p=substr(i,++j,1);p>m?m=p:_)++a[p];
length(a)>=m&&i!~0?c[i]=sprintf("%c",(x>9?55:48)+x++):_
}
delete t; delete d; o=_; # clear reused variables
split($1,a,_);
for(i in a)t[a[i]]=1;
for(i in t)d[++y]=i;
asort(d);
for(i in a)for(j in d)if(d[j]~a[i])o=o j;
print c[o]
exit # <=== remove to encode input file
}
นี่คือตัวอย่างการใช้งาน:
me@home:~/$ awk -f encode.awk
w, 0, R, 1, d X
10R1
me@home:~/$ awk -f decode.awk
10R1
X
โปรดจำไว้ว่าต้องใช้พื้นที่หลังจากแต่ละเครื่องหมายจุลภาคหากคุณใช้เวอร์ชันที่ตีกอล์ฟ
หากคุณต้องการคุณสามารถใช้สคริปต์สั้นและสกปรกนี้เพื่อสร้างข้อมูลตัวอย่าง
BEGIN{
for(srand();i++<1000;)
{
erg="";
for(j=0;j++<5;)
{
while(erg~(a[j]=substr(c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",rand()*62+1,1)));
erg=erg a[j]
}
print a[1]", "a[2]", "a[3]", "a[4]", "a[5](rand()>.5?" ":rand()>.5?" ":" ")substr(c,rand()*62+1,1)
}
}
และทำสิ่งที่ตลกเช่น
me@home:~/$ awk -f gen.awk|awk -f encode.awk|awk -f decode.awk|sort -u|wc -l
62
ฉันเห็นสิ่งนี้มากกว่าเป็นตัวต่อการเขียนโปรแกรม ฉันคิดว่ามันน่าเศร้านิดหน่อยที่เกือบทุกอย่างในที่นี้จะถูกตีกอล์ฟเพราะคุณสามารถเรียนรู้ได้มากขึ้นจากรหัสที่อ่านง่าย แต่เป็นเพียงความคิดเห็นของฉัน และฉันก็เล่นกอล์ฟตามที่ขอ;)