Python3でprint文一行で終わらせてみた

Python3で、print文一行でプログラムを完結させてみました。
題材は、[アルゴ式](https://algo-method.com/)、[paizaラーニング](https://paiza.jp/works)等の問題を使用させて頂いております。
- ###### 半角スペース区切りで与えられた文字列を改行区切りで順に出力
    - 問題
    標準入力で$N$個の文字列が1行で与えられるので、それらを入力して、順にそのまま$N$行で出力してください。
    - 入力
    $N$
    $S_1$ $S_2$ $\dots$ $S_N$
    - 出力
    $S_1$
    $S_2$
    $\dots$
    $S_N$
    - 出典
    [N個のデータの入力](https://paiza.jp/works/mondai/stdin/stdin_n)（paizaラーニング）
    - - -
    - 解答例（$N$を活かす）
    ```py
    n=int(input())
    S=input().split()
    for i in range(n):
        print(S[i])
    ```
    - 解答例（$N$を捨てる）
    ```py
    n=int(input())
    S=input().split()
    for s in S:
        print(s)
    ```
    - ワンライナー（$N$を捨てる）
    ```py
    print(*[input()]*0+input().split(),sep='\n')
    ```
    - 別解
    ```py
    print(*([input()]+input().split())[1:],sep='\n')
    ```
    - ワンライナー（$N$を活かす）
    ```py
    print(*[s[i] for n in [int(input()) for _ in [0]] for s in [input().split() for _ in [0]] for i in range(n)],sep='\n')
    ```
- - -
- ###### 改行区切りで与えられた文字列を半角スペース区切りで順に出力
    - 問題
    $N$個の文字列が改行区切りで与えられます。それらを入力して、順にそのまま半角スペース区切りで出力してください。
    - 入力
    $N$
    $S_1$
    $S_2$
    $\dots$
    $S_N$
    - 出力
    $S_1$ $S_2$ $\dots$ $S_N$
    - 類題
    [入力された 10 個の文字列を出力](https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step4)（paizaラーニング）
    - - -
    - 解答例（文字列結合）
    ```py
    n=int(input())
    S=''
    for i in range(n):
        if i>0:
            S+=' '
        S+=input()
    print(S)
    ```
    - 解答例（文字列配列として受け取ってアンパック）
    ```py
    n=int(input())
    S=['']*n
    for i in range(n):
        S[i]=input()
    print(*S)
    ```
    - 解答例（文字列リストとして受け取ってアンパック）
    ```py
    n=int(input())
    S=[]
    for i in range(n):
        S.append(input())
    print(*S)
    ```
    - ワンライナー
    ```py
    print(*[input() for i in range(int(input()))])
    ```
- - -
- ###### 二項演算
    - 問題
    2つの整数$A$, $B$が半角空白区切りで入力されます。$A+B$を出力してください。
    - 入力
    $A$ $B$
    - 出力
    $A+B$
    - 出典
    [標準入力 2-1](https://algo-method.com/tasks/24)（アルゴ式）
    [EX5 - A足すB問題](https://atcoder.jp/contests/APG4b/tasks/APG4b_cr)（AtCoder）
    [足し算](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition)（paizaラーニング）
    - - -
    - 解答例
    ```py
    a,b=map(int,input().split())
    print(a+b)
    ```
    - ワンライナー
    ```py
    print(*[a+b for a,b in [map(int,input().split()) for _ in [0]]])
    ```
    - eval関数を使用
    ```py
    print(eval('+'.join(input().split())))
    ```
    - - -
    複数の演算結果を半角スペース区切りで出力する
    - 問題
    整数$A$, $B$が半角空白区切りで与えられます。$A$から$B$を引いた差$D$と$A$と$B$の積$P$を半角空白区切りで出力してください。
    - 入力
    $A$ $B$
    - 出力
    $D$ $P$
    - 出典
    [引き算・掛け算](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__accompanied_by_stdin_2)（paizaラーニング）
    - - -
    - 解答例
    ```py
    a,b=map(int,input().split())
    d=a-b
    p=a*b
    print(d,p)
    ```
    - ワンライナー
    ```py
    print(*[[a-b,a*b] for a,b in [map(int,input().split()) for _ in [0]]][0])
    ```
    - - -
    複数の演算結果を改行区切りで出力する
    - 問題(改)
    整数$A$, $B$が半角空白区切りで与えられます。$A$から$B$を引いた差$D$と$A$と$B$の積$P$を改行区切りで出力してください。
    - 入力
    $A$ $B$
    - 出力
    $D$
    $P$
    - - -
    - 解答例
    ```py
    a,b=map(int,input().split())
    print(a-b)
    print(a*b)
    ```
    - ワンライナー
    ```py
    print(*[[a-b,a*b] for a,b in [map(int,input().split()) for _ in [0]]][0],sep='\n')
    ```
- - -
- ###### 整数の合計値を求める
    - 問題
    $N$個の整数$A_1,A_2,\dots,A_N$が半角空白区切りで与えられます。$N$個の整数の合計値を求めてください。
    - 入力
    $N$
    $A_1$ $A_2$ $\dots$ $A_N$
    - 出力
    $\sum_{i=1}^{N}A_i$
    - 出典
    [標準入力 3-1](https://algo-method.com/tasks/53)（アルゴ式）
    - - -
    - 解答例
    ```py
    n=int(input())
    A=map(int,input().split())
    S=0
    for a in A:
        S+=a
    print(S)
    ```
    - ワンライナー
    ```py
    print(sum([input()]*0+[int(a) for a in input().split()]),sep='\n')
    ```
- - -
- ###### 整数の平均値を求める
    - 問題
    $N$個の整数$A_1,A_2,\dots,A_N$が半角空白区切りで与えられます。$N$個の整数の平均値を求めてください。但し、答えは**小数点以下を切り捨てて**出力してください。
    - 入力
    $N$
    $A_1$ $A_2$ $\dots$ $A_N$
    - 出典
    [標準入力 3-6](https://algo-method.com/tasks/60)（アルゴ式）
    - - -
    - 解答例
    ```py
    n=int(input())
    A=map(int,input().split())
    S=0
    for a in A:
        S+=a
    avg=S//n
    print(avg)
    ```
    - ワンライナー
    ```py
    print(*[sum(A)//n for n,A in [[int(input()),[int(a) for a in input().split()]] for _ in [0]]])
    ```
- - -
- ###### 整数を全て掛け合わせた値を求める
    - 問題
    $N$個の整数$A_1,A_2,\dots,A_N$が半角空白区切りで与えられます。$N$個の整数を全て掛け合わせた値を求めてください。
    - 入力
    $N$
    $A_1$ $A_2$ $\dots$ $A_N$
    - 出力
    $\prod_{i=1}^{N}A_i$
    - 出典
    [標準入力 3-2](https://algo-method.com/tasks/54)（アルゴ式）
    - - -
    - 解答例
    ```py
    n=int(input())
    A=map(int,input().split())
    P=1
    for a in A:
        P*=a
    print(P)
    ```
    - ワンライナー
    ```py
    print((lambda A:[A.append(A.pop()*a)or A[0] for n in [input() for _ in [0]] for a in [int(_) for _ in input().split()]])([1])[-1])
    ```
    - reduce関数を使う
    ```py
    print(__import__('functools').reduce(lambda a,b:a*b,[input()]*0+[int(a) for a in input().split()],1))
    ```
- - -
- ###### Fizz Buzz（FizzBuzzではない）
    - 問題
    整数$N$が入力として与えられます。
    $1$から$N$までの整数を$1$から順に表示してください。
    ただし、表示しようとしている数値が、
        - $3$の倍数かつ$5$の倍数のときには```Fizz Buzz```
        - $3$の倍数のときには```Fizz```
        - $5$の倍数のときには```Buzz```
    を数値の代わりに表示してください。
    - 出典
    [Fizz Buzz](https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz)（paizaラーニング）
    - - -
    - 解答例
    ```py
    n=int(input())
    for i in range(1,n+1):
        if i%3==0 and i%5==0:
            print("Fizz Buzz")
        elif i%3==0:
            print("Fizz")
        elif i%5==0:
            print("Buzz")
        else:
            print(i)
    ```
    - ワンライナー
    ```py
    print(*[('' if i%3 else 'Fizz')+('' if i%3 or i%5 else ' ')+('' if i%5 else 'Buzz') or i for i in range(1,int(input())+1)], sep='\n')
    ```
- - -
- ###### [paiza転職の練習問題](https://paiza.jp/challenges/practice)を一行で解く
    - 問題
    入力された整数が[グレゴリオ暦](http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6)で[閏年]()であるか判定するプログラムを書いてください。
        - 閏年判定の条件
            1. 西暦が4で割り切れる年は閏年。
            2. ただし、100で割り切れる年は閏年ではない。
            3. ただし、400で割り切れる年は閏年。
    - 入力
    $T$
    $N_1$
    $N_2$
    $\dots$
    $N_T$
    1行目には、入力される行数$T$が入ります。
    1回のテストケースは、1行に1つずつ整数$N$が入っている複数行の標準入力による入力になります。
    - 出力
    標準出力で、入力された行数分の判定結果を出力します。
    閏年だった場合、$N$``` is a leap year```
    閏年でない場合、$N$``` is not a leap year```
    と出力してください。
    - - -
    - 解答例
    ```py
    T=int(input())
    for t in range(T):
        n=int(input())
        if n%400==0:
            print(str(n) + " is a leap year")
        elif n%100==0:
            print(str(n) + " is not a leap year")
        elif n%4==0:
            print(str(n) + " is a leap year")
        else:
            print(str(n) + " is not a leap year")
    ```
    - ワンライナー
    ```py
    print(*[f"{n} is{' ' if (not n%4 and n%100 or not n%400) else ' not '}a leap year" for n in [int(input()) for t in range(int(input()))]],sep='\n')
    ```
    - モジュールを使用する
    ```py
    print(*[f"{n} is{' ' if __import__('calendar').isleap(n) else ' not '}a leap year" for n in [int(input()) for t in range(int(input()))]],sep='\n')
    ```
- - -
- ###### 辞書（連想配列）
    - 問題
    $N$人の人に関して、それぞれの人の名前と財産が与えられます。その後に人名$T$が与えられるので、$T$の財産を表す整数を出力してください。
    - 入力
    $N$
    $S_1$ $A_1$
    $S_2$ $A_2$
    $\dots$
    $S_N$ $A_N$
    $T$
        - $T$ は最初に与えられた名前のうちのいずれか
    - 出力
    $T$の財産を出力してください。
    - 出典
    [辞書の基本](https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step1)（paizaラーニング）
    - - -
    - 解答例
    ```py
    n=int(input())
    d={}
    for i in range(n)
        s,a=input().split()
        d[s]=a #aをint型に変換する必要はない
    t=input()
    print(d[t])
    ```
    - ワンライナー
    ```py
    print({s:a for s,a in (input().split() for _ in range(int(input())))}[input()])
    ```
- - -
- ###### 累積和（数列は半角空白区切り）
    - 問題
    $N$個の整数からなる数列$A_1,A_2,\dots,A_N$が与えられます。
    この数列に対して、以下の$Q$回の質問に答えてください。
        - 整数$k$が与えられるので、$A_1+A_2+\dots+A_k$の値をを求めてください。
    - 入力
    $N$
    $A_1$ $A_2$ $\dots$ $A_N$
    $Q$
    $k_1$
    $k_2$
    $\dots$
    $k_Q$
    - 出力
    $S_1$
    $S_2$
    $\dots$
    $S_Q$
        - 質問の答えをを改行区切りで出力してください。
    - 出典
    [総和クエリ (1)](https://algo-method.com/tasks/1025)（アルゴ式）
    - - -
    - 解答例1
    ```py
    n=int(input())
    A=list(map(int,input().split()))
    S=[0]*(n+1)
    for i in range(n):
        S[i+1]=S[i]+A[i]
    Q=int(input())
    for q in range(Q):
        k=int(input())
        print(S[k])
    ```
    - 解答例2
    ```py
    n=int(input())
    A=list(map(int,input().split()))
    S=[0]
    for a in A:
        S.append(S[-1]+a)
    Q=int(input())
    for q in range(Q):
        k=int(input())
        print(S[k])
    ```
    - ワンライナー
    ```py
    print(*[[(lambda S:[S.append(S.pop()+a) or S[0] for a in [0]+A])([0]) for _ in [0]][0][k] for A in [[input()]*0+[int(a) for a in input().split()]] for K in [[int(input()) for q in range(int(input()))]] for k in K],sep='\n')
    ```
- - -
- ###### 累積和（数列は改行区切り）
    - 問題
    長さ$N$の数列$A_1,A_2,\dots,A_N$と、$K$個の整数$Q_1,Q_2,\dots,Q_K$が与えられます。各整数$Q_k(1\le k\le K)$について$A_1+A_2+\dots+A_{Q_k}$を求めてください。
    - 入力
    $N$ $K$
    $A_1$
    $A_2$
    $\dots$
    $A_N$
    $Q_1$
    $Q_2$
    $\dots$
    $Q_K$
    - 出力
    $S_1$
    $S_2$
    $\dots$
    $S_K$
        - $k$行目に$S_k=A_1+A_2+\dots+A_{Q_k}$を出力してください。
    - 出典
    [累積和](https://paiza.jp/works/mondai/query_primer/query_primer__cumulative_sum)（paizaラーニング）
    - - -
    - 解答例1
    ```py
    n,k=map(int,input().split())
    A=[0]*n
    S=[0]*(n+1)
    for i in range(n):
        A[i]=int(input())
        S[i+1]=S[i]+A[i]
    for i in range(k):
        q=int(input())
        print(S[q])
    ```
    - 解答例2
    ```py
    n,k=map(int,input().split())
    S=[0]
    for i in range(n):
        a=int(input())
        S.append(S[-1]+a)
    for i in range(k):
        q=int(input())
        print(S[q])
    ```
    - ワンライナー
    ```py
    print(*[(lambda S:[S.append(S.pop()+a) or S[0] for a in [0]+A])([0])[q] for N,K in [map(int,input().split()) for _ in [0]] for A in [[int(input()) for i in range(N)] for _ in [0]] for Q in [[int(input()) for k in range(K)] for _ in [0]] for q in Q],sep='\n')
    ```
- - -
- ###### 区間和（数列は半角空白区切り）
    - 問題
    $N$個の整数からなる数列$A_1,A_2,\dots,A_N$が与えられます。
    この数列に対して、以下の$Q$回の質問に答えてください。
        - 整数$l$, $r$が与えられるので、$A_{l+1}+A_{l+2}+\dots+A_{r-1}+A_r$の値をを求めてください。
    - 入力
    $N$
    $A_1$ $A_2$ $\dots$ $A_N$
    $Q$
    $l_1$ $r_1$
    $l_2$ $r_2$
    $\dots$
    $l_Q$ $r_Q$
    - 出力
    $S_1$
    $S_2$
    $\dots$
    $S_Q$
        - 質問の答えをを改行区切りで出力してください。
    - 出典
    [総和クエリ (2)](https://algo-method.com/tasks/1026)（アルゴ式）
    - - -
    - 解答例1
    ```py
    n=int(input())
    A=list(map(int,input().split()))
    S=[0]*(n+1)
    for i in range(n):
        S[i+1]=S[i]+A[i]
    Q=int(input())
    for q in range(Q):
        l,r=map(int,input().split())
        print(S[r]-S[l])
    ```
    - 解答例2
    ```py
    n=int(input())
    A=list(map(int,input().split()))
    S=[0]
    for a in A:
        S.append(S[-1]+a)
    Q=int(input())
    for q in range(Q):
        l,r=map(int,input().split())
        print(S[r]-S[l])
    ```
    - ワンライナー
    ```py
    print(*[S[r]-S[l] for S in [(lambda s:[s.append(s.pop()+a) or s[0] for a in [int(input())*0]+[int(a) for a in input().split()]])([0]) for _ in [0]] for LR in [[map(int,input().split()) for q in range(int(input()))]] for l,r in LR],sep='\n')
    ```
- - -
- ###### 区間和（数列は改行区切り）
    - 問題
    長さ$N$の数列$A_1,A_2,\dots,A_N$と、$K$個の区間$(l_1,r_1),(l_2,r_2),\dots,(l_K,r_K)$が与えられます。各区間についての数列の区間和$A_{l_i}+A_{l_i+1}+\dots+A_{r_i}$（$1\le i\le K$) を求めてください。
    - 入力
    $N$ $K$
    $A_1$
    $A_2$
    $\dots$
    $A_N$
    $l_1$ $r_1$
    $l_2$ $r_2$
    $\dots$
    $l_K$ $r_K$
    - 出力
    $S_1$
    $S_2$
    $\dots$
    $S_Q$
        - $k$行目に$S_k=A_{l_i}+A_{l_i+1}+\dots+A_{r_i}$を出力してください。
    - 出典
    [区間和](https://paiza.jp/works/mondai/query_primer/query_primer__interval_sum)（paizaラーニング）
    - - -
    - 解答例1
    ```py
    n,k=map(int,input().split())
    A=[0]*n
    S=[0]*(n+1)
    for i in range(n):
        A[i]=int(input())
        S[i+1]=S[i]+A[i]
    for i in range(k):
        l,r=map(int,input().split())
        print(S[r]-S[l-1])
    ```
    - 解答例2
    ```py
    n,k=map(int,input().split())
    S=[0]
    for i in range(n):
        a=int(input())
        S.append(S[-1]+a)
    for i in range(k):
        l,r=map(int,input().split())
        print(S[r]-S[l-1])
    ```
    - ワンライナー
    ```py
    print(*[S[r]-S[l-1] for N,K in [map(int,input().split()) for _ in [0]] for S in [(lambda s:[s.append(s.pop()+a) or s[0] for a in [0]+[[int(input()) for i in range(N)] for _ in [0]][0]])([0])] for Q in [[map(int,input().split()) for k in range(K)] for _ in [0]] for l,r in Q],sep='\n')
    ```
- - -
- ###### 行列
    - 問題
    $n$行$m$列の行列$A=(a_{i,j})$が与えられます。行列$A$の転置行列を出力してください。
    - 入力
    $n$ $m$
    $a_{11}$ $a_{12}$ $\dots$ $a_{1m}$
    $a_{21}$ $a_{22}$ $\dots$ $a_{2m}$
    $\dots$
    $a_{n1}$ $a_{n2}$ $\dots$ $a_{nm}$
    - 出力
    $a_{11}$ $a_{21}$ $\dots$ $a_{n1}$
    $a_{12}$ $a_{22}$ $\dots$ $a_{n2}$
    $\dots$
    $a_{1m}$ $a_{2m}$ $\dots$ $a_{nm}$
    - - -
    - 解答例
    ```py
    n,m=map(int,input().split())
    A=[[int(a) for a in input().split()] for i in range(n)]
    for j in range(m):
        for i in range(n):
            print(A[i][j],end='\n' if i==n-1 else ' ')
    ```
    - ワンライナー
    ```py
    print(*[' '.join([str(t) for t in T]) for T in zip(*[[int(a) for a in input().split()] for i in range(list(map(int,input().split()))[0])])],sep="\n")
    ```
    :::note
    転置行列を出力するだけなら、`int`に変換後`str`に戻す処理は不要です。
- - -
- ###### 無向グラフの隣接リストの出力
    - 問題
    $1,\dots,N$の番号がついた$N$個の頂点と、$1,\dots,M$の番号がついた$M$個の辺からなる無向グラフを考えます。
    整数$N,M$と、$M$個の頂点の組$(A_1,B_1),\dots,(A_M,B_M)$が与えられます。
    頂点の組$(A_i,B_i)$は、頂点$A_i$と頂点$B_i$が辺で直接つながっていることを表します。（頂点$A_i$と頂点$B_i$が辺で直接つながっているとき、頂点$B_i$と頂点$A_i$も辺で直接つながっているといえます）
    そして、これら以外に辺で直接つながっている頂点の組はありません。
    このとき、次のような形式で表される「隣接リスト」を出力してください。
    $N$行ある各行にいくつかの整数を並べたもので、上から$i$行目を
        - 頂点$i$と辺で直接つながっているような頂点を重複なく並べたもの
        - そのような頂点がない場合は空とする
        - 整数の並びはどのような順番でもよい
    としたもの。
    - 入力
    $N$ $M$
    $A_1$ $B_1$
    $A_2$ $B_2$
    $\dots$
    $A_M$ $B_M$
        - $1$行目に、頂点の個数を表す整数$N$と、頂点の組の個数を表す整数$M$が半角スペース区切りで与えられます。
        - 続く$M$行では、頂点の組$A_i,B_i$が半角スペース区切りで与えられます。
    - 出力
    合計$N$行出力してください。
    $i$（$1\le i\le N$）行目には、隣接リストの上から$i$行目の整数を左から順に半角スペース区切りで出力してください。但し、$i$行目が空である場合は、`-1`を出力してください。
    - 出典
    [隣接リストの出力・無向グラフ](https://paiza.jp/works/mondai/graph_input_problems/graph_input_problems__adjacency_list_step1)（paizaラーニング）
    - - -
    - 解答例
    ```py
    n,m=map(int,input().split())
    G=[[] for i in range(n+1)]
    for j in range(m):
        a,b=map(int,input().split())
        G[a].append(b)
        G[b].append(a)
    for i in range(1,n+1):
        if len(G[i])>0:
            print(*G[i])
        else:
            print(-1)
    ```
    - ワンライナー
    ```py
    print(*[' '.join(str(v+1) for v in G) or ~0 for G in [(lambda A:[_ for _ in [A[a].append(b) or A[b].append(a) for a,b in [(a-1,b-1) for a,b in [map(int,input().split()) for i in range(m)]]] if _ is not None] or A)([[] for i in range(n)]) for n,m in [map(int,input().split()) for _ in [0]]][0]],sep='\n')
    ```
    - (追記)`[...]*0`でよかった
    ```py
    print(*[' '.join(str(v+1) for v in G) or ~0 for G in [(lambda A:[A[a].append(b) or A[b].append(a) for a,b in [(a-1,b-1) for a,b in [map(int,input().split()) for i in range(m)]]]*0 or A)([[] for i in range(n)]) for n,m in [map(int,input().split()) for _ in [0]]][0]],sep='\n')
    ```
:::note warn
実務でやると~~クライアント様から一行分の報酬しか頂けません~~エラーの原因が見つけづらくなりますので、避けてください。
そもそも`print`関数の引数に`input`関数の返却値を直接渡すという、ある関数の返却値を別の関数の引数に直接渡すのは禁じ手ですし、全て
```
Traceback (most recent call last):
  File "Main.py", line 1, in <module>
```
のように`line 1`で出力されてしまいます。
（ホンマに品質悪そうでお金払いたないわ～）
あくまでパズルとして楽しむ程度にお願いします。
:::