Search in sources :

Example 11 with FinderParseException

use of exceptions.FinderParseException in project solution-finder by knewjade.

the class PathSettingParser method loadTetfu.

private CommandLineWrapper loadTetfu(String data, CommandLineParser parser, Options options, CommandLineWrapper wrapper, PathSettings settings) throws FinderParseException {
    // テト譜面のエンコード
    List<TetfuPage> decoded = encodeTetfu(data);
    // 指定されたページを抽出
    int page = wrapper.getIntegerOption("page").orElse(1);
    TetfuPage tetfuPage = extractTetfuPage(decoded, page);
    // コメントの抽出
    // 先頭が数字ではない(--clear-line -p *p7のようになる)場合でも、parserはエラーにならない
    // データ取得時にOptional.emptyがかえるだけ
    String comment = "--clear-line " + tetfuPage.getComment();
    List<String> splitComment = Arrays.stream(comment.split(" ")).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList());
    // コマンド引数を配列に変換
    String[] commentArgs = new String[splitComment.size()];
    splitComment.toArray(commentArgs);
    // オプションとして読み込む
    try {
        CommandLine commandLineTetfu = parseToCommandLine(options, parser, commentArgs);
        CommandLineWrapper newWrapper = new NormalCommandLineWrapper(commandLineTetfu);
        // 削除ラインが読み取れればOK
        newWrapper.getIntegerOption("clear-line");
        wrapper = new PriorityCommandLineWrapper(Arrays.asList(wrapper, newWrapper));
    } catch (FinderParseException ignore) {
    }
    // 固定ピースの指定があるか
    Optional<Boolean> reservedOption = wrapper.getBoolOption("reserved");
    reservedOption.ifPresent(settings::setReserved);
    // 最大削除ラインの設定
    Optional<Integer> maxClearLineOption = wrapper.getIntegerOption("clear-line");
    maxClearLineOption.ifPresent(settings::setMaxClearLine);
    // フィールドを設定
    ColoredField coloredField = tetfuPage.getField();
    if (tetfuPage.isPutMino()) {
        ColorType colorType = tetfuPage.getColorType();
        Rotate rotate = tetfuPage.getRotate();
        int x = tetfuPage.getX();
        int y = tetfuPage.getY();
        ColorConverter colorConverter = new ColorConverter();
        Mino mino = new Mino(colorConverter.parseToBlock(colorType), rotate);
        coloredField.putMino(mino, x, y);
    }
    if (settings.isReserved())
        settings.setFieldWithReserved(coloredField, settings.getMaxClearLine());
    else
        settings.setField(coloredField, settings.getMaxClearLine());
    return wrapper;
}
Also used : TetfuPage(common.tetfu.TetfuPage) Arrays(java.util.Arrays) ColorType(common.tetfu.common.ColorType) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) Files(java.nio.file.Files) org.apache.commons.cli(org.apache.commons.cli) IOException(java.io.IOException) Tetfu(common.tetfu.Tetfu) FinderParseException(exceptions.FinderParseException) ColorConverter(common.tetfu.common.ColorConverter) Rotate(core.srs.Rotate) Collectors(java.util.stream.Collectors) List(java.util.List) ColoredFieldFactory(common.tetfu.field.ColoredFieldFactory) MinoFactory(core.mino.MinoFactory) Charset(java.nio.charset.Charset) Paths(java.nio.file.Paths) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) Optional(java.util.Optional) CommandLineWrapper(entry.CommandLineWrapper) LinkedList(java.util.LinkedList) Path(java.nio.file.Path) ColoredField(common.tetfu.field.ColoredField) Mino(core.mino.Mino) TetfuPage(common.tetfu.TetfuPage) ColoredField(common.tetfu.field.ColoredField) Rotate(core.srs.Rotate) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) FinderParseException(exceptions.FinderParseException) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) CommandLineWrapper(entry.CommandLineWrapper) ColorType(common.tetfu.common.ColorType) ColorConverter(common.tetfu.common.ColorConverter) Mino(core.mino.Mino) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper)

