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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1249閲覧

現在のコードのどこかに、不備があり、改善して、指定された出力を出したい。

M_Nishi

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/31 17:28

編集2020/11/01 04:04

すみません、dodoxさんの翻訳内容であっています。訂正します。
現在、ユーザーからランダムな整数入りのリストを取って、そレを一旦2進数に変換し、新しい10進数へと変換する、プログラムを作っています。例えば[11, 24] という リストの箱で受け取った場合は最終的に
424896という10進数に変換されて、出力されます。
受け取ったリストは最初に[11, 24] から [1011, 11000]と変換されます。

そちら1つずつの整数要素を連続させます。例えば 1は11に0は00になります。上の例だとこうなります。
[1011, 11000] → [11001111, 1111000000]
それから、要素が区切られている部分に0を挿入して要素を増やします。0の挿入は連続の作業が終了した後に行います。今は、2つの要素だけで行っていますが、要素数が1つの場合は0は挿入しません、
また 要素数3つや4つの場合などはその要素の前ごとに挿入します。最後の要素の後には0は挿入しません。

例[1100] (要素が1つの場合)
[1011,0 ,11110000, 0 ,100111100] (要素が3つある時)

上の[11,24]だとこうなります、[11001111, 0 , 1111000000]。そしてそれらを結合すると、[1100111101111000000]となります。
それを10進数に変換すると、424896となります。

ですが、私の書いたコードですと、[11, 24]の10進数の出力が 51230208 となり、
本来の 424896 と出力されません。解決方法が見当たらず、質問させて頂きました。
すみませんが、よろしくお願いします。

php:filename.php

1def encode(numbers): 2 numbers= ''.join(bin(e)[2: ] for e in the_input)#受けとったリストの中身を2真数へ 3 combination= '' #0が結合した後の空のstr 4 index = 0 5 doubled_numbers = []  6 for number in numbers: 7 double_number = '' 8 number_string_rep = str(number) #int to str  9 for letter in number_string_rep: 10 11 double_number = double_number + letter + letter #iterateしたletterを足して、2連続させる 12 doubled_numbers.append(double_number) #空のliistへappend 13 combination= "0".join(doubled_numbers) #0の結合。 14 return int(combination, 2) #0が結合された後の文字列を10進数へ変換 15input: [11, 24] 16out: 51230208 17#out should be 424896

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

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

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

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

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

toast-uz

2020/10/31 22:37

例がわかりません。 [10, 20, 30]はどこへ消えたのでしょうか? 2連続させる、という言葉の定義はなんでしょうか? どうして、[1011,11000] → [11001111, 1111000000] となるのか、法則が全くわかりません。
y_waiwai

2020/10/31 23:34

違う出力というのはどういう出力なんでしょうか。
dodox86

2020/10/31 23:54 編集

質問中の説明は少し分かりづらいようです。 > 例えば、[1011,11000] → [11001111, 1111000000] 「例えば」で唐突に取りあげた元の整数リストが分かりません。これは、[11, 24]を示したものですね? 10進数11の2進数表現は1011なので、このそれぞれの桁を同じ値で2つにする。それで 11001111 です。 更に「index」が2つ以上あったら」という表現も分かりづらく、読んだ者は悩みます。 これは「整数リストの要素が2つ以上あったら」と言うことで合っていますね? [11,24]のリストは2つあるので、"0"で結合します。 "11001111" + "0" + "11001111"で、"11001111011001111" ということなのだと思います。 また、質問文中にあげたPythonスクリプトは全角文字が混ざっていたり、未定義の変数を使っていたりでエラーになります。文中の誤字を含め、気をつかっていただけると閲覧者、回答者は助かります
hentaiman

2020/11/01 00:43

最初のコメントと同じで色々と意味不明だったんですが、dodoxさんの翻訳で合っているのなら質問文を修正してくださいね。
guest

回答3

0

既存の書き方から離れて、よさそうなコードをゼロから書いてみました。

  • 「連続させる」という独自の「演算pile()」を持つ2進数クラスMyBinaryを新規に作成
  • numbersの各要素を、順に、MyBinary型へ変換、pile()演算し、できた文字列リストを'0'で連結して数値に戻す
  • リストの各要素に同じ操作をするところはmap関数を活用

こういった独自演算を定義して繰り返し使うようなケースでは、クラスを作った方が、見通しが良くなります。

Python

1class MyBinary: 2 def __init__(self, num): 3 self.digit = f'{num:b}' 4 def __repr__(self): 5 return self.digit 6 def pile(self): 7 return ''.join([s*2 for s in self.digit]) 8 9numbers = [11, 24] 10result = int('0'.join(map(lambda x: MyBinary(x).pile(), numbers)), 2) 11print(result)

投稿2020/11/01 04:54

編集2020/11/01 04:58
toast-uz

総合スコア3266

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

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

toast-uz

2020/11/01 04:55

ちょっと遅かった泣
guest

0

ベストアンサー

現在のコードのどこかに、不備があり、改善して、指定された出力を出したい。

残念ですが、ご提示のもとのコードは色々と間違っています。要望どおりに動きにならない場合はprintを使うなどしてプログラムの途中で自分が意図したとおりに結果になっているかを確認しましょう。質問文中のコードを尊重し、添削(?)して修正したものが以下になります。要所でprintを使い、動作状況を確認しやすくしているつもりです。コメント部分も併せて読み、質問者さんのもとのコードとの違いを確認してみてください。

Python3

1# NG1: numbersを引数の名前にしている時点で間違いのはず。 2#def encode(numbers): 3def encode(the_input): 4 # NG2: ここでjoinしてはダメでしょう。元の数リストの区切りが分からなくなります。 5 #numbers= ''.join(bin(e)[2: ] for e in the_input) 6 numbers = [bin(e)[2: ] for e in the_input] 7 print('numbers={}'.format(numbers)) 8 combination = '' 9 10 # NG3: 使っていないのでいらない 11 # index = 0 12 doubled_numbers = [] 13 for number in numbers: 14 double_number = '' 15 number_string_rep = str(number) 16 for letter in number_string_rep: 17 double_number = double_number + letter + letter 18 # NG4: 2連続にするたびにappend()しているのでダメ 19 20 # NG5: ここは要素の区切りではないので、"0"でjoin()してはダメ 21 # doubled_numbers.append(double_number) 22 #combination= "0".join(doubled_numbers) 23 24 # ここで2連続にした2進数文字列をリストに追加 25 doubled_numbers.append(double_number) 26 print('doubled_numbers={}'.format(doubled_numbers)) 27 28 # 最後に"0"でjoin() 29 combination= "0".join(doubled_numbers) 30 print('combination={}'.format(combination)) 31 32 # 10進数値に変換 33 result = int(combination, 2) 34 return result 35 36#input: [11, 24] 37#out: should be 424896 38 39l = [11, 24] 40r = encode(l) 41print('result={}'.format(r)) 42

これを実行した結果です。

terminal

1$ python3 t1.py 2numbers=['1011', '11000'] 3doubled_numbers=['11001111'] 4doubled_numbers=['11001111', '1111000000'] 5combination=1100111101111000000 6result=424896 7

投稿2020/11/01 00:29

dodox86

総合スコア9256

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

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

M_Nishi

2020/11/01 04:51

dodox86様、お忙しい中コーディングの修正の方をありがとうございました。 コメントや出力を照らし合わせながら、実装の方に移りたいと思います。
dodox86

2020/11/01 05:16

Pythonの機能をフルに使えば恐らくもっと短く、効率的に書けると思いますが、最初はあまり難しいことをやらない方が良いです。まず頭で考えて、手で紙に書けるほどに具体的にやることをイメージできてから、実直にコードに書いていくことをお勧めします。Pythonを使うと魔法のようにやりたいことができるわけではないです。
guest

0

for文のインデントがいけないのかと思います。
やりたい事は以下のようなコードではないでしょうか。

py

1 for letter in number_string_rep: 2 double_number = double_number + letter + letter 3 4 doubled_numbers.append(double_number) 5 combination= "0".join(doubled_numbers)#0を代入し、結合

投稿2020/11/01 00:19

plasticgrammer

総合スコア629

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問