import java.io.*;
import java.util.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
class Leds{
public enum ACTION {
LD(Pattern.compile("^\\s*ld ([a-z]),(\\d*)"),
input
-> REG.
put(input.
get(0),
Byte.
valueOf(input.
get(1)))),
OUT(Pattern.compile("^\\s*out \\(0\\),([a-z])"),
input -> {
LEDS = REG.get(input.get(0));
outputLEDs();
}),
RLCA(Pattern.compile("^\\s*rlca"),
input
-> REG.
put("a", toByte
(Integer.
rotateLeft(REG.
get("a"),
1)))),
RRCA(Pattern.compile("^\\s*rrca"),
input -> {
Byte a
= (byte) (REG.
get("a")); byte rolled = (byte) ((((a & 0xff) >> 1) + ((a & 0x01) == 1 ? 1 << 7 : 0)));
REG.put("a", rolled);
}),
LABEL(Pattern.compile("^\\s*(.*):"),
input -> { }),
DJNZ(Pattern.compile("^\\s*djnz (.*)"),
input -> {
REG.put("b", (byte) (b - 1));
if (b > 1) {
IntStream.range(0, PROGRAM.size())
.filter(index -> (PROGRAM.get(index).action == LABEL && PROGRAM.get(index).params.get(0).equals(input.get(0))))
.findFirst()
.ifPresent(index -> PC = index);
}
});
public Pattern pattern;
public Consumer<List<String>> consumer;
private ACTION(Pattern pattern, Consumer<List<String>> consumer) {
this.pattern = pattern;
this.consumer = consumer;
}
}
public static byte toByte(int num) {
int tmp = num & 0xff;
return (byte) ((tmp & 0x80) == 0 ? tmp : tmp - 256);
}
public static final HashMap
<String, Byte
> REG
= new HashMap
<>(); public static Byte LEDS
= 0x00
; public static final List<ParsedAction> PROGRAM = new LinkedList<>();
public static int PC = 0;
public static Optional
<ParsedAction
> parseAction
(String line
) { return Arrays.
stream(ACTION.
values()) .filter(action -> action.pattern.matcher(line).matches())
.map(action -> {
Matcher m = action.pattern.matcher(line);
List<String> params = new ArrayList<>();
m.find();
return new ParsedAction(action, IntStream.range(1, m.groupCount()+1)
.mapToObj(index -> m.group(index))
.collect(Collectors.toList())
);
})
.findFirst();
}
public static void outputLEDs() {
for (int i = 7; i >= 0; i--) {
System.
out.
print((LEDS
>> i
& 0x01
) == 1 ? "*" : "."); }
}
public static void main
(String[] args
) {
.sequential()
.map(Leds::parseAction)
.filter(Optional::isPresent)
.map(Optional::get)
.forEachOrdered(action -> PROGRAM.add(action));
for (PC = 0; PC < PROGRAM.size(); PC++) {
ParsedAction action = PROGRAM.get(PC);
action.perform();
}
}
public static class ParsedAction {
public ACTION action;
public List<String> params;
public ParsedAction(ACTION action, List<String> params) {
this.action = action;
this.params = params;
}
public void perform() {
action.consumer.accept(params);
}
}
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKCmNsYXNzIExlZHN7CgogICAgcHVibGljIGVudW0gQUNUSU9OIHsKICAgICAgICBMRChQYXR0ZXJuLmNvbXBpbGUoIl5cXHMqbGQgKFthLXpdKSwoXFxkKikiKSwKICAgICAgICAgICAgICAgIGlucHV0IC0+IFJFRy5wdXQoaW5wdXQuZ2V0KDApLCBCeXRlLnZhbHVlT2YoaW5wdXQuZ2V0KDEpKSkpLAogICAgICAgIE9VVChQYXR0ZXJuLmNvbXBpbGUoIl5cXHMqb3V0IFxcKDBcXCksKFthLXpdKSIpLAogICAgICAgICAgICAgICAgaW5wdXQgLT4gewogICAgICAgICAgICAgICAgICAgIExFRFMgPSBSRUcuZ2V0KGlucHV0LmdldCgwKSk7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0TEVEcygpOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgUkxDQShQYXR0ZXJuLmNvbXBpbGUoIl5cXHMqcmxjYSIpLAogICAgICAgICAgICAgICAgaW5wdXQgLT4gUkVHLnB1dCgiYSIsIHRvQnl0ZShJbnRlZ2VyLnJvdGF0ZUxlZnQoUkVHLmdldCgiYSIpLCAxKSkpKSwKICAgICAgICBSUkNBKFBhdHRlcm4uY29tcGlsZSgiXlxccypycmNhIiksCiAgICAgICAgICAgICAgICBpbnB1dCAtPiB7CiAgICAgICAgICAgICAgICAgICAgQnl0ZSBhID0gKGJ5dGUpIChSRUcuZ2V0KCJhIikpOwogICAgICAgICAgICAgICAgICAgIGJ5dGUgcm9sbGVkID0gKGJ5dGUpICgoKChhICYgMHhmZikgPj4gMSkgKyAoKGEgJiAweDAxKSA9PSAxID8gMSA8PCA3IDogMCkpKTsKICAgICAgICAgICAgICAgICAgICBSRUcucHV0KCJhIiwgcm9sbGVkKTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgIExBQkVMKFBhdHRlcm4uY29tcGlsZSgiXlxccyooLiopOiIpLAogICAgICAgICAgICAgICAgaW5wdXQgLT4geyB9KSwKICAgICAgICBESk5aKFBhdHRlcm4uY29tcGlsZSgiXlxccypkam56ICguKikiKSwKICAgICAgICAgICAgICAgIGlucHV0IC0+IHsKICAgICAgICAgICAgICAgICAgICBCeXRlIGIgPSBSRUcuZ2V0KCJiIik7CiAgICAgICAgICAgICAgICAgICAgUkVHLnB1dCgiYiIsIChieXRlKSAoYiAtIDEpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYiA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgSW50U3RyZWFtLnJhbmdlKDAsIFBST0dSQU0uc2l6ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaW5kZXggLT4gKFBST0dSQU0uZ2V0KGluZGV4KS5hY3Rpb24gPT0gTEFCRUwgJiYgUFJPR1JBTS5nZXQoaW5kZXgpLnBhcmFtcy5nZXQoMCkuZXF1YWxzKGlucHV0LmdldCgwKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pZlByZXNlbnQoaW5kZXggLT4gUEMgPSBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgIHB1YmxpYyBQYXR0ZXJuIHBhdHRlcm47CiAgICAgICAgcHVibGljIENvbnN1bWVyPExpc3Q8U3RyaW5nPj4gY29uc3VtZXI7CgogICAgICAgIHByaXZhdGUgQUNUSU9OKFBhdHRlcm4gcGF0dGVybiwgQ29uc3VtZXI8TGlzdDxTdHJpbmc+PiBjb25zdW1lcikgewogICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwogICAgICAgICAgICB0aGlzLmNvbnN1bWVyID0gY29uc3VtZXI7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSB0b0J5dGUoaW50IG51bSkgewogICAgICAgIGludCB0bXAgPSBudW0gJiAweGZmOwogICAgICAgIHJldHVybiAoYnl0ZSkgKCh0bXAgJiAweDgwKSA9PSAwID8gdG1wIDogdG1wIC0gMjU2KTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCeXRlPiBSRUcgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICBwdWJsaWMgc3RhdGljIEJ5dGUgTEVEUyA9IDB4MDA7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8UGFyc2VkQWN0aW9uPiBQUk9HUkFNID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgcHVibGljIHN0YXRpYyBpbnQgUEMgPSAwOwoKICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8UGFyc2VkQWN0aW9uPiBwYXJzZUFjdGlvbihTdHJpbmcgbGluZSkgewogICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKEFDVElPTi52YWx1ZXMoKSkKICAgICAgICAgICAgICAgIC5maWx0ZXIoYWN0aW9uIC0+IGFjdGlvbi5wYXR0ZXJuLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKQogICAgICAgICAgICAgICAgLm1hcChhY3Rpb24gLT4gewogICAgICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IGFjdGlvbi5wYXR0ZXJuLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgICAgICAgIG0uZmluZCgpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlZEFjdGlvbihhY3Rpb24sIEludFN0cmVhbS5yYW5nZSgxLCBtLmdyb3VwQ291bnQoKSsxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGluZGV4IC0+IG0uZ3JvdXAoaW5kZXgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3V0cHV0TEVEcygpIHsKICAgICAgICBmb3IgKGludCBpID0gNzsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgoTEVEUyA+PiBpICYgMHgwMSkgPT0gMSA/ICIqIiA6ICIuIik7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKS5saW5lcygpCiAgICAgICAgICAgICAgICAuc2VxdWVudGlhbCgpCiAgICAgICAgICAgICAgICAubWFwKExlZHM6OnBhcnNlQWN0aW9uKQogICAgICAgICAgICAgICAgLmZpbHRlcihPcHRpb25hbDo6aXNQcmVzZW50KQogICAgICAgICAgICAgICAgLm1hcChPcHRpb25hbDo6Z2V0KQogICAgICAgICAgICAgICAgLmZvckVhY2hPcmRlcmVkKGFjdGlvbiAtPiBQUk9HUkFNLmFkZChhY3Rpb24pKTsKCiAgICAgICAgZm9yIChQQyA9IDA7IFBDIDwgUFJPR1JBTS5zaXplKCk7IFBDKyspIHsKICAgICAgICAgICAgUGFyc2VkQWN0aW9uIGFjdGlvbiA9IFBST0dSQU0uZ2V0KFBDKTsKICAgICAgICAgICAgYWN0aW9uLnBlcmZvcm0oKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJzZWRBY3Rpb24gewoKICAgICAgICBwdWJsaWMgQUNUSU9OIGFjdGlvbjsKICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHBhcmFtczsKCiAgICAgICAgcHVibGljIFBhcnNlZEFjdGlvbihBQ1RJT04gYWN0aW9uLCBMaXN0PFN0cmluZz4gcGFyYW1zKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm0oKSB7CiAgICAgICAgICAgIGFjdGlvbi5jb25zdW1lci5hY2NlcHQocGFyYW1zKTsKICAgICAgICB9CiAgICB9Cn0=
ICBsZCBhLDE0CiAgb3V0ICgwKSxhCiAgbGQgYSwxMgogIG91dCAoMCksYQogIGxkIGEsOAogIG91dCAoMCksYQoKICBvdXQgKDApLGEKICBsZCBhLDEyCiAgb3V0ICgwKSxhCiAgbGQgYSwxNAogIG91dCAoMCksYQogIAogICAgbGQgYiwzCgp0cmlwbGU6CiAgbGQgYSwxMjYKICBvdXQgKDApLGEKICBsZCBhLDYwCiAgb3V0ICgwKSxhCiAgbGQgYSwyNAogIG91dCAoMCksYQogIGRqbnogdHJpcGxlCiAgCiAgbGQgYSwxCiAgbGQgYiw5Cgpsb29wOgogIG91dCAoMCksYQogIHJsY2EKICBkam56IGxvb3AKICAKICBsZCBhLDIKICBsZCBiLDkKCmxvb3AyOgogIG91dCAoMCksYQogIHJyY2EKICBkam56IGxvb3Ay
ld a,14
out (0),a
ld a,12
out (0),a
ld a,8
out (0),a
out (0),a
ld a,12
out (0),a
ld a,14
out (0),a
ld b,3
triple:
ld a,126
out (0),a
ld a,60
out (0),a
ld a,24
out (0),a
djnz triple
ld a,1
ld b,9
loop:
out (0),a
rlca
djnz loop
ld a,2
ld b,9
loop2:
out (0),a
rrca
djnz loop2