Example 12 with FinderParseException

use of exceptions.FinderParseException in project solution-finder by knewjade.

the class PercentSettingParser method parse.

public Optional<PercentSettings> parse() throws FinderParseException {
    Options options = createOptions();
    CommandLineParser parser = new DefaultParser();
    CommandLine commandLine = parseToCommandLine(options, parser, commands);
    CommandLineWrapper wrapper = new NormalCommandLineWrapper(commandLine);
    PercentSettings settings = new PercentSettings();
    // help
    if (wrapper.hasOption("help")) {
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("percent [options]", options);
        return Optional.empty();
    }
    // フィールド・最大削除ラインの設定
    if (wrapper.hasOption("tetfu")) {
        // テト譜から
        Optional<String> tetfuData = wrapper.getStringOption("tetfu");
        if (!tetfuData.isPresent())
            throw new FinderParseException("Should specify option value: --tetfu");
        String encoded = Tetfu.removeDomainData(tetfuData.get());
        wrapper = loadTetfu(encoded, parser, options, wrapper, settings);
    } else {
        // フィールドファイルから
        Optional<String> fieldPathOption = wrapper.getStringOption("field-path");
        String fieldPath = fieldPathOption.orElse(DEFAULT_FIELD_TXT);
        Path path = Paths.get(fieldPath);
        Charset charset = Charset.forName(CHARSET_NAME);
        try {
            LinkedList<String> fieldLines = Files.lines(path, charset).map(str -> {
                if (str.contains("#"))
                    return str.substring(0, str.indexOf('#'));
                return str;
            }).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toCollection(LinkedList::new));
            if (fieldLines.isEmpty())
                throw new FinderParseException("Should specify clear-line & field-definition in field file");
            String removeDomainData = Tetfu.removeDomainData(fieldLines.get(0));
            if (Tetfu.isDataLater115(removeDomainData)) {
                // テト譜から
                wrapper = loadTetfu(removeDomainData, parser, options, wrapper, settings);
            } else {
                // 最大削除ラインの設定
                int maxClearLine = Integer.valueOf(fieldLines.pollFirst());
                settings.setMaxClearLine(maxClearLine);
                // フィールドの設定
                String fieldMarks = String.join("", fieldLines);
                Field field = FieldFactory.createField(fieldMarks);
                settings.setFieldFilePath(field);
            }
        } catch (NumberFormatException e) {
            throw new FinderParseException("Cannot read clear-line from " + fieldPath);
        } catch (IOException e) {
            throw new FinderParseException("Cannot open field file", e);
        }
    }
    // ドロップの設定
    Optional<String> dropType = wrapper.getStringOption("drop");
    try {
        dropType.ifPresent(type -> {
            String key = dropType.orElse("softdrop");
            try {
                settings.setDropType(key);
            } catch (FinderParseException e) {
                throw new RuntimeException(e);
            }
        });
    } catch (Exception e) {
        throw new FinderParseException("Unsupported format: format=" + dropType.orElse("<empty>"));
    }
    // パフェ成功確率ツリーの深さの設定
    Optional<Integer> treeDepth = wrapper.getIntegerOption("tree-depth");
    treeDepth.ifPresent(settings::setTreeDepth);
    // パフェ失敗パターンの表示個数の設定
    Optional<Integer> failedCount = wrapper.getIntegerOption("failed-count");
    failedCount.ifPresent(settings::setFailedCount);
    // ホールドの設定
    Optional<Boolean> isUsingHold = wrapper.getBoolOption("hold");
    isUsingHold.ifPresent(settings::setUsingHold);
    // ログファイルの設定
    Optional<String> logFilePath = wrapper.getStringOption("log-path");
    logFilePath.ifPresent(settings::setLogFilePath);
    // スレッド数の設定
    Optional<Integer> threadCount = wrapper.getIntegerOption("threads");
    threadCount.ifPresent(settings::setThreadCount);
    // 探索パターンの設定
    if (wrapper.hasOption("patterns")) {
        // パターン定義から
        Optional<String> patternOption = wrapper.getStringOption("patterns");
        assert patternOption.isPresent();
        String patternValue = patternOption.get();
        List<String> patterns = Arrays.stream(patternValue.split(PATTERN_DELIMITER)).collect(Collectors.toList());
        settings.setPatterns(patterns);
    } else {
        // パターンファイルから
        Optional<String> patternPathOption = wrapper.getStringOption("patterns-path");
        String patternPath = patternPathOption.orElse(DEFAULT_PATTERNS_TXT);
        Path path = Paths.get(patternPath);
        Charset charset = Charset.forName(CHARSET_NAME);
        try {
            List<String> patterns = Files.lines(path, charset).collect(Collectors.toList());
            settings.setPatterns(patterns);
        } catch (IOException e) {
            throw new FinderParseException("Cannot open patterns file", e);
        }
    }
    return Optional.of(settings);
}
Also used : TetfuPage(common.tetfu.TetfuPage) Arrays(java.util.Arrays) ColorType(common.tetfu.common.ColorType) org.apache.commons.cli(org.apache.commons.cli) Tetfu(common.tetfu.Tetfu) FinderParseException(exceptions.FinderParseException) MinoFactory(core.mino.MinoFactory) Charset(java.nio.charset.Charset) FieldFactory(core.field.FieldFactory) LinkedList(java.util.LinkedList) Path(java.nio.file.Path) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) Files(java.nio.file.Files) IOException(java.io.IOException) ColorConverter(common.tetfu.common.ColorConverter) Rotate(core.srs.Rotate) Collectors(java.util.stream.Collectors) List(java.util.List) Field(core.field.Field) Paths(java.nio.file.Paths) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) Optional(java.util.Optional) CommandLineWrapper(entry.CommandLineWrapper) ColoredField(common.tetfu.field.ColoredField) Mino(core.mino.Mino) Field(core.field.Field) ColoredField(common.tetfu.field.ColoredField) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) Path(java.nio.file.Path) Charset(java.nio.charset.Charset) IOException(java.io.IOException) FinderParseException(exceptions.FinderParseException) IOException(java.io.IOException) FinderParseException(exceptions.FinderParseException) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) CommandLineWrapper(entry.CommandLineWrapper)

