質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

166閲覧

python3で大小関係を考慮した順列の作り方

kuraudo

総合スコア137

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/13 01:03

編集2018/09/13 01:23

分からない事

以下のように例えば4個(2N個)の数字が与えられたとして
左側と右側、両方とも必ず数字を小さい順に並びかえたいときの方法が分かりません。

12 34 13 24 14 23 23 14 24 13 34 12

※追記
イメージとして以下の入出力を行いたいです

入力

2

出力

1234 1324 1423 2314 2413 3412

試したこと

itertools のドキュメントで使えそうなものがないか調べましたが上手く行かず。。。

どなたか教えてくださると幸いです!><

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こういうことでしょうか?

Python

1import sys 2 3data = [ 4 [int(e) for e in line.split()] 5 for line in map(str.rstrip, sys.stdin) 6] 7print(data) 8 9# 転置して 10data = [ 11 list(col) for col in zip(*data) 12] 13print(data) 14 15# ソートして 16data = [ 17 sorted(col) for col in data 18] 19print(data) 20 21# また転置 22data = [ 23 list(row) for row in zip(*data) 24] 25print(data)

実行結果 Wandbox

[[12, 34], [13, 24], [14, 23], [23, 14], [24, 13], [34, 12]] [[12, 13, 14, 23, 24, 34], [34, 24, 23, 14, 13, 12]] [[12, 13, 14, 23, 24, 34], [12, 13, 14, 23, 24, 34]] [[12, 12], [13, 13], [14, 14], [23, 23], [24, 24], [34, 34]]

コメントを受けて

あんまりクールなコードじゃないですが、いちおう。

Python

1from itertools import tee, permutations 2 3 4def is_already_sorted(iterable, *, key=lambda e: e): 5 it1, it2 = tee(iterable) 6 return all( 7 e1 == e2 for e1, e2 in zip(it1, sorted(it2, key=key)) 8 ) 9 10 11N = int(input()) 12assert 0 < 2*N < 10 13 14nums = list('123456789')[:2*N] 15 16dst = [] 17for e in permutations(nums, 2*N): 18 left, right = e[:N], e[N:] 19 20 if not is_already_sorted(left, key=int): 21 continue 22 if not is_already_sorted(right, key=int): 23 continue 24 25 dst.append(''.join(e)) 26 27 28print(*dst, sep='\n')

Wandbox

投稿2018/09/13 01:12

編集2018/09/13 01:54
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuraudo

2018/09/13 01:19 編集

あっ、、、 上手く伝えることが出来ず申し訳ございません。 自分が一番やりたい事としては N = 2 と受け取った際に [[1, 2], [3, 4]] [[1, 3], [2, 4]] [[1, 4], [2, 3]] ... [[3, 4], [1, 2]] と出力することです..!!
LouiS0616

2018/09/13 01:28

左側n桁、右側n桁の数字列がそれぞれ昇順となるように、 1~2nまでの数字を一回ずつ使って作れる数字列を列挙するってことですね。
kuraudo

2018/09/13 01:31

はい! 全くその通りです。。!
LouiS0616

2018/09/13 01:46

追記しました。 枝切をしていないので計算量は多いですが、暗黙にN<5であることを考えるとそこまで影響は出ないと思います。
kuraudo

2018/09/13 01:49

ありがとうございました゚(゚`ω´ ゚)゚ 噛み締めて読ませて頂きますm(*_ _)m
guest

0

概要
・入力例n=3から123456を生成
・123456で作れる全てのパターンを再帰処理で生成
・条件判定OKのものだけリストへ追加
・最後に出力

javaなのであまり参考にならないかもしれません。
n=2,n=3での結果は問題無いはずです。

###出力結果n=3
出力結果n=3

java

1import java.util.LinkedHashSet; 2import java.util.Set; 3 4public class memo_qa146314 { 5 6 public static void main(String[] args) { 7 8 Set<Integer> set = new LinkedHashSet<Integer>(); 9 10 //入力省略 11 int input = 3; 12 13 String str = ""; 14 for (int i = 0; i < input * 2; i++) { 15 str += Integer.toString(i + 1); 16 } 17 set = permutation(str, "", set); 18 for (int i : set) { 19 System.out.println(i); 20 } 21 } 22 23 public static Set permutation(String q, String ans, Set<Integer> set) { 24 if (q.length() == 0) { 25 26 if (chk(ans)) { 27 set.add(Integer.parseInt(ans)); 28 } 29 return set; 30 } else { 31 for (int i = 0; i < q.length(); i++) { 32 permutation(q.substring(0, i) + q.substring(i + 1), 33 ans + q.charAt(i), set); 34 } 35 } 36 return set; 37 } 38 39 private static boolean chk(String ans) { 40 41 boolean result = true; 42 43 String[] h = new String[2]; 44 h[0] = (ans.substring(0, ans.length() / 2)); 45 h[1] = (ans.substring(ans.length() / 2)); 46 47 int a = 0; 48 int b = 0; 49 50 for (int i = 0; i < 2; i++) { 51 for (int j = 0; j < h[i].length() - 1; j++) { 52 53 a = Integer.parseInt(h[i].substring(j, j + 1)); 54 b = Integer.parseInt(h[i].substring(j + 1, j + 2)); 55 56 if (a > b) { 57 58 return false; 59 } 60 } 61 } 62 return true; 63 } 64}

投稿2018/09/13 02:43

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問