プログラミングのお題スレ Part18

■ このスレッドは過去ログ倉庫に格納されています
2020/07/14(火) 13:53:46.47ID:jW5p6F/e
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
  お題:お題本文

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文
  結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part17
https://mevius.5ch.net/test/read.cgi/tech/1584031367/
149デフォルトの名無しさん
垢版 |
2020/07/26(日) 11:42:26.03ID:467XWCJo
>>138
ランダムは副作用なので、ちと面倒臭い。
(厳密には擬似乱数を作る為の種(newStdGen)だけが副作用)

Haskell

import System.Random

main = f 10 >>= print

f :: Int -> IO [Int]
f n = newStdGen >>= return.filter even.take n.randomRs (1,100)

実行結果

[56,70,100]

型指定しないと型推論が働かない。
(生成される乱数が整数とは限らない為)

戻り値は型で分かる通り、普通のリストでは無くIOなリスト。
newStdGenを使っているので、IOな値を返さないといけない。
(printもIO ()を返すのでreturnをprintに置き換えて直接出力も可能ではある)

randomRs (1,100) で1から100までの乱数の無限リストを生成。
後はtakeで無限リストから任意の個数を取り出してfilterするだけ。
(takeとfilterは順番が逆だと乱数の無限リストから偶数を任意の個数取り出すので問題の意図と違ってしまう)

問題が「出力しろ」では無く「抜き出せ」なので、あえてprintは関数の外に置いた。
2020/07/26(日) 11:54:08.47ID:arqbmdN/
Haskellのコード見たいと思ってた
2020/07/26(日) 11:55:36.48ID:Lwmxod4b
流行らなかった訳が分かった
152デフォルトの名無しさん
垢版 |
2020/07/26(日) 12:16:01.64ID:yLhsD6tn
>>151
まあね。
安全なコードを書き易いと取るか、面倒くさいと取るかやね。
153デフォルトの名無しさん
垢版 |
2020/07/26(日) 12:31:12.02ID:XQciIU0B
お題
2つの文字列の差を[]で囲って出力してください

例1
入力:abc adc
出力:a[b]c

例2
入力:abc acd
出力:a[bc]

例3
入力:abc bcc
出力:[ab]c
154デフォルトの名無しさん
垢版 |
2020/07/26(日) 15:30:12.41ID:yLhsD6tn
>>153

Haskell

一応、長さが違う場合、短い方に合わせる様にしてみた。
テストし切れてないかもなので、バグに気付いたら教えて下しあ。

main = putStrLn $ g "abcdefrh" "acdgefggn"

f False [] _ =[]
f False _ [] =[]
f True [] _ = "]":[]
f True _ [] = "]":[]
f flg (x:xs) (y:ys) | flg == True && x == y = ("]" ++ [x]):f False xs ys
f flg (x:xs) (y:ys) | x == y = [x]:f False xs ys
f flg (x:xs) (y:ys) | flg == False = ("[" ++ [x]):f True xs ys
f flg (x:xs) (y:ys) | flg == True = [x]:f flg xs ys

g xs = concat.f False xs

実行結果

"a[bcd]ef[rh]"
155デフォルトの名無しさん
垢版 |
2020/07/26(日) 17:41:12.51ID:1PJx+gwa
やっぱフラグしかないのか?
2020/07/26(日) 19:21:26.42ID:+ODzYEeD
>>153 Ruby
def resolve( s )
f = true
ss = s.split.map{|w| w.chars }
ss[0].zip( ss[1] ).inject(''){|r, (c,d)|
r << ( (f)? '[': ']' ) if (c == d) != f
f = c == d
r << c
} + ((f)? '' : ']')
end

[ "abc adc", "abc acd", "abc bcc" ].each{|s|
puts "入力:#{s}"
puts "出力:#{resolve( s )}\n\n"
}
157デフォルトの名無しさん
垢版 |
2020/07/26(日) 23:12:10.92ID:3QUkzPB/
>>155

確かこんなのあったな〜・・・と、inword/outword関数の相互再帰で書いてみた。

Haskell

main = (putStrLn.f "abcdefrt") "acdgefgg"

f xs ys | g xs ys =[]
f (x:xs) (y:ys) | x == y = outword (x:xs) (y:ys)
f xs ys = inword xs ys

inword xs ys | g xs ys = ']':[]
inword (x:xs) (y:ys) | x == y = ']':x:outword xs ys
inword (x:xs) (_:ys) = x:inword xs ys