Example 13 with FinderParseException

use of exceptions.FinderParseException in project solution-finder by knewjade.

the class PercentSettingParser method loadTetfu.

private CommandLineWrapper loadTetfu(String data, CommandLineParser parser, Options options, CommandLineWrapper wrapper, PercentSettings settings) throws FinderParseException {
    // テト譜面のエンコード
    List<TetfuPage> decoded = encodeTetfu(data);
    // 指定されたページを抽出
    int page = wrapper.getIntegerOption("page").orElse(1);
    TetfuPage tetfuPage = extractTetfuPage(decoded, page);
    // コメントの抽出
    // 先頭が数字ではない(--clear-line -p *p7のようになる)場合でも、parserはエラーにならない
    // データ取得時にOptional.emptyがかえるだけ
    String comment = "--clear-line " + tetfuPage.getComment();
    List<String> splitComment = Arrays.stream(comment.split(" ")).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList());
    // コマンド引数を配列に変換
    String[] commentArgs = new String[splitComment.size()];
    splitComment.toArray(commentArgs);
    // オプションとして読み込む
    try {
        CommandLine commandLineTetfu = parseToCommandLine(options, parser, commentArgs);
        CommandLineWrapper newWrapper = new NormalCommandLineWrapper(commandLineTetfu);
        // 削除ラインが読み取れればOK
        newWrapper.getIntegerOption("clear-line");
        wrapper = new PriorityCommandLineWrapper(Arrays.asList(wrapper, newWrapper));
    } catch (FinderParseException ignore) {
    }
    // 最大削除ラインの設定
    Optional<Integer> maxClearLineOption = wrapper.getIntegerOption("clear-line");
    maxClearLineOption.ifPresent(settings::setMaxClearLine);
    // フィールドを設定
    ColoredField coloredField = tetfuPage.getField();
    if (tetfuPage.isPutMino()) {
        ColorType colorType = tetfuPage.getColorType();
        Rotate rotate = tetfuPage.getRotate();
        int x = tetfuPage.getX();
        int y = tetfuPage.getY();
        ColorConverter colorConverter = new ColorConverter();
        Mino mino = new Mino(colorConverter.parseToBlock(colorType), rotate);
        coloredField.putMino(mino, x, y);
    }
    settings.setField(coloredField, settings.getMaxClearLine());
    return wrapper;
}
Also used : TetfuPage(common.tetfu.TetfuPage) Arrays(java.util.Arrays) ColorType(common.tetfu.common.ColorType) org.apache.commons.cli(org.apache.commons.cli) Tetfu(common.tetfu.Tetfu) FinderParseException(exceptions.FinderParseException) MinoFactory(core.mino.MinoFactory) Charset(java.nio.charset.Charset) FieldFactory(core.field.FieldFactory) LinkedList(java.util.LinkedList) Path(java.nio.file.Path) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) Files(java.nio.file.Files) IOException(java.io.IOException) ColorConverter(common.tetfu.common.ColorConverter) Rotate(core.srs.Rotate) Collectors(java.util.stream.Collectors) List(java.util.List) Field(core.field.Field) Paths(java.nio.file.Paths) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) Optional(java.util.Optional) CommandLineWrapper(entry.CommandLineWrapper) ColoredField(common.tetfu.field.ColoredField) Mino(core.mino.Mino) TetfuPage(common.tetfu.TetfuPage) ColoredField(common.tetfu.field.ColoredField) Rotate(core.srs.Rotate) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) FinderParseException(exceptions.FinderParseException) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) CommandLineWrapper(entry.CommandLineWrapper) ColorType(common.tetfu.common.ColorType) ColorConverter(common.tetfu.common.ColorConverter) Mino(core.mino.Mino) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper)

