第2回 オフラインリアルタイムどう書く( http://atnd.org/events/30900 )
参加した際に会場で書いたコードを手直ししたものです。
1時間では解けませんでした。
問題( http://nabetani.sakura.ne.jp/hena/ord2/ )
縦列も横列もlineと名前をつけていたりと、ややこしくなってしまいました。
Tetris.java
public class Tetris {
public static void main( String[] args ) {
String[][] test = {
/* 0*/ {"ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06" },
/* 1*/ {"01", "00" },
/* 2*/ {"00", "00" },
};
for ( String[] testItem : test ) {
String result = Tetris.delete(testItem[0]);
System.out.println( result );
if ( !testItem[1].equals(result) ) {
System.out.println( "Fail: " + testItem[1] );
}
}
}
private static final String SPLIT_LETTER = "-";
public static String delete( String blocks ) {
int[] lines = parseBlocks(blocks);
int deleteLine = completeBits(lines);
String[] resultLines = dropBlock(lines, deleteLine );
String ret = resultLines[0];
for ( int i = 1; i < resultLines.length; i++ ) {
ret = ret + SPLIT_LETTER + resultLines[i];
}
return ret;
}
public static int[] parseBlocks( String blocks ) {
String[] lines = blocks.split(SPLIT_LETTER);
int[] ret = new int[lines.length];
for ( int i = 0; i < lines.length; i++ ) {
ret[i] = Integer.parseInt(lines[i], 16);
}
return ret;
}
public static int completeBits( int[] lines ) {
int bits = 0xFF;
for ( int line : lines ) {
bits &= line;
}
return bits;
}
public static String[] dropBlock( int[] lines, int deleteLine ) {
String[] ret = new String[lines.length];
for ( int i = 0; i < lines.length; i++ ) {
ret[i] = String.format( "%02x",
dropLine( lines[i], deleteLine ) );
}
return ret;
}
public static int dropLine( int line, int deleteLine ) {
int ret = 0;
for ( int mask = 0x80; mask > 0 ; mask = mask>>1 ) {
if ( (deleteLine & mask) == 0 ) {
ret = ret << 1;
if ( (line & mask) != 0 ) {
ret |= 1;
}
}
}
return ret;
}
}