Java 7、541バイト
import java.util.*;List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}
元の順序を維持することは、長い時間にわたって私を悩ませました。そうでなければ、簡単なループと再帰呼び出しの原則になります。それでも、順序を維持しながら把握するのは楽しいチャレンジです。
説明:
import java.util.*; // Required import for List and Array List
List l=new ArrayList(),L=new ArrayList();
// Two Lists on class-level
String c(int n){ // Method (1) with integer parameter and String return-type
l.add(x(n)); // Start by adding the binary-String of the input integer to list `l`
return a(n+" ",l,n); // And let the magic begin in method `a` (2)
} // End of method (1)
String a(String r,List q,Integer n){ // Method (2) with a bunch of parameters and String return-type
boolean e=q.equals(l),E=q.equals(L); // Determine which of the two class-level Lists the parameter-List is
if(e) // If it's `l`:
L.clear(); // Empty `L`
else // If it's `L` instead:
l.clear(); // Empty `l`
for(String i:new ArrayList<String>(q)){
// Loop over the input list (as new ArrayList to remove the reference)
int s=i.length()/2, // Get the length of the current item in the list divided by 2
// NOTE: Java automatically floors on integer division,
// which is exactly what we want for the splitting of odd-length binary-Strings
a=n.parseInt(i.substring(0,s),2), // Split the current binary-String item in halve, and convert the first halve to an integer
z=n.parseInt(i.substring(s),2); // And do the same for the second halve
r+=a+" "+z+" "; // Append the result-String with these two integers
if(e&a>1) // If the parameter List is `l` and the first halve integer is not 0:
L.add(x(a)); // Add this integer as binary-String to list `L`
if(e&z>1) // If the parameter List is `l` and the second halve integer is not 0:
L.add(x(z)); // Add this integer as binary-String to List `L`
if(E&a>1) // If the parameter List is `L` and the first halve integer is not 0:
l.add(x(a)); // Add this integer as binary-String to List `l`
if(E&z>1) // If the parameter List is `L` and the second halve integer is not 0:
l.add(x(z)); // Add this integer as binary-String to List `l`
} // End of loop
if(e&L.size()>0) // If the parameter List is `l` and List `L` now contains any items:
r=a(r,L,n); // Recursive call with List `L` as parameter
if(E&l.size()>0) // If the parameter List is `L` and List `l` now contains any items:
r=a(r,l,n); // Recursive call with List `l` as parameter
return r; // Return the result-String with the now appended numbers
} // End of method (2)
String x(Integer n){ // Method (3) with Integer parameter and String return-type
return n.toString(n,2); // Convert the integer to its Binary-String
} // End of method (3)
テストコード:
ここで試してみてください。
import java.util.*;
class M{
List l=new ArrayList(),L=new ArrayList();String c(int n){l.add(x(n));return a(n+" ",l,n);}String a(String r,List q,Integer n){boolean e=q.equals(l),E=q.equals(L);if(e)L.clear();else l.clear();for(String i:new ArrayList<String>(q)){int s=i.length()/2,a=n.parseInt(i.substring(0,s),2),z=n.parseInt(i.substring(s),2);r+=a+" "+z+" ";if(e&a>1)L.add(x(a));if(e&z>1)L.add(x(z));if(E&a>1)l.add(x(a));if(E&z>1)l.add(x(z));}if(e&L.size()>0)r=a(r,L,n);if(E&l.size()>0)r=a(r,l,n);return r;}String x(Integer n){return n.toString(n,2);}
public static void main(String[] a){
M m=new M();
System.out.println(m.c(255));
m.l.clear();
m.L.clear();
System.out.println(m.c(225));
m.l.clear();
m.L.clear();
System.out.println(m.c(32));
}
}
出力:
255 15 15 3 3 3 3 1 1 1 1 1 1 1 1
225 14 1 3 2 1 1 1 0
32 4 0 1 0
0
、長さが奇数の場合、2進数にsが埋め込まれるのはどうですか?