Problem Statement
|
|
สมมุติว่าเรามี binary string ดังนี้:
011100011
เป็นการเข้ารหัสแบบ One way โดยวิธีการเข้ารหัสจะใช้วิธี เพิ่มค่าของตัวเองจากตัวเลขที่อยู่ติดกัน.จากตัวอย่างของ Binary String ที่ว่ามาหลังจกเข้ารหัสแล้วจะได้เป็นแบบนี้:
123210122
หลังจากพิจารณาสมมุติเราให้ P เป็น Binary String อันเดิม และ Q เป็น Binary String ที่ผ่านการเข้ารหัสแล้วQ[i] = P[i-1] + P[i] + P[i+1] สำหรับตัวอักษรในทุกตำแหน่ง i. สำหรับที่ขอบของ String ที่ไม่มีตัวอักษร ให้แทนด้วย 0
Binary String ที่เข้ารหัสแล้ว เราสามารถถอดรหัสโดยใช้วิธีได้ดังนี้ (ใช้ 123210122 เป็นตัวอย่าง):
-
สมมุติให้ P[0] = 0.
-
เพราะ Q[0] = P[0] + P[1] = 0 + P[1] = 1, แล้วเราก็รู้ว่า P[1] = 1.
-
เพราะ Q[1] = P[0] + P[1] + P[2] = 0 + 1 + P[2] = 2, แล้วเราก็รู้ว่า P[2] = 1.
-
เพราะ Q[2] = P[1] + P[2] + P[3] = 1 + 1 + P[3] = 3, แล้วเราก็รู้ว่า P[3] = 1.
-
ทำซ้ำไปเรื่อยๆแล้วเราก็จะได้ว่า[4] = 0, P[5] = 0, P[6] = 0, P[7] = 1, และ P[8] = 1.
-
และเราก็ตรวจคำตอบโดย Q[8] = P[7] + P[8] = 1 + 1 = 2. ดังที่เห็นพบว่าสมการใช้ได้และเราก็สามารถถอดรหัสได้
แล้วเราก็ทำแบบเดิมอีกครั้งโดยสมมุติ P[0] ไหม่:
-
สมมุติ P[0] = 1.
-
เพราะ Q[0] = P[0] + P[1] = 1 + P[1] = 1, แล้วเราก็รู้ว่า P[1] = 0.
-
เพราะ Q[1] = P[0] + P[1] + P[2] = 1 + 0 + P[2] = 2, แล้วเราก็รู้ว่า P[2] = 1.
-
แล้วเราก็รพบว่า Q[2] = P[1] + P[2] + P[3] = 0 + 1 + P[3] = 3, ไม่ว่ายังไงเราก็ได้คำตอบว่าไม่ว่าทำยังไงก็จะได้ P[3] = 2.เสมอ จากข้อมูลที่ได้มันผิดพลาดเพราะ Binary String ที่ยังไม่เข้ารหัสต้องมีเฉพาะ '0' หรือ '1' เสมอ ดังนั้น Binary String P จึงไม่มีคำตอบที่เป็นไปได้กรณีที่เริ่มต้นด้วย '1'.
สำหรับโจทข้อนี้ ไม่มีวิธีถอดรหัสโดยใช้วิธีอื่น ดังนั้นให้ใช้วิธีที่กล่าวมาเท่านั้น
สำหรับคำตอบที่ได้ ต้องคืนค่ามาเป็น String[] (อาเรย์ของสตริง) สำหรับกรณีที่ไม่สามารถหาคำตอบได้ให้คืนค่า "์NONE" จากตัวอย่าง ต้องคืนค่ามาแบบนี้ {"011100011", "NONE"}.
|
Definition
|
|
Class: |
BinaryCode |
Method: |
decode |
Parameters: |
String |
Returns: |
String[] |
Method signature: |
String[] decode(String message) |
(อย่าลืมทำให้ method เป็น public ด้วยนะ) |
|
|
ข้อจำกัด
|
- |
message จะต้องสามารถรองรับตัวอักษรตั้งแต่ 1 ถึง 50 ตัวอักษร. |
- |
ทุกๆตัวอักษรสามารถ จะเป็นได้ทั้ง '0', '1', '2', หรือ '3'. |
ตัวอย่างข้อมูลที่ไส่เข้าไป และคืนค่ากลับมาอย่างถูกต้อง
|
0) |
|
|
|
Returns: { "011100011", "NONE" }
|
|
|
1) |
|
|
|
2) |
|
|
|
Returns: { "NONE", "11001" }
|
|
|
3) |
|
|
|
Returns: { "NONE", "NONE" }
|
|
|
4) |
|
|
|
Returns: { "NONE", "NONE" }
|
|
|
5) |
|
|
"12221112222221112221111111112221111"
|
|
Returns:
{ "01101001101101001101001001001101001",
"10110010110110010110010010010110010" }
|
|
คำตอบ Version 1 ที่ผมทำ ได้คะแนน 90/300 T^T คะแนนทำร้ายจิตใจมาก เดี๋ยวถ้าผมสามารถทำและได้คะแนนมากกว่านี้ แล้วจะเอามาโพสไหม่ครับ
public class BinaryCode {
public String[] decode(String message){
String regex1 = "^[^3].*";
String regex2 = "[0-3]{1,50}";
String regex3 = ".*[^3]$";
String regex4 = ".*(33).*";
String[] ret_string=new String[2];
ret_string[0]="NONE";
ret_string[1]="NONE";
if(!message.matches(regex4)&&message.matches(regex1)&&message.matches(regex2)&&message.matches(regex3)){
// Assume P[0] = 0
boolean decode_flag=false;
int pevP1=0;
int pevP2=0;
int s_lenght=message.length();
if (s_lenght>3) {
String true_dat1="0";
int p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat1=true_dat1+p1;
int cur_p=0;
for(int i=1;i<(s_lenght-2);i++){
cur_p=Character.getNumericValue(message.charAt(i))-(pevP1+pevP2);
pevP1=pevP2;
pevP2=cur_p;
true_dat1=true_dat1+cur_p;
//System.out.println(i+" "+true_dat1);
if(cur_p>1||cur_p<0||pevP2>1||pevP2<0){
decode_flag=true;
break;
}
}
int lastP=Character.getNumericValue(message.charAt((s_lenght-1)))-pevP2;
true_dat1=true_dat1+lastP;
if(cur_p>1||cur_p<0||pevP2>1||pevP2<0||lastP>1||lastP<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[0]=true_dat1;
}
// Assume P[0] = 1
decode_flag=false;
pevP1=1;
pevP2=0;
String true_dat2="1";
p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat2=true_dat2+p1;
cur_p=0;
for(int i=1;i<(s_lenght-2);i++){
cur_p=Character.getNumericValue(message.charAt(i))-(pevP1+pevP2);
pevP1=pevP2;
pevP2=cur_p;
true_dat2=true_dat2+cur_p;
//System.out.println(i+" "+true_dat2);
if(cur_p>1||cur_p<0||pevP2>1||pevP2<0){
decode_flag=true;
break;
}
}
lastP=Character.getNumericValue(message.charAt((s_lenght-1)))-pevP2;
true_dat2=true_dat2+lastP;
if(cur_p>1||cur_p<0||pevP2>1||pevP2<0||lastP>1||lastP<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[1]=true_dat2;
}
}else if(s_lenght==2){
// Assume P[0] = 0
if(message.equals("00")||message.equals("11")){
String true_dat1="0";
int p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat1=true_dat1+p1;
if(pevP2>1||pevP2<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[0]=true_dat1;
}
// Assume P[0] = 1
decode_flag=false;
pevP1=1;
pevP2=0;
String true_dat2="1";
p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat2=true_dat2+p1;
if(pevP2>1||pevP2<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[1]=true_dat2;
}
}
}else if(s_lenght==1){
int number=Character.getNumericValue(message.charAt(0));
if(number==0){
ret_string[0]="0";
}else if(number==1){
ret_string[1]="1";
}else{
ret_string[0]="NONE";
ret_string[1]="NONE";
}
}else if(s_lenght==3){
String true_dat1="0";
int p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat1=true_dat1+p1;
int lastP=Character.getNumericValue(message.charAt((s_lenght-1)))-pevP2;
true_dat1=true_dat1+lastP;
if(pevP2>1||pevP2<0||lastP>1||lastP<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[0]=true_dat1;
}
// Assume P[0] = 1
decode_flag=false;
pevP1=1;
pevP2=0;
String true_dat2="1";
p1=Character.getNumericValue(message.charAt(0))-pevP1;
pevP2=p1;
true_dat2=true_dat2+p1;
lastP=Character.getNumericValue(message.charAt((s_lenght-1)))-pevP2;
true_dat2=true_dat2+lastP;
if(pevP2>1||pevP2<0||lastP>1||lastP<0){
decode_flag=true;
}
if(!decode_flag){
ret_string[1]=true_dat2;
}
}
}
return ret_string;
}
}
โคต V2 คะแนนเท่าเดิม T^T แต่เวลาการประมวลผล น้องลง จาก 0.008วิ เหลือ 0.005 วินาที
public class BinaryCode {
public String[] decode(String message){
String[] ret_string=new String[2];
ret_string[0]="0";
ret_string[1]="1";
int s_lenght=message.length();
int[] q= new int[s_lenght];
int[] p0= new int[s_lenght];
p0[0]=0;
int[] p1= new int[s_lenght];
p1[0]=1;
for(int i=0;i<s_lenght;i++){
q[i]=Character.getNumericValue(message.charAt(i));
}
if(s_lenght==1){
int number=Character.getNumericValue(message.charAt(0));
if(number==0){
ret_string[0]="0";
}else if(number==1){
ret_string[1]="1";
}else{
ret_string[0]="NONE";
ret_string[1]="NONE";
}
}else if(s_lenght>=2){
//Assume 0
for(int i=1;i<s_lenght;i++){
if(i==1){
p0[i]=q[i-1]-p0[i-1];
}else{
p0[i]=q[i-1]-p0[i-1]-p0[i-2];
}
//System.out.println(p0[i]);
if(p0[i]>1||p0[i]<0){
ret_string[0]="NONE";
break;
}else{
ret_string[0]+=p0[i];
}
}
//System.out.println(ret_string[0]+" "+ret_string[1]);
//Assume 1
for(int i=1;i<s_lenght;i++){
if(i==1){
p1[i]=q[i-1]-p1[i-1];
}else{
p1[i]=q[i-1]-p1[i-1]-p1[i-2];
}
//System.out.println(p1[i]);
if(p1[i]>1||p1[i]<0){
ret_string[1]="NONE";
break;
}else{
ret_string[1]+=p1[i];
}
}
//System.out.println(ret_string[0]+" "+ret_string[1]);
}
//System.out.println(ret_string[0]+" "+ret_string[1]);
return check_decode(ret_string,p0,p1,q,s_lenght);
}
String[] check_decode(String[] ret_string,int[] p0,int[] p1,int[] q,int s_lenght){
s_lenght-=1;
if(!ret_string[0].equals("NONE")&&s_lenght>0){
boolean flag=q[s_lenght]==p0[s_lenght-1]+p0[s_lenght];
if(!flag){
ret_string[0]="NONE";
}
}
if(!ret_string[1].equals("NONE")&&s_lenght>0){
boolean flag=q[s_lenght]==p1[s_lenght-1]+p1[s_lenght];
if(!flag){
ret_string[1]="NONE";
}
}
return ret_string;
}
}
ความคิดเห็น