outword xs ys | g xs ys = []
outword (x:xs) (y:ys) | x == y = x:outword xs ys
outword (x:xs) (_:ys) = '[':x:inword xs ys

g xs ys = or [null xs, null ys]
158デフォルトの名無しさん
垢版 |
2020/07/29(水) 09:26:50.38ID:yJ6wpcWu
お題1
じゃんけんを実装してください
1 = ぐー
2 = ちょき
3 = ぱー

入力: 1
出力: あなた=ぐー コンピュータ=ちょき あなたの勝ちです

お題2
あなたの勝率を指定できるようにしてください
勝率は0.0〜1.0で入力します

入力: 1 0.7
出力: あなた=ぐー コンピュータ=ちょき あなたの勝ちです
2020/07/29(水) 22:59:47.88ID:tovqwAmw
>>158 Ruby

JANKEN = %w[Goo Chocky Parr]
KEKKA = %w[Win Lose Draw]

#お題1
odai1 = -> n do
    r = rand(3)
    'You: %s, Com: %s. %s' % [JANKEN[n - 1], JANKEN[(n + r) % 3], KEKKA[r]]
end

puts odai1[1] # => You: Goo, Com: Chocky. Win
puts odai1[2] # => You: Chocky, Com: Goo. Lose
puts odai1[3] # => You: Par, Com: Par. Draw

#お題2
odai2 = -> (n, p) do
    r = rand < p ? 0 : rand(2) + 1
    'You: %s, Com: %s. %s' % [JANKEN[n - 1], JANKEN[(n + r) % 3], KEKKA[r]]
end

puts odai2[1, 0] # => You: Goo, Com: Par. Lose
puts odai2[2, 1] # => You: Goo, Com: Chocky. Win
puts odai2[3, 0.3] # => You: Par, Com: Chocky. Lose
puts odai2[3, 0.3] # => You: Par, Com: Goo. Win
puts odai2[3, 0.3] # => You: Par, Com: Par. Draw
puts odai2[3, 0.3] # => You: Par, Com: Chocky. Lose
2020/07/29(水) 23:09:16.98ID:tovqwAmw
下から5行目タイポ
puts odai2[2, 1] # => You: Chocky, Com: Parr. Win
2020/07/29(水) 23:11:53.00ID:z6Fnx3oM
Parr
出たか連続校正レス君
2020/07/29(水) 23:15:30.50ID:zhbinuHB
別にええやろ
2020/07/29(水) 23:42:09.78ID:hGtKVe2E
子ども国会で、グー、チョキ、パーのつづりを次のように閣議決定しました。

グーはgoo、
チョキはchoki、
パーはpar、
ジャンケンはJankenとする。
2020/07/30(木) 00:20:11.92ID:aEaasmNp
Unicode の \u270A \u270B \u270C
2020/07/30(木) 15:16:52.35ID:cH8Va6i2
自然数AとBがあります
A * B ではない方法で、AとBを掛けた結果を求めなさい。
ただし、AとBは4バイトの数値型で、どのような値が入ってきても
実施してからなるべく近い時間で計算終了する方が高得点とします。
2020/07/30(木) 15:58:10.10ID:aEaasmNp
>>165 Ruby
def multiply( a, b )
ans = 0
while a > 0
ans += b if a.odd?
a >>= 1
b <<= 1
end
ans
end

multiply( 0x12345678, 0x87654321 ) #=> 693779765864729976
2020/08/01(土) 20:01:40.49ID:eF75V+Af
>>165

import Math;

int kakezan(a, b) {
int min, max = Math.sort([a, b]);
if(min == 0) return 0;
return Math.square(min) + kakezan(min, max - min);
}

printf(kakezan(0x12345678, 0x87654321)); // 693779765864729976
2020/08/01(土) 21:52:47.76ID:xRTQ61eG
>>165
function mul(a, b) {
let prod = 0;
const unit = Math.sign(a) + Math.sign(b) ? 1 : -1;
for (let i = 0; i < Math.abs(a); i++)
for (let j = 0; j < Math.abs(b); j++)
prod += unit;
return prod;
}
console.log(mul(-6, -7)); //=> 42
console.log(mul(-6, 7)); //=> -42

低得点ww
2020/08/04(火) 03:43:27.41ID:DYgISIVe
お題: 文字列の格納された配列から重複した文字列を削除し昇順にソートせよ

