プログラミングのお題スレ Part20
■ このスレッドは過去ログ倉庫に格納されています
GUI は皆が知っている、HTML, CSS, JavaScript だけ
それ以外は、ダメ >>380
Win32, Androidが抜けてる >>371
>>1に書いてあるサイトだとブラウザで開くだけで実行されるじゃない。 お題:GUIのカウントチャレンジを作れ
ボタンを押すとタイマーがスタート
もう一度ボタンを押すとタイマーがストップ
タイマーが10秒きっかりだったら「You win!」と表示
それ以外は「You lose!」と表示
現在のタイマーの値は表示しない お題: 与えられたn個の英単語群をすべて連結したクロスワードを作成できるか否かを判定せよ。クロスワードのサイズは自由とする。
入力例1: password, sword, animal, living
出力例1: すべて連結可能です。
入力例2: apple, zoo, grape
出力列2: 連結できない単語「zoo」があります。 >>390
お 前 は 内 野 じ ゃ ね え よ 現実の問題は競プロの問題よりも難しいかも知れない。教科書に書いてないような解決策を要求される。
競プロの問題が欲しいなら、ここよりも競プロへ行ってくれ。ここはそういう場所ではない。 数学の組合せの問題か。まず文字の組合せから。ある単語Xのすべての文字が他の単語にないならその単語Xは連結ではない(自明)。ひとつのセルは二重に交差点になることはできない(自明)。
ある単語Xが連結でなければ、単語X上の任意の文字位置は交差点にはならない。 次はクロスワードの組合せ。有限でサイズ変更可能な二次元配列によりクロスワードの盤を再現する。各要素はアルファベットか黒マスかハテナ(?)である。
文字の組合せにおいて最も接続数の多い単語を最初に盤の真ん中に置く。さらに単語の両端に黒マスを置く。次に接続数の多い単語と既に盤に置かれている単語の交差点を考えるわけだが、
交差点の位置により場合分けすると考えやすい。 そして配置のすべての組合せを再帰により網羅する。交差点が見つからない単語があれば失敗。というわけだ。コーディングに入ろう。 >>385
Kotlin
https://paiza.io/projects/Hq-JXeNo2ZQgGbLORbCJpA
GUI は java.awt ライブラリを使うように書いてある。
当然の事ながら、paiza.io のサイト上では動かない。
動かしたい人は IntelliJ Idea で Kotlin のプロジェクトを作ってソースコピペして実行させるか、
またはコマンドライン環境で kotlinc コマンドでコンパイルして kotlin コマンドで実行する。 交差点になり得るセルの位置を記録して可能ならばマイナス方向にもサイズを拡張すべきことがわかった。 document.querySelectorAll('span.name').forEach(e => {
if(e.innerText.indexOf('蟻人間') >= 0){
e.parentElement.parentElement.style.display = 'none';
}
}); >>378
これか…
ttps://math.jp/wiki/%E6%9C%89%E9%99%90%E7%BE%A4%E3%81%AE%E5%88%86%E9%A1%9E%28%E4%BD%8D%E6%95%B01~100%29
プログラム化する以前に、解法を理解・考えることが難しいお題だな >>404
銀行振込3000円でいいか? メールで連絡よろ。
katayama.hirofumi.mz@gmail.com どうせ
printf使うなstd::cout使え、だろう? 確かにここはstd::pairじゃない方がいい。
他には? ヘッダーオンリー・テンプレート使用はバイナリサイズが大きくなりがちだから避けるべき。それから? std::promiseを使うべき。だがやり方がわからん。 お題: 計算時間が予測できない時間のかかる計算について、複数スレッドを立ち上げていずれかのスレッドで答えがセットできたか、キャンセル操作があれば、スレッドを終了して可能ならば答えを取得する。スレッド開始と終了、答えに対してメッセージを出力せよ。
言語: C++11以降 std::threadとstd::promise使用。 お題で言語まで指定されんの?宿題スレに貼ってくれば もうすぐポッキーの日
[お題] 人口合計で1がらみの数字遊び
URLのページに都道府県別の人口が載っている。
URL: https://ideone.com/msZUeW
今回使用するのは、2020/10のデータ
同じ県は一回のみで、異なる県を 11 県選らぶ。
(単純な選び方は全部で 47C11 = 約174億通り)
選択した11県の人口合計を 111111 (11万1111) で割った時、
余りが 1111 になるのは何通りあるか?
また、その条件で(剰余でなく生の)のべ人口合計は何人か?
※一発正解問題、実行時間2秒程度。
※ちなみに 2015/10データだと 156561 通り(のべ 4656362060856 人) だった。 侍エンジニアリングつーサイトの講師やりませんか?というお誘いが来た。
下準備が結構必要っぽいのに時給は生徒と応対している時のみの2000円/hだそうだ。
結局時給1000円くらいやん。
ふざけとるわ。 生徒と応対して連絡先交換
あとは中抜き回避で青天井 >>417
回答者(>>418)が言うところの"遅い解法"ががほぼ想定解。
https://ideone.com/msZUeW 下部に追加記入
解法については、"部分和問題 数え上げ"でググって調べて
別解としては早い言語なら、さらに遅い"半分全列挙"でも間に合う。
(大雑把に(24*2^24)*2 <1億なので、c++で試したら1秒強だった) >>422見てなんで>>418が遅かったか分かった
無駄な掛算やってたからだった
配列の並び直したら4倍速くなった
https://ideone.com/vwPpAn お題:与えられたテキストの中のURLをすべて置き換える。
https://【...】
→
https://jump.5ch.net/?【...】 >>425
URLとなる文字列の定義も知らねえで糞みたいな問題出すなよダニ野郎 >>427
URLにマッチする正規表現使えばええやろ、チャチャとやれよ。 >>425 Perl5、たまにはお相手して進ぜよう。5chの仕様に従うと↓こうだと思うが…
$uri = 'https://www.google.com/search?client=firefox-b-e&q=%E8%9F%BB%E4%BA%BA%E9%96%93+%E3%83%8F%E3%82%B2';
use URI::Split qw(uri_split uri_join);
@a = uri_split($uri);
$a[1] = 'jump.5ch.net';
$a[2] = '/';
$a[3] = $uri;
print uri_join(@a), "\n"; ”2021”というフォルダがある
"2020"というフォルダもある
:
"1950"というフォルダもある
そしてそれぞれに"01"〜"12"のサブフォルダがあって
そしてそのそれぞれに"01"〜"31"というサブフォルダがあって
更に"00"〜"23"という・・・・
つまり、1時間ごとのフォルダがあって
そこには多くのファイルが詰まっている
そのファイルのタイムスタンプに変化があったら
「どこのファイルが書き換えられたぞ」と検出するプログラムを作りたい
片っ端からタイムスタンプを調べるしかないのか
これはファイルシステムの問題でしょうが
なんとか、前回調べてから変化があったか、短時間で検出できる方法はありませんか
ファイルに変化があったら、フォルダのタイムスタンプを変えてくれればいいんだけどね そういう検出機能はOSかハードウェアかについてなかったか 忘れたが NTFSの USN とは?
USN ジャーナルとは
NTFSのUSN機能とはNTFSボリュームに対しての変更の記録です。
Cドライブ、Dドライブ、Eドライブごとなど、ドライブごとに加えられた変更を記録したものです。
USNとはUpdate Sequence Number Journalの略称です。
主に以下の目的で使用されます。
・FRS(File Replication Service)によるファイル複製時の差分洗い出し。
・スナップショットバックアップ時の差分洗い出し。
・ウィルス対策ソフトによるファイル検査。
・インデックスサービス向け。
http://tooljp.com/qa/what-is-USN-36BE.html Ruby では、文字列の中から、URL を抜き出す関数が非推奨になった。
頻繁に規格が変わるからかな?
正規表現でも多分、何万行も掛かる。
作るのに10年ぐらい掛かるので、誰も作らない
今あるものでも、正しく判定されるかどうか、分からない >>430
5ch のバグで、
そのURL をプログラム板全体で見た時は、&q とつながっているのに、
個別のスレッドで見ると、&;q と、&の直後に、;が入って、
リンクが&までになってしまう >>433
ドライブごとに加えられた変更がログに保存されているとは知りませんでした
データドライブに分けているので、ログから探すのも速いかもしれません
ありがとうございました お題: JSON形式のテキストをXML形式のテキストに変換しなさい ideone って boost は include 出来るのか
codepad はずっと落ちてるな >>440
もう codepad はおしまい、codepad にアップした私のコードも永遠に失われました… 短いもんだから直接打ち込んじゃったんじゃないかな。
そして消滅。 >>442
デスクトップで書いたものはローカルのどこかに残っている(と思う)
ノートで書いたものはノートPCごとどこかにいってしまった…
いや、まあ、最初から書き捨てでしたけど、惜しいと思うものも多少ありますね いま
http://codepad.org/
復活してない?
サンプルURLとして前々スレの過去の回答
プログラミングのお題スレ Part18
http://mevius.5ch.net/test/read.cgi/tech/1594702426/174
>174 名前:デフォルトの名無しさん[] 投稿日:2020/08/04(火) 19:24:17.96 ID:lImhU2CT
> >>173
> あーアホだったw
> タブ消去の仕様だとPythonだと分けわからんことになるなw
> ↓貼り直した
> http://codepad.org/BWRzr8fW
> ※会員未登録の為、一定期間後に自動消去
も表示されたし。
保持しておきたいcodeがあれば今のうちにsaveするか、
Internet archiveに記録しとくのも手だよ。 お題が出なくなったので全く実用性がないと思われる頭の体操的なやつを一つ。
お題: 与えられた数値の配列の 1 になっているビットをカウントする。
例えばC言語で unsigned char の配列とか使って、処理する関数はポインタで渡された所から何要素みたいに指定されるようにする。。
それで例えば 0xde, 0x96 (11011110, 10010110) なら答えは 10。 お題: 日付が与えられるので4月ならtrueを出力しなさい
< 2021/04/01
> true
< 04/01
> true
< 2021/04
> true
< 2021/05/01
> false >>446
最適なコードが環境に大きく依存するからなあ
シフトの速度とか専用命令有無とか
あまり良いお題じゃないし荒れそう 日 21/04/01
米 04/01/21
欧 01/04/21
年2桁で入り乱れたら更にわけわかめ 逆に、年2桁の時は、
その数値で年月日が特定できるか問題があった。
02 12 29 --> 12年02月29日 と 29年02月12日 の2通りがある
02 13 29 --> 13年02月29日はないので、29年02月13日のみ >>452
特定できるかどうかだけならいいが……
反例を間違った 02 12 29 3通りある そういえば食品の賞味期限がどう読んだらいいか分からなかったことがあったなあ。
11/02/13
2013年2月11日なのか、それとも2013年11月2日なのか、まさか2011年2月13日だったりしたらどうしよう、みたいな。
普通に輸入されているものなら日本語ラベルがあるから分かるだろうけど、友達が現地のお土産屋で買ってきた
お菓子みたいなものだとそのまんまだったりする(まあ、アメリカかアメリカ以外かで考えればだいたいは大丈夫
なのかも知れないが)。
日本の元号みたいな独自年号まで使われているのが混在していたら余計に分からないよな。今の日本では
あまりないだろうけど昭和の頃はあったような気がするなあ。 >>446 Ruby
p [0b1110, 0b1010111].reduce(0){|s, n| s + n.digits(2).count(1)}
# => 8 >>446
C
https://paiza.io/projects/YQ8ORfELqUt1xkKqmysViQ
入力を配列に入れてからカウントさせている。(uint32_t 型の配列)
カウント部分は>>456に似てる。しかし最初に引くのは思いつかなかった。 >>448
Perl
https://paiza.io/projects/o4VTdU_kK-S8T4G5HvkIRw
年月日順で年がある場合は必ず4桁でなければならない。
4だけでも4月に判定されるが、まあいいか。 >>446
Haskell
sumCntBits = id
. length
. filter odd
. ( >>= ( takeWhile ( /= 0 ) . iterate ( flip div 2 ) ) )
main = do
print $ sumCntBits [ 0xde, 0x96 ]
print $ sumCntBits [ 0x12345, 0x6789a,0xbcdef ]
----
10
32 >>446 rust
https://ideone.com/9yFeU3
fn main() {
let f = |a: &[u32]| a.iter().map(|n| n.count_ones()).sum::<u32>();
println!("{}", f(&[0xde, 0x96]));
} >>446
Kotlin
https://paiza.io/projects/7hQyycMNf5nuV5HcBg6iQg
普通に作るのは出尽くした感があるのでちょっと変わったやり方にした。
入力から Int の List を作り、それを 1 ビットづつの Boolean のリスト(というか Iterator) にしてから true のみをカウントしている。 >>446 octave
https://ideone.com/BNjv3I
f = @(a) sum(dec2bin(a)(:) - '0');
f([0xde 0x96]) もうすぐ、2022年
[お題] 2022は"x3y1数"(造語)?
以下の二つを満たす正の整数を"x3y1数"と呼ぶ
・各桁の数値が、二種類のみの数字からなる
・上の二数の個数比は 3:1
該当例:1112, 2212, 2022, 32222223, 999999999888
ダメな例:2213(種類), 4444(種類), 33232(個数比), 0222(先頭ゼロ)
整数A,Bが与えられる。A以上B以下の"x3y1数"はいくつあるか?
制約: 0 < A <= B <= 10^18
1) 2923 3311 --> 8
該当は [2999, 3000, 3033, 3111, 3133, 3222, 3233, 3303]
2) 2021 77977796 --> 2022
3) 3000 6666566566566555 --> ?
4) 999999999889 1000000000000110 --> ?
5) 1 1000000000000000000 --> ?
※実行時間:上の5問をクエリーとし全部を2秒程度 お題:自分用double-double演算ライブラリ
最低限、通常のdoubleとの相互変換は可能であること。それに加えて、
1)加減算
2)加減算 + 乗算
3)四則演算
数字が大きいもの程上級者向けです。
演算子のオーバーロードなどは任意とします。 >>466
double の演算を自分で実装するという意味ですか?
sum(double, double)
diff(double, double)
mul(double, double)
div(double, double)
を自分で実装する、という話でいいですか?
あと double のフォーマットは IEEE754 でいいですか? お題: テキストを読み込みそれをクリスマスツリーにして出力しなさい
クリスマスツリーに見えれば形は自由とする
入力
本日は良いお日柄ですね
出力
___本
__日は
_良いお
日柄です
___ね >>470
文字コードは何を仮定すればいいのですか? >>471
UTF-8
日本語の扱いが難しい言語では英語のみの対応も良しとする 二種類のみの数字からなり個数比は 3:1
引数の範囲は 1-10^18 = 1001-9999999999998888(16桁)
以下の範囲に限られる
1000-9998
1000 0001-9999 9988
1000 0000 0011-9999 9999 9888
1000 0000 0000 0111-9999 9999 9999 8888
「二種類のみの数字からなる」を計算式で判定する方法ある? 1([\d&&[^1]])\1{2} 最上位桁が比1
111[\d&&[^1]],11[\d&&[^1]]1,1[\d&&[^1]]11 最上位桁が比3
一般化 (\d)(?!\1)(\d)\2{2}|(\d)\1{2}(?!\1)\d|(\d)\1(?!\1)\d\1|(\d)(?!\1)\d\1{2}
4桁ならこれでもいいけど8桁以上になると複雑化するし
地道に数えるより 4の倍数桁,数字2種,比率1:3 のルールで生成する方が速そう >>463
https://ideone.com/xTDtME
想定解は、事前に4,8,12,16桁の"x3y1"数を全列挙して作っておく。
プログラミング的には、各言語の順列や組合せを使って、作れるだろう。
(想定解例では組合せは2ベキとpopcountから作っている)
「それは、全列挙数が小さいとわかっているからでは..?」に対して
プログラムで出すのなら、雑に最も大きい16桁が4つあるとして計算
10P2 * 16C4 * 4 < 70万 なので、全列挙可能
まじめに計算すると 10P2 * (16C4 + 12C3 + 8C4 + 4C1) * 9 /10 = 167,832
列挙済みならば、クエリー5件程度なら、16.7万*5 チェックで間に合う。
ちゃんとやるなら、ソートして二分探索すれば、数千単位のクエリーに対応できる。
(想定解例では後者でやっている) >>463 c
https://ideone.com/bmYThw
・Ruby版の移植
・組み合わせの列挙方法は丸パクリ
・Ralph William Gosper Jr. 氏に感謝 ■ このスレッドは過去ログ倉庫に格納されています