LoginSignup
1
0

More than 5 years have passed since last update.

第二回オフラインリアルタイムどう書くの解答

Posted at

第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;
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0