Python3 で FizzBuzz (sqllite3利用)


なんか、急に「FizzBuzzを書け」という電波を受信したので。

python で書いてみました(ヲイ。

FizzBuzz01.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


sql = '''
    SELECT
        CASE
            WHEN n % 3 = 0 AND n % 5 = 0
                THEN 'FizzBuzz'
            WHEN n % 3 = 0
                THEN 'Fizz'
            WHEN n % 5 = 0
                THEN 'Buzz'
            ELSE
                CAST(n AS TEXT)
        END
    FROM
        (
            SELECT
                    N1.column1*10 + N2.column1 + 1 AS n
                    -- ROW_NUMBER() OVER (ORDER BY column1) AS n
                FROM
                    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) N1
                    , (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) N2
        ) N
;
'''

def main():
    with sqlite3.connect(':memory:') as conn:
        lines = conn.execute(sql)

    [print(l[0]) for l in lines]

if __name__ == '__main__':
    main()

ちなみに、動作テストは Python3.7.0 で行いました。
sqlite3.sqlite_version は '3.21.0' ですので
sqlite3 の version 3.25.0 から使える、ROW_NUMBER() 等の Window関数は使えませんでした。

追記:
Python に甘えて堕落していました。

FizzBuzz02.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


sql = '''
    SELECT
        GROUP_CONCAT(
            CASE
                WHEN n % 3 = 0 AND n % 5 = 0
                    THEN 'FizzBuzz'
                WHEN n % 3 = 0
                    THEN 'Fizz'
                WHEN n % 5 = 0
                    THEN 'Buzz'
                ELSE
                    CAST(n AS TEXT)
            END,CHAR(13,10))
    FROM
        (
            SELECT
                    N1.column1*10 + N2.column1 + 1 AS n
                    -- ROW_NUMBER() OVER (ORDER BY column1) AS n
                FROM
                    (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) N1
                    , (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) N2
        ) N
;
'''

def main():
    with sqlite3.connect(':memory:') as conn:
        print(conn.execute(sql).fetchall()[0][0])

if __name__ == '__main__':
    main()