0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-02-25

Python3で、print文一行でプログラムを完結させてみました。
題材は、アルゴ式paizaラーニング等の問題を使用させて頂いております。

  • 半角スペース区切りで与えられた文字列を改行区切りで順に出力
    • 問題
      標準入力で$N$個の文字列が1行で与えられるので、それらを入力して、順にそのまま$N$行で出力してください。
    • 入力
      $N$
      $S_1$ $S_2$ $\dots$ $S_N$
    • 出力
      $S_1$
      $S_2$
      $\dots$
      $S_N$
    • 出典
      N個のデータの入力(paizaラーニング)

    • 解答例($N$を活かす)
    n=int(input())
    S=input().split()
    for i in range(n):
        print(S[i])
    
    • 解答例($N$を捨てる)
    n=int(input())
    S=input().split()
    for s in S:
        print(s)
    
    • ワンライナー($N$を捨てる)
    print(*[input()]*0+input().split(),sep='\n')
    
    • 別解
    print(*([input()]+input().split())[1:],sep='\n')
    
    • ワンライナー($N$を活かす)
    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 個の文字列を出力(paizaラーニング)

    • 解答例(文字列結合)
    n=int(input())
    S=''
    for i in range(n):
        if i>0:
            S+=' '
        S+=input()
    print(S)
    
    • 解答例(文字列配列として受け取ってアンパック)
    n=int(input())
    S=['']*n
    for i in range(n):
        S[i]=input()
    print(*S)
    
    • 解答例(文字列リストとして受け取ってアンパック)
    n=int(input())
    S=[]
    for i in range(n):
        S.append(input())
    print(*S)
    
    • ワンライナー
    print(*[input() for i in range(int(input()))])
    

  • 二項演算
    • 問題
      2つの整数$A$, $B$が半角空白区切りで入力されます。$A+B$を出力してください。
    • 入力
      $A$ $B$
    • 出力
      $A+B$
    • 出典
      標準入力 2-1(アルゴ式)
      EX5 - A足すB問題(AtCoder)
      足し算(paizaラーニング)

    • 解答例
    a,b=map(int,input().split())
    print(a+b)
    
    • ワンライナー
    print(*[a+b for a,b in [map(int,input().split()) for _ in [0]]])
    
    • eval関数を使用
    print(eval('+'.join(input().split())))
    

    複数の演算結果を半角スペース区切りで出力する
    • 問題
      整数$A$, $B$が半角空白区切りで与えられます。$A$から$B$を引いた差$D$と$A$と$B$の積$P$を半角空白区切りで出力してください。
    • 入力
      $A$ $B$
    • 出力
      $D$ $P$
    • 出典
      引き算・掛け算(paizaラーニング)

    • 解答例
    a,b=map(int,input().split())
    d=a-b
    p=a*b
    print(d,p)
    
    • ワンライナー
    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$

    • 解答例
    a,b=map(int,input().split())
    print(a-b)
    print(a*b)
    
    • ワンライナー
    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(アルゴ式)

    • 解答例
    n=int(input())
    A=map(int,input().split())
    S=0
    for a in A:
        S+=a
    print(S)
    
    • ワンライナー
    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(アルゴ式)

    • 解答例
    n=int(input())
    A=map(int,input().split())
    S=0
    for a in A:
        S+=a
    avg=S//n
    print(avg)
    
    • ワンライナー
    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(アルゴ式)

    • 解答例
    n=int(input())
    A=map(int,input().split())
    P=1
    for a in A:
        P*=a
    print(P)
    
    • ワンライナー
    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関数を使う
    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(paizaラーニング)

    • 解答例
    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)
    
    • ワンライナー
    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転職の練習問題を一行で解く
    • 問題
      入力された整数がグレゴリオ暦閏年であるか判定するプログラムを書いてください。
      • 閏年判定の条件
        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
      と出力してください。

    • 解答例
    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")
    
    • ワンライナー
    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')
    
    • モジュールを使用する
    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$の財産を出力してください。
    • 出典
      辞書の基本(paizaラーニング)

    • 解答例
    n=int(input())
    d={}
    for i in range(n)
        s,a=input().split()
        d[s]=a #aをint型に変換する必要はない
    t=input()
    print(d[t])
    
    • ワンライナー
    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)(アルゴ式)

    • 解答例1
    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
    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])
    
    • ワンライナー
    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}$を出力してください。
    • 出典
      累積和(paizaラーニング)

    • 解答例1
    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
    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])
    
    • ワンライナー
    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)(アルゴ式)

    • 解答例1
    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
    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])
    
    • ワンライナー
    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}$を出力してください。
    • 出典
      区間和(paizaラーニング)

    • 解答例1
    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
    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])
    
    • ワンライナー
    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}$

    • 解答例
    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 ' ')
    
    • ワンライナー
    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")
    

    転置行列を出力するだけなら、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を出力してください。
    • 出典
      隣接リストの出力・無向グラフ(paizaラーニング)

    • 解答例
    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)
    
    • ワンライナー
    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でよかった
    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')
    

実務でやるとクライアント様から一行分の報酬しか頂けませんエラーの原因が見つけづらくなりますので、避けてください。
そもそもprint関数の引数にinput関数の返却値を直接渡すという、ある関数の返却値を別の関数の引数に直接渡すのは禁じ手ですし、全て

Traceback (most recent call last):
  File "Main.py", line 1, in <module>

のようにline 1で出力されてしまいます。
(ホンマに品質悪そうでお金払いたないわ~)
あくまでパズルとして楽しむ程度にお願いします。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?