HTML5/CSS3 モダンコーディング を読んだ

HTML や CSS はデザイナーさんがマークアップまでしてくれることが多かったのだけれど、そういえば分からないことたくさんあるなぁと思って読んでみた。

サンプルサイトを写経しながら実際に作っていける。

最初に構造を決めてから組み上げていく流れになっていて、とても分かりやすい。

正直良く分からないテクニックみたいなのもあったんだけど、真似して書けばとりあえずページは出来上がるので、モチベーションが続きやすい。

これでマークアップができるようになる気は全くしないが、この本を取っ掛かりにすれば手を伸ばしていけそうな気持ちになる。

HTML5/CSS3 モダンコーディング 読書メモ · GitHub

657. Robot Return to Origin

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/robot-return-to-origin/

  • 座標位置を上下左右に動かす指示が文字列で与えられる
    • R (right), L (left), U (up), and D (down)
  • 元の位置 (0, 0) に戻っていたら true , 戻っていなければ false を返す

Solution

class Solution {
    public boolean judgeCircle(String moves) {
        int x = 0;
        int y = 0;
        for (int i = 0; i < moves.length(); i++) {
            switch (moves.charAt(i)) {
                case 'R':
                    x++;
                    break;
                case 'L':
                    x--;
                    break;
                case 'U':
                    y++;
                    break;
                case 'D':
                    y--;
                    break;
                default:
                    break;
            }
        }
        return x == 0 && y == 0;
    }
}

Impressions

  • 愚直に動かすアプローチを取った
    • false と分かった時点で return するアプローチもいくつかありそう
    • 文字列長が奇数ならそもそも false とか
    • RL と UD みたいに対比するコマンドの数が合わないとか
  • switch 文の書き方をよく忘れる

A - Remaining Balls

AtCoder の挑戦ログ

Problem

https://atcoder.jp/contests/abc154/tasks/abc154_a

Solution

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String color1 = sc.next();
        sc.next();
        int color1Cnt = sc.nextInt();
        int color2Cnt = sc.nextInt();
        String disposed = sc.next();

        if (disposed.equals(color1)) {
            System.out.printf("%d %d", color1Cnt - 1, color2Cnt);
            return;
        }
        System.out.printf("%d %d", color1Cnt, color2Cnt - 1);
    }
}

Impressions

  • LeetCode と違って標準入出力から自分で書かなきゃいけないのが面倒
  • 簡単な問題なら戦えそうなので、コンテスト出てみようかな

728. Self Dividing Numbers

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/self-dividing-numbers/

  • 整数の範囲が渡される
  • 範囲の中から、自身の桁ごとの数字で割り切れる値を抽出する
  • 0 を含む値は除外する

Solution

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
        return IntStream.range(left, right + 1)
                .mapToObj(DividingNumber::new)
                .filter(DividingNumber::isSelfDividingNumber)
                .map(DividingNumber::getValue)
                .collect(Collectors.toList());
    }
}

class DividingNumber {
    private int value;

    DividingNumber(int value) {
        this.value = value;
    }

    boolean isSelfDividingNumber() {
        return Arrays.stream(split(value)).allMatch(i -> i != 0 && this.value % i == 0);
    }

    int getValue() {
        return value;
    }

    private int[] split(int num) {
        String s = String.valueOf(num);
        int[] split = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            split[i] = Character.getNumericValue(s.charAt(i));
        }
        return split;
    }

    @Override
    public String toString() {
        return "DividingNumber{" +
                "value=" + value +
                '}';
    }
}

Impressions

  • 元の値と桁ごとの値を同時に扱うようにしたので、箱としてクラスを作った
  • 範囲用に Stream#range がある
  • allMatch の存在を忘れて filter と count でどうにかしようとしちゃう

627. Swap Salary

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/swap-salary/

  • salary テーブルの性別を入れ替える
  • f の行は m に
  • m の行は f に

Solution

UPDATE salary SET sex = (
  CASE 
    WHEN sex = 'f' THEN 'm'
    ELSE 'f'
  END
);

Impressions

  • CASE 文便利

961. N-Repeated Element in Size 2N Array

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/n-repeated-element-in-size-2n-array/

  • 2N サイズの配列が与えられる
  • N+1 種類の整数が含まれている
  • 一つの要素が N 回繰り返されている
  • N 回繰り返されてる数を特定する

Solution

class Solution {
    public int repeatedNTimes(int[] A) {
        return Arrays.stream(A).boxed()
                .collect(Collectors.groupingBy(i -> i, Collectors.counting()))
                .entrySet().stream()
                .filter(it -> it.getValue() == A.length / 2)
                .map(Map.Entry::getKey)
                .findAny()
                .orElse(0);
    }
}

Impressions

  • Collectors.groupingByCollectors.counting() を組み合わせることで、Key ごとの数という Map が作れる
    • collect(Collectors.groupingBy(i -> i, Collectors.counting()))
  • 本当は groupingBy のところを自前で書くような問題なんだろう

References

JUnit5 を IntelliJ IDEA から実行できない #IntelliJIDEA

TL;DR

  • Maven のプロジェクトに JUnit5 の依存を追加した
  • コマンドラインからは通るが、 IntelliJ IDEA からの実行がエラーになる
  • junit-platform-launcher を依存に追加したら実行できるようになった

環境

詳細

公式の 4.2.2. Maven を見て依存を追加。

junit-jupiter-apijunit-jupiter-engine を追加。

これでコマンドラインから ./mvnw test でテストは実行できるようになった。

しかし IDEA から GUI でテスト実行しようとすると下記のようなエラーが出てしまう。

Error:java: エラー: リリース・バージョン5はサポートされていません

junit-platform-launcher を依存に追加すると解決した。

最終的な pom.xml には下記のような内容が記載してある。

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.6.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

4.1.1. IntelliJ IDEA に古いバージョンは junit-platform-launcher , junit-jupiter-engine, and junit-vintage-engine を指定しろと記載しているものの、新しいバージョンではよしなにやってくれそうなことが書いてあるのでよく分からない。

参考