Example 14 with FinderParseException

use of exceptions.FinderParseException in project solution-finder by knewjade.

the class MoveSettingParser method parse.

public Optional<MoveSettings> parse() throws FinderParseException {
    Options options = createOptions();
    CommandLineParser parser = new DefaultParser();
    CommandLine commandLine = parseToCommandLine(options, parser, commands);
    CommandLineWrapper wrapper = new NormalCommandLineWrapper(commandLine);
    MoveSettings settings = new MoveSettings();
    // help
    if (wrapper.hasOption("help")) {
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("path [options]", options);
        return Optional.empty();
    }
    // フィールド・最大削除ラインの設定
    if (wrapper.hasOption("tetfu")) {
        // テト譜から
        Optional<String> tetfuData = wrapper.getStringOption("tetfu");
        if (!tetfuData.isPresent())
            throw new FinderParseException("Should specify option value: --tetfu");
        String encoded = Tetfu.removeDomainData(tetfuData.get());
        wrapper = loadTetfu(encoded, parser, options, wrapper, settings);
    } else if (wrapper.hasOption("field-path")) {
        // フィールドファイルから
        Optional<String> fieldPathOption = wrapper.getStringOption("field-path");
        String fieldPath = fieldPathOption.orElse(DEFAULT_FIELD_TXT);
        Path path = Paths.get(fieldPath);
        Charset charset = Charset.forName(CHARSET_NAME);
        try {
            LinkedList<String> fieldLines = Files.lines(path, charset).map(str -> {
                if (str.contains("#"))
                    return str.substring(0, str.indexOf('#'));
                return str;
            }).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toCollection(LinkedList::new));
            if (fieldLines.isEmpty())
                throw new FinderParseException("Should specify clear-line & field-definition in field file");
            String removeDomainData = Tetfu.removeDomainData(fieldLines.get(0));
            if (Tetfu.isDataLater115(removeDomainData)) {
                // テト譜から
                wrapper = loadTetfu(removeDomainData, parser, options, wrapper, settings);
            } else {
                // フィールドの設定
                String fieldMarks = String.join("", fieldLines);
                ColoredField coloredField = ColoredFieldFactory.createColoredField(fieldMarks);
                settings.setField(coloredField);
            }
        } catch (NumberFormatException e) {
            throw new FinderParseException("Cannot read clear-line from " + fieldPath);
        } catch (IOException ignored) {
        }
    }
    // ログファイルの設定
    Optional<String> logFilePath = wrapper.getStringOption("log-path");
    logFilePath.ifPresent(settings::setLogFilePath);
    // アウトプットファイルの設定
    Optional<String> outputBaseFilePath = wrapper.getStringOption("output-base");
    outputBaseFilePath.ifPresent(settings::setOutputBaseFilePath);
    // 探索パターンの設定
    if (wrapper.hasOption("patterns")) {
        // パターン定義から
        Optional<String> patternOption = wrapper.getStringOption("patterns");
        assert patternOption.isPresent();
        String patternValue = patternOption.get();
        List<String> patterns = Arrays.stream(patternValue.split(PATTERN_DELIMITER)).collect(Collectors.toList());
        settings.setPatterns(patterns);
    } else {
        // パターンファイルから
        Optional<String> patternPathOption = wrapper.getStringOption("patterns-path");
        String patternPath = patternPathOption.orElse(DEFAULT_PATTERNS_TXT);
        Path path = Paths.get(patternPath);
        Charset charset = Charset.forName(CHARSET_NAME);
        try {
            List<String> patterns = Files.lines(path, charset).collect(Collectors.toList());
            settings.setPatterns(patterns);
        } catch (IOException e) {
            throw new FinderParseException("Cannot open patterns file", e);
        }
    }
    return Optional.of(settings);
}
Also used : Path(java.nio.file.Path) ColoredField(common.tetfu.field.ColoredField) Optional(java.util.Optional) Charset(java.nio.charset.Charset) IOException(java.io.IOException) LinkedList(java.util.LinkedList) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) FinderParseException(exceptions.FinderParseException) NormalCommandLineWrapper(entry.NormalCommandLineWrapper) PriorityCommandLineWrapper(entry.PriorityCommandLineWrapper) CommandLineWrapper(entry.CommandLineWrapper)