['apple', 'banana', 'apple', 'chikuwa']

['apple', 'banana', 'chikuwa']
2020/08/04(火) 03:55:23.60ID:gT//RRjC
>>169 Ruby
['apple', 'banana', 'apple', 'chikuwa'].uniq.sort #=> ["apple", "banana", "chikuwa"]
171デフォルトの名無しさん
垢版 |
2020/08/04(火) 05:05:40.50ID:YeoxtHaI
>>153 Ruby

def resolve( str )
res = String.new # 戻り値
flag = false # [ だけを付けて、まだ ] で閉じていない状態が、true
ary = str.split # 空白で、2つに分離する

ary[ 0 ].chars.zip( ary[ 1 ].chars ) do |c0, c1| # 1文字ずつ比較する
if c0 == c1
if flag
res = res + ']' + c0
flag = false
else
res += c0
end

else
if flag
res += c0
else
res = res + '[' + c0
flag = true
end
end
end
res += ']' if flag # もし閉じていない場合は、閉じる
res
end

[ "abc adc", "abc acd", "abc bcc" ].each{ |str|
print "入力: #{ str }\n" + "出力: #{ resolve( str ) }\n\n"
}
172デフォルトの名無しさん
垢版 |
2020/08/04(火) 18:06:57.21ID:Bm48LwqI
>>169
Kotlin または Kotlin script でのやり方

a が Array<String> または List<String> でそこに元の文字列が入っているとすると。

val b = a.toSortedSet()

でbに重複削除されてソートされたSetができる。
これを List<String> にしたい場合はこうする。

val c = b.toList()
173デフォルトの名無しさん
垢版 |
2020/08/04(火) 18:45:38.06ID:lImhU2CT
>>165 チューリングマシン(Python3)
#チューリングマシン本体(不受理の場合例外が発生する)
def turingMachine(tape, state_function, current_state, final_state):
i=0
n = len(tape)
while i < n:
sf = state_function[current_state]
symbol = tape[i] if i >= 0 else None
(current_state, rsymbol, is_right) = sf[symbol]
if i >= 0:
tape[i] = rsymbol
if current_state == final_state:
return True
i += 1 if is_right else -1
return False

def TmMul(a, b):
#1000000の箇所はメモリ容量に合わせて適当に増やす
tape = ["0"] * a + ["1"] + ["0"] * b + ["1"] + [None] * 1000000
trans = [{"0":(6, None, True)},
{"0":(2, "X", True), "1":(4, "1", False)},
{"0":(2, "0", True), "1":(2, "1", True), None:(3, "0", False)},
{"0":(3, "0", False), "1":(3, "1", False), "X":(1, "X", True)},
{"X":(4, "0", False), "1":(5, "1", True)},
{"0":(5, "0", False), "1":(7, "1", False)},
{"0":(6, "0", True), "1":(1, "1", True)},
{"0":(8, "0", False), None:(7, None, True), "1":(9, None, True)},
{"0":(8, "0", False), None:(0, None, True)},
{"0":(9, None, True), "1":(10, None, True)}]
turingMachine(tape, trans, 0, 10)
return len(list(filter(lambda x: x != None, tape)))
print(TmMul(3, 8)) #=>24
174デフォルトの名無しさん
垢版 |
2020/08/04(火) 19:24:17.96ID:lImhU2CT
>>173
あーアホだったw
タブ消去の仕様だとPythonだと分けわからんことになるなw
↓貼り直した
http://codepad.org/BWRzr8fW
※会員未登録の為、一定期間後に自動消去
2020/08/04(火) 20:26:47.42ID:BW/Lg1/b
>>166
この魔法が気になる
2020/08/04(火) 20:33:41.16ID:pnjegpbT
>>175
奇数ならば最下位ビットが1であることを利用している。
177デフォルトの名無しさん
垢版 |
2020/08/04(火) 20:43:45.04ID:ZgraBKAX
筆算じゃないの

