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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

5515閲覧

「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目

sho_cs

総合スコア3541

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

18クリップ

投稿2015/05/19 09:09

編集2015/05/20 02:35

「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」を挑戦してみましたか?
Five programming problems every Software Engineer should be able to solve in less than 1 hour
1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に

5問目は少しタイムアップしてしまいましたが、いい頭の体操になり楽しめました。

皆さんの解答や感想を教えて下さい。

lang

1static void Main(string[] args) 2{ 3 var dt = new DataTable(); 4 // 演算子の組み合わせを列挙 5 Enumerable.Repeat(new[] { " ", "-", "+" }, 9).Aggregate(Enumerable.Repeat("", 1) 6 , (a, ca) => from s in a from c in ca select s + c).Select(x => x + " ") 7 // 1..9と組み合わせ 8 .Select(p => string.Concat(Enumerable.Range(1, 9) 9 .Select(x => "" + p[x - 1] + x)).Replace(" ", "")) 10 // 先頭が"+"は" "と同じなのでストップ & 計算結果が100のもののみ列挙 11 .TakeWhile(x => !x.StartsWith("+")).Where(x => (int)dt.Compute(x, "") == 100) 12 .ToList().ForEach(x => Console.WriteLine(x + "=100")); 13 Console.ReadKey(); 14}

出力結果

123-45-67+89=100 123-4-5-6-7+8-9=100 123+45-67+8-9=100 123+4-5+67-89=100 12-3-4+5-6+7+89=100 12+3-4+5+67+8+9=100 12+3+4+5-6-7+89=100 1+23-4+56+7+8+9=100 1+23-4+5+6+78-9=100 1+2+34-5+67-8+9=100 1+2+3-4+5+6+78+9=100 -1+2-3+4+5+6+78+9=100

ちょっと変更

  • Compute使わない
  • 1..9の配列使わない

lang

1static void Main(string[] args) 2{ 3 Enumerable.Repeat(new[] { " ", "-", "+" }, 9).Aggregate(Enumerable.Repeat("", 1) 4 , (a, ca) => from s in a from c in ca select s + c) 5 .Select(p => string.Concat(p.Select((x, i) => "" + x + (i + 1))).Replace(" ", "")) 6 .TakeWhile(x => !x.StartsWith("+")) 7 .Select(x => x.Replace("-", "@-").Replace("+", "@+").Split('@').Where(y => y != "")) 8 .Where(x => x.Select(int.Parse).Sum() == 100) 9 .ToList().ForEach(x => Console.WriteLine(string.Concat(x) + "=100")); 10 Console.ReadKey(); 11}

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

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

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

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

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

guest

回答4

0

ベストアンサー

なるほど^^。あくまでも個人的な主観ですので、反論はご遠慮下さい。

言語の基本は、変数、条件、配列、ループ、関数、の5つだと思ってまして、この問題は、これを駆使する基本的な問題で、良いと思います。

この問題は、野球で言うなら、「スピードガン対決」「ホームラン競争」のような類に、私は受け取ってしまいます。

こうした基本的なことプラス、試合では流れをつかんで応用していく読みと人間性、世情などを含んだ社会性も、求められる部分が多いと思っています。ソフトエンジニアも同じかなあ、、と。。

私は常に試合をしていますので、あとで時間があったら、やってみます。

投稿2015/05/19 09:27

編集2015/05/19 09:30
SaintKnowledge

総合スコア368

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

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

sho_cs

2015/05/20 01:43

確かにある面だけで「解けなければいけない」、「プログラマ失格」はちょっと違いますね。
guest

0

ruby で書いてみました。

lang

1NUMS = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 2['', '-', '+'].repeated_permutation(8).each do |ops| 3 exp = '' 4 ops.each_with_index do |op, i| 5 exp += NUMS[i] + op 6 end 7 exp += NUMS[8] 8 p exp if eval(exp) == 100 9end

eval を使うのは反則かもしれませんが。
実行結果:

"123-45-67+89" "123-4-5-6-7+8-9" "123+45-67+8-9" "123+4-5+67-89" "12-3-4+5-6+7+89" "12+3-4+5+67+8+9" "12+3+4+5-6-7+89" "1+23-4+56+7+8+9" "1+23-4+5+6+78-9" "1+2+34-5+67-8+9" "1+2+3-4+5+6+78+9"

投稿2015/05/19 13:52

katoy

総合スコア22324

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

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

sho_cs

2015/05/20 01:55

3人連続Ruby!!! 人気ですね~
moke

2017/02/17 02:42

rubyエンジニアならば10分以内に解けなければいけない5つの問題ですね
guest

0

Java縛りじゃ無いですよね?

lang

1NUM=(1..9).to_a 2OP=["+","-",""] 3 4OP.repeated_permutation(8).each do |ops| 5 expr = NUM.zip(ops).join 6 puts expr if eval(expr)==100 7end

evalはずるいか。

lang

1NUM=(1..9).to_a 2OP=["+","-",""] 3 4OP.repeated_permutation(8).each do |ops| 5 expr = NUM.zip(ops).flatten 6 ans = 0 7 term = 0 8 op = "+" 9 expr.each do |x| 10 case x 11 when Fixnum 12 term = term*10+x 13 when "+","-",nil 14 ans = ans.__send__(op,term) if op 15 term = 0 16 op = x 17 end 18 end 19 puts expr.join if ans==100 20end

条件分岐すれば、_send_も排除できます。

追記:地の文で_send_と書くと、send と斜体にになってしまったので、修正。_もだめなので全角下線で。
ついでにちょっと修正。最初の解ではflatten要らなかった。

投稿2015/05/19 13:41

編集2015/05/19 14:07
otn

総合スコア84423

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

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

sho_cs

2015/05/20 01:51

言語縛りなしです。 この手の問題でevalは使っちゃいますよね。
guest

0

すべて解くのに1時間半、投稿するためのコードの整形に30分かかりました。
時間内に解けなくて悔しいです。

lang

1def sum(array) 2 array.reduce{|m, n| m + n} 3end 4 5def cross_concat(arr1, arr2) 6 result = [] 7 i = 0 8 loop do 9 break if i == arr1.length 10 result.push(arr1[i]) 11 break if i == arr2.length 12 result.push(arr2[i]) 13 i += 1 14 end 15 return result 16end 17 18def create_sum9_array 19 memo = [] 20 result = [] 21 22 rec = lambda do 23 for i in 1..9 24 memo.push(i) 25 if sum(memo) < 9 26 rec.call 27 elsif sum(memo) == 9 28 result.push(memo.select{true}) 29 end 30 memo.pop 31 end 32 end 33 34 rec.call 35 return result 36end 37 38def splits_123456789 39 result = [] 40 41 array = create_sum9_array 42 43 while arr = array.shift 44 temp = [] 45 start = 0 46 while number = arr.shift 47 temp << "123456789".slice(start, number).to_i 48 start += number 49 end 50 result.push(temp.select{true}) 51 end 52 53 return result 54end 55 56def puts_sum100_arrays 57 src = splits_123456789 58 59 rec = lambda do |arr, index = 0, signs = []| 60 if index == 0 61 rec.call(arr, index + 1) 62 elsif arr[index] 63 rec.call(arr, index + 1, signs + ["+"]) 64 rec.call(arr, index + 1, signs + ["-"]) 65 else 66 express = cross_concat(arr, signs).join(" ") 67 if eval(express) == 100 68 puts express + " = 100" 69 end 70 end 71 end 72 73 src.each do |array| 74 rec.call(array) 75 end 76end 77 78puts_sum100_arrays

解いていて気付いたんですが、問5を解くために問1や問2で作った関数が使えるんですよね。
問題を作った人はそこまで考えて作ったのかな?

それにしても、14行で問5を解けるものなんですね(・o・;)
主さんのコードを参考にちょっと頑張ってみます。

投稿2015/05/19 13:37

編集2015/05/19 13:40
penguinshunya

総合スコア140

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

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

sho_cs

2015/05/20 02:45

問題の流れは考えて作られていると思います。 関数の再利用を考えて制限時間1時間なのかもしれませんね。 私も最初書き始めた時は結構長くなってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問