Example 15 with FinderParseException

use of exceptions.FinderParseException in project solution-finder by knewjade.

the class MoveSettingParser method encodeTetfu.

private List<TetfuPage> encodeTetfu(String encoded) throws FinderParseException {
    MinoFactory minoFactory = new MinoFactory();
    ColorConverter colorConverter = new ColorConverter();
    Tetfu tetfu = new Tetfu(minoFactory, colorConverter);
    String data = Tetfu.removePrefixData(encoded);
    if (data == null)
        throw new FinderParseException("Unsupported tetfu: data=" + encoded);
    return tetfu.decode(data);
}
Also used : FinderParseException(exceptions.FinderParseException) ColorConverter(common.tetfu.common.ColorConverter) MinoFactory(core.mino.MinoFactory) Tetfu(common.tetfu.Tetfu)

Aggregations

FinderParseException (exceptions.FinderParseException)15 Tetfu (common.tetfu.Tetfu)13 ColorConverter (common.tetfu.common.ColorConverter)13 MinoFactory (core.mino.MinoFactory)13 TetfuPage (common.tetfu.TetfuPage)9 CommandLineWrapper (entry.CommandLineWrapper)9 NormalCommandLineWrapper (entry.NormalCommandLineWrapper)9 IOException (java.io.IOException)9 Charset (java.nio.charset.Charset)9 Path (java.nio.file.Path)9 LinkedList (java.util.LinkedList)9 Optional (java.util.Optional)9 ColoredField (common.tetfu.field.ColoredField)8 PriorityCommandLineWrapper (entry.PriorityCommandLineWrapper)8 Files (java.nio.file.Files)8 Paths (java.nio.file.Paths)8 List (java.util.List)8 Collectors (java.util.stream.Collectors)8 org.apache.commons.cli (org.apache.commons.cli)8 ColorType (common.tetfu.common.ColorType)7