101 b
110 a (+
---------
0
1010
10100
---------
11110
2020/08/04(火) 20:47:15.02ID:pnjegpbT
お題: 総務省統計局の1990〜2019年までの人口データを使用して2020〜2024年の日本の人口の推計値を求めよ。人口データ以外は使用しないものとする。
2020/08/04(火) 21:14:16.49ID:pnjegpbT
これは電子政府の使い勝手のテストである。だれも解けないなら、電子データは活かされていないと判断する。
2020/08/04(火) 21:16:21.27ID:02jYvMNw
>>175
aの偶奇によって↓の計算してaがちっちゃくなったら終わりってしてるだけだぞ

(2a' + 1)b = b + a' * (2b)
(2a') * b = a' * (2b)
181デフォルトの名無しさん
垢版 |
2020/08/04(火) 21:26:04.52ID:lImhU2CT
チューリングマシンを使って重くて複雑な乗算を再現して何の意味があるのかと思ってそうだな
ポイントは文法の中に演算を組み込める点
実社会に役に立つ具体的な例を挙げろと言われれば直ぐには思いつかないが、オートマトンの入力は文字列だけとは限らないぞ
有限木オートマトン使って静的コード解析なのか最適化なのかは分からんが、開発言語の構文木に何らかの演算が伴うルールを適用したいこともあるかもしれない
「そんなのプログラミングすればいいだけだろ」と言う声が聞こえてきそうだがそれは極論「正規表現など要らん」と言ってるのと同じだと思う
以上でもって「全てのプログラマはオートマトンとチューリングマシンをよく勉強するべき」とする俺の主張の正当性は認められる
ちなみに俺は10年以上機械学習の勉強をしたのに画期的な成果が出せなかった後悔の思いがあるから言っている
2020/08/04(火) 21:58:22.27ID:JHqDXk92
お題を出して解くスレで電子データは活かされていないとかどうでもいいんですが…
なんでそうやっていつもスレ趣旨からずれようとするのか?
ズレたいならよそでやってくれ
2020/08/04(火) 22:11:15.82ID:02jYvMNw
片山博文MZ◆NveQN6OtcI
184デフォルトの名無しさん
垢版 |
2020/08/04(火) 23:36:46.28ID:L0dS0CTZ
お題
両替をしてください
貨幣は次の文字列で表されます
1円 = (1)
5円 = (5)
10円 = (10)
50円 = (50)
100円 = (100)
500円 = (500)


入力: (1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)
出力: (10)(10)(1)(1)(1)(1)

入力: (5)(50)(5)(1)(50)(5)(10)(1)(50)(1)(10)(10)
出力: (100)(50)(10)(10)(10)(10)(5)(1)(1)(1)
2020/08/05(水) 00:05:23.10ID:DlE2lfwB
書きたいけど寝たい
186デフォルトの名無しさん
垢版 |
2020/08/05(水) 02:29:32.18ID:prJIGLTT
>>175
aが2とか4だったらどうなるかを紙にでも書いて考えればいずれわかると思う。
2020/08/05(水) 02:55:46.54ID:wv4r4oF2
>>184 Ruby
def change( coin )
sum = coin.split(/[^\d]+/)[1..].inject(0){|r,c| r + c.to_i }
ret = ''
[500,100,50,10,5,1].each{|c|
next unless sum >= c
r, sum = sum.divmod( c )
ret << "(#{c})" * r
}
ret
end

[ '(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)',
'(5)(50)(5)(1)(50)(5)(10)(1)(50)(1)(10)(10)' ].each{|coin|
puts "入力: #{coin}"
puts "出力: #{change( coin ) }\n\n"
}
188デフォルトの名無しさん
垢版 |
2020/08/05(水) 11:37:38.85ID:kVNaCqIg
File "C:\Users\NEC-PCuser\.spyder-py3\temp.py", line 23, in <module>
my_data = genfromtxt('SingleECG.csv')

File "C:\Users\NEC-PCuser\anaconda3\lib\site-packages\numpy\lib\npyio.py", line 1772, in genfromtxt
fid = np.lib._datasource.open(fname, 'rt', encoding=encoding)

File "C:\Users\NEC-PCuser\anaconda3\lib\site-packages\numpy\lib\_datasource.py", line 269, in open
return ds.open(path, mode, encoding=encoding, newline=newline)

File "C:\Users\NEC-PCuser\anaconda3\lib\site-packages\numpy\lib\_datasource.py", line 623, in open
raise IOError("%s not found." % path)

グラフをプロットしたらこのエラーが出ました。対処法を教えてください
2020/08/05(水) 12:05:51.48ID:DlE2lfwB
斬新なお題だなNEC-PCuserさん
190デフォルトの名無しさん
垢版 |
2020/08/05(水) 12:16:18.65ID:IZQzbQjk
>>188<対処法を教えるお題
一行目と最後の行IOError("%s not found." % path) から
File "C:\Users\NEC-PCuser\.spyder-py3\temp.py"
のパスが間違えていると思われるので
temp.pyを添付するか確認するように進言します
191デフォルトの名無しさん
垢版 |
2020/08/05(水) 14:35:10.99ID:xKYyZvTf
心電図装置に繋がってるデバイスが機能停止したんだろ
2020/08/05(水) 15:30:05.18ID:prJIGLTT
>>184
Kotlin
https://paiza.io/projects/cVm9G2FkQCosaGf9_fQz-Q

最初は割り算したり余り出したりしてやろうと思ったんだけど、よく考えたらこの場合はその計算は無駄な感じがしたので合計から引けたらその貨幣を出すのを繰り返すようにした。
193デフォルトの名無しさん
垢版 |
2020/08/05(水) 16:44:00.29ID:73CDpa/5
ふむ。コイン切れの対処もし易いな。
2020/08/05(水) 17:59:02.96ID:TWR5sasY
お題: コイにえさをやるプログラム「feed」がある。一時間ごとにfeedを実行するプログラムを書け。ただし、ビジーウェイトはしてはならない。

ダミーのfeedは、次のようなプログラムとする:

- 現在日時と「えさをやりました。」を出力する。
2020/08/05(水) 18:08:26.66ID:UZ8wPONY
>>194 C++/Win32
#include <windows.h>
int main(void) {
for (;;) {
Sleep(60 * 60 * 1000);
ShellExecuteA(NULL, NULL, "feed.exe", NULL, NULL, SW_SHOWNORMAL);
}
}

// feed.cpp
#include <windows.h>
#include <stdio.h>
int main(void)
{
SYSTEMTIME st;
GetLocalTime(&st);
printf("%04d.%02d.%02d %02d:%02d:%02d えさをやりました。\n",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
196デフォルトの名無しさん
垢版 |
2020/08/05(水) 19:40:23.44ID:VitQNdTl
は、はやい・・・
2020/08/05(水) 20:19:52.45ID:wv4r4oF2
>>194 Ruby (Windows)
# feed_ignition.rb
loop do
system( 'start "" feed.rb' )
sleep 60*60
end

# feed.rb
puts "#{Time.new.strftime('%Y/%m/%d %T')} えさをやりました。"
sleep 3 # 表示確認用
198デフォルトの名無しさん
垢版 |
2020/08/05(水) 23:41:13.11ID:prJIGLTT
>>194
Linux 等の UNIX系OS だったら普通なら crond が動いているので crontab 設定すると楽だ。
(Windows の場合はタスクの設定で似たような事ができる)。

例えばこのようにすると毎時0分に feed コマンドが実行される。

0 * * * * feed

ただ問題はこのままだと標準出力がリダイレクトされていないのでその出力がcrondからメールで送られて来る事になる。
(見たい場合は mail コマンドを使って見る)。


コマンドラインから直接やるとしたら watch コマンドというのもある。これは実行するたびに出力が変化する
ようなコマンドを定期的に動かしてその出力を画面上に表示するためのコマンドだが毎回出力が同じでも
あるいは何も出力しなかったとしても問題はない。1時間ごとに動かすならこうなる。

watch -n 3600 feed

もっと単純にシェルでループさせて実現する方法もある。(これだとようやっとプログラムっぽい見た目になる)

sh -c 'while : ; do feed ; sleep 3600 ; done'


feed コマンドについてはシェルスクリプトなら例えばこうしておけば良い。

#!/bin/sh
echo 'えさをやりました。'
2020/08/05(水) 23:51:48.40ID:prJIGLTT
>>198はfeedで現在の日付を出すのを忘れた。

日付付けるなら例えばこうする。

#!/bin/sh
echo `date` 'えさをやりました。'

date コマンドに任せてしまってこんな風にもできる。(日時は YYYY-MM-DD hh:mm:ss の形式で出る)。

#!/bin/sh
date '+%F %T えさをやりました。'
2020/08/06(木) 18:50:53.87ID:mzjhTFla
お題: 現実世界でコイにえさをやるプログラム。

できるのか?
201デフォルトの名無しさん
垢版 |
2020/08/06(木) 19:02:17.87ID:nx4HEXSE
>>200
始めからPLCのプログラム限定って書け>>194
2020/08/06(木) 19:06:41.72ID:cHZDAcP7
>>200
プログラムそのものは出力装置に繋がるビットをONにするとかを定期的にやれば良いだけなのでは?
で、ONになったらリレーで餌やり器のスイッチが入ってウイーンとかいって餌が一定量水槽に入る。

ていうか、全部ハードウェアだけででできないか?タイマーICってあったよね確か。
2020/08/06(木) 19:21:15.27ID:mzjhTFla
ハードウェアだとソフトウェア制御できない。成長を細かく制御したい。
普通のPCから安価で制御する方法はないのだろうか。
ニシキゴイを20匹ほど飼いたいのだが。
204デフォルトの名無しさん
垢版 |
2020/08/06(木) 19:23:23.77ID:nx4HEXSE
>>203
ピ・タ・ゴ・ラ・スイッチ
2020/08/06(木) 19:37:26.52ID:/QKQvkvR
なぜ何度ツッコまれてもスレタイからずれようとするんですか?
学習できないんですか?
2020/08/06(木) 19:46:21.15ID:mzjhTFla
>>205
ハードにも興味を持ってくれるといいな、と思って企画しました by 突撃商会
2020/08/06(木) 19:58:03.18ID:AWtnj9QL
CDトレイを開閉するソフトを作りそれで餌やり器のボタンを押せ
2020/08/06(木) 20:01:30.80ID:mzjhTFla
>>207
正解。次のお題お願いします。
209デフォルトの名無しさん
垢版 |
2020/08/06(木) 20:18:11.34ID:nx4HEXSE
【お題】正解にたどり着くようにアシストした得点を算出するプログラムを作れ
スケールは1点以上100点未満とする
2020/08/06(木) 20:28:14.67ID:mzjhTFla
>>209
それは人間しかできないんで内科医?
2020/08/06(木) 20:37:37.85ID:sjF+gr/I
クソコテ死ねよマジで
2020/08/06(木) 20:53:50.09ID:O/aURmUk
>>203
その手の目的には Raspberry Pi がおすすめです
最近流行っているから多くのノウハウが容易に見つかりますよ
2020/08/06(木) 21:07:24.02ID:mzjhTFla
>>212
ありがとうございます。使えそうなハードでかなりお買い得ですね。

三菱やパナソニックは、、、破壊的イノベーションができない連中か。。。
2020/08/06(木) 21:16:15.64ID:mzjhTFla
IchigoJamというのもあるみたい。
2020/08/06(木) 21:29:05.63ID:8sSWlLgK
スレチ
◆QZaw55cn4c はうせろ
2020/08/06(木) 22:26:16.70ID:L4WiFaHt
>>215
突然、どうしたのですか?
2020/08/06(木) 22:38:17.00ID:8sSWlLgK
>>216
呼んでねえよハゲ消えろ
2020/08/06(木) 23:02:55.51ID:mzjhTFla
お題: 点結びパズルという簡単なパズルがある。紙の上にたくさんの点があり、それぞれの点の近くに番号が書かれていて、
番号の順に点を結べば、図案が浮かび上がるというものだ。
以下の手順に従ってモノクロPNG画像(300dpi前後)として与えられた点結びパズルを自動的に解くプログラムを作れ。画像処理。

(1) OCR技術や深層学習などにより、画像上の一文字が2mm以上6mm以下のアラビア数字(複数)を読み取り、数字の位置と数字の対を返す関数を作れ。数字の30度以上の回転は考える必要はない。
(2) 点結びパズルの点は直径0.5mm以上3mm以下の黒い丸い点だと仮定して、点と数字を関連付けるアルゴリズムを考案せよ。
ただし、数字に近い点が複数ある場合は「スマートに」割り振ること。
(3) 画像に実際に線分を描画して点結びパズルを回答するプログラムを作れ。
点と数字以外の枠線やタイトルなどは印刷されていないと仮定してもよい。
2020/08/07(金) 00:08:41.77ID:TzYKRTqH
よく、ラズパイコンテストでやってる

水槽の中の金魚に、エサをやる装置とか
2020/08/07(金) 11:29:33.41ID:uQ4nbdFf
債務が多い
221デフォルトの名無しさん
垢版 |
2020/08/07(金) 12:51:36.49ID:lb7vo/Jy
お題
文字列を大文字小文字を区別せずにソートして()でグルーピングしてください

入力: D a B c d c C A E c e B b
出力: (a A) (B B b) (c c C c) (D d) (E e)
222デフォルトの名無しさん
垢版 |
2020/08/07(金) 13:43:57.69ID:uQ4nbdFf
>>221 js
const inputStr = "D a B c d c C A E c e B b"
const expectedStr = "(a A) (B B b) (c c C c) (D d) (E e)"

const charVal = c => c.toUpperCase().charCodeAt()

function groupCharSort(str) {
const chars = str.split(" ")
const groups = {}
chars.forEach(c => {
const cv = charVal(c)
if (!groups[cv]) groups[cv] = []
groups[cv].push(c)
})
return Object.values(groups).sort((g1, g2) => charVal(g1[0]) - charVal(g2[0])).map(cs => `(${cs.join(" ")})`).join(" ")
}

const resultStr = groupCharSort(inputStr)

console.log("out :" + resultStr)
console.log("expect:" + expectedStr)
console.log(resultStr == expectedStr)
223デフォルトの名無しさん
垢版 |
2020/08/07(金) 13:48:23.69ID:uQ4nbdFf
const inputStr = "D a B c d c C A E c e B b"
const expectedStr = "(a A) (B B b) (c c C c) (D d) (E e)"

const charVal = c => c.toUpperCase().charCodeAt()

function groupCharSort(str) {
const chars = str.split(" ")
const groups = []
chars.forEach(c => {
const cv = charVal(c)
if (!groups[cv]) groups[cv] = []
groups[cv].push(c)
})
return groups.filter(Boolean).map(cs => `(${cs.join(" ")})`).join(" ")
}

const resultStr = groupCharSort(inputStr)

console.log("out :" + resultStr)
console.log("expect:" + expectedStr)
console.log(resultStr == expectedStr)


sort いらなかった
2020/08/07(金) 14:51:48.30ID:5vmbSLbR
>>221 Ruby
# その 1
def igrouping( str )
gList = {}
str.split.each{|ch|
k = ch.downcase
gList[ k ] ||= []
gList[ k ] << ch
}
gList.keys.sort.map{|k| '(' + gList[ k ].join(' ') + ')' }.join(' ')
end

instr = 'D a B c d c C A E c e B b'
puts "入力: #{instr}"
puts "出力: #{igrouping( instr )}"
2020/08/07(金) 14:52:06.69ID:5vmbSLbR
>>221 Ruby
# その 2
def igrouping( str )
i = 0
'(' + str.split.sort_by{|x| [ x.downcase, i += 1 ] }.join(' ').gsub( /(\w) (?!\1)/i ){"#{$1}) (#{$2}"} + ')'
end

instr = 'D a B c d c C A E c e B b'
puts "入力: #{instr}"
puts "出力: #{igrouping( instr )}"
2020/08/07(金) 16:23:53.54ID:uQ4nbdFf
<<=って演算子ほしいな
2020/08/07(金) 19:28:59.75ID:P4+Ga4Bm
>>221 Ruby

$><<gets.split.group_by{|c| c.ord % 32}.sort.map{|a| "(#{a.last.join ' '})"}.join(' ')


# => (a A) (B B b) (c c C c) (D d) (E e)
2020/08/08(土) 00:04:29.62ID:b55CcwAR
JavaScript では、Lodash を使うけど、
やっぱり、Ruby の方が、メソッドチェーンできるから良い

Lodash ではたまに「インスタンス.メソッド」の形にならない関数がある。
関数(オブジェクト)の形式

そこで、メソッドチェーンが途切れて、配列が実体化されてしまうから、
サイズと大きいと、ヤバイ
2020/08/08(土) 07:24:36.17ID:u/td9dv4
lodash破壊的変更の関数あるの地味に謎だよな
一応 lodash/fpもあるけど
2020/08/08(土) 07:26:45.92ID:u/td9dv4
いや _.chainの話か
一瞬非推奨の流れ来たときから使ってないわ
メソッドチェーン嫌いではないけど
231デフォルトの名無しさん
垢版 |
2020/08/08(土) 09:18:46.19ID:b55CcwAR
>>221
Elixir

input_str = "D a B c d c C A E c e B b"

list = input_str
|> String.split # 文字列を空白で分割して、配列化する
|> Enum.group_by( &String.downcase/1 ) # 小文字へ変換して、グループ化する
|> Map.values # 値を取り出す
|> Enum.map( fn list -> Enum.join( list, " " ) end ) # 各要素を空白でつなげて、1つの文字列にする
|> Enum.map( fn str -> "(" <> str <> ")" end ) # 文字列を、( ) で囲む

# IO.inspect list

Enum.join( list, " " ) # 各要素を空白でつなげて、1つの文字列にする
|> IO.puts
2020/08/08(土) 14:04:33.02ID:JvTsLjL+
>>221
Python3
https://ideone.com/6VvEbi

全然短くならなかったんだけど皆どういう脳みそしてるの
233デフォルトの名無しさん
垢版 |
2020/08/08(土) 14:58:00.03ID:gFRxrH0y
>>221
perl

$input = "D a B c d c C A E c e B b";
map{push @{$h{uc $_}}, $_}(split / /, $input);
print map{map{"(".(join" ", @$_).")"}$h{$_}} sort{uc $a cmp uc $b} keys %h;


>>232
オブ脳ならぬラムダ脳なんだろうなぁ
同値でグループ化、代表元でソート、出力、これを関数でやってる

それかワンライナーへの偏執的な愛
2020/08/08(土) 15:53:05.60ID:xsg1wzC9
>>221 Ruby

gets.split.group_by(&:upcase).sort.map{|_,v|$><<"(#{v*' '}) "}
2020/08/08(土) 16:11:32.49ID:yUCBpeXj
>>232
一般論としてデータの処理と最後の文字列の組み立てを一緒にやらない方がいい
今どきPC上ならメモリーは潤沢にあるので
・グルーピングの処理してから
・各グループを文字列化
・さらにその文字列を順次出力
とした方がわかりやすいと思う
https://ideone.com/Tsio0O
236デフォルトの名無しさん
垢版 |
2020/08/08(土) 17:07:51.92ID:HH2BebFt
>>232
Pythonだとどうしても短くはならないな。
https://ideone.com/iFc6eL
groupbyのところは、defaultdictで書く方法もあるけど大差なし。
2020/08/08(土) 21:09:30.55ID:JvTsLjL+
>>233
Rubyの人もワンライナーだな
Rubyってショートコーディングに向いてるのかな?

>>235,232
なるほど
2020/08/08(土) 21:20:24.22ID:bf+w2Xl6
code golfなら基本はperlで、次点がRubyじゃないですかね
2020/08/08(土) 21:56:24.61ID:JvTsLjL+
>>238
そういうものなのね
240231
垢版 |
2020/08/08(土) 22:49:25.00ID:b55CcwAR
関数型・メソッドチェーンなら、Ruby・Elixir。
長く、チェーンできるから

Elixir では関数の第一引数を、前のチェーンからの戻り値として渡せる

str = "a b c"

# 文字列を空白で分割して、配列化する
IO.inspect String.split( str )

str
|> String.split
|> IO.inspect

出力は、どちらも
["a", "b", "c"]
241231
垢版 |
2020/08/08(土) 22:54:29.83ID:b55CcwAR
基本的に、Ruby・Elixir みたいに、
メソッドチェーンで、英語のように、左から右へ読めないとダメ

Python の内包表記みたいなのは、可読性が悪い
2020/08/08(土) 23:09:35.53ID:n6UBlQy6
ざっくりとした見た目しか気にしないのでパイプライン演算子と区別がつかないrubyガイジなのであったw
243デフォルトの名無しさん
垢版 |
2020/08/08(土) 23:14:07.63ID:ifN2bgU4
>>184
Java
https://paiza.io/projects/__QcFHuBny33chXSMMTA4Q
244デフォルトの名無しさん
垢版 |
2020/08/08(土) 23:32:15.70ID:ifN2bgU4
>>221
Java
https://paiza.io/projects/20JVV_t6hmPUha0B9AuKOA
2020/08/09(日) 00:17:54.90ID:/K790vfJ
javaでもStream使うと意外と少なくかけるんだな
utilが充実してるな
2020/08/09(日) 00:41:46.15ID:uywZ9h5A
>>184
Python3
https://ideone.com/1aordC
2020/08/09(日) 02:47:46.35ID:Mt0Kh35r
>>221
c#
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var input = "D a B c d c C A E c e B b";

foreach (var itm in input.Split(" ").GroupBy(p => p.ToUpper()).OrderBy(p => p.Key))
{
Console.Write("(" + string.Join(" ", itm) + ") ");
}
}
}
248デフォルトの名無しさん
垢版 |
2020/08/09(日) 04:58:28.52ID:bQgrv4ZF
>>221
Kotlin
https://paiza.io/projects/zR3XGW4DaUAMXfqNq1oZ8A
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況