X



プログラミングのお題スレ Part12
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2018/09/28(金) 10:09:07.13ID:phwOkayR
プログラミングのお題スレです。

【出題と回答例】
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/

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

前スレ
プログラミングのお題スレ Part10
https://mevius.5ch.net/test/read.cgi/tech/1514772904/

プログラミングのお題スレ Part11
https://mevius.5ch.net/test/read.cgi/tech/1524570314/
0004デフォルトの名無しさん
垢版 |
2018/09/28(金) 12:28:47.83ID:6mi1IA73
やだ
0005デフォルトの名無しさん
垢版 |
2018/09/28(金) 13:55:38.90ID:jm6QTuW3
>>3
3つの値のうちの最小値が分かった時の情報量はlog3
1回の比較によって得られる情報量はlog2
2回の比較で2log2=log4
log2<log3<log4なので最低2回の比較をしなければ最小値を知る事はできない
0007デフォルトの名無しさん
垢版 |
2018/09/28(金) 14:26:10.16ID:6mi1IA73
ここは数学のお題を解くスレではなくプログラミングのお題スレなので証明せよというお題ならば証明をするプログラムを作れという意味になる。
決して人間が頭で考えて証明してはならない。
0008デフォルトの名無しさん
垢版 |
2018/09/28(金) 14:46:03.56ID:jm6QTuW3
3つの数単体同士の比較だけじゃなくて、a+bとcとかa^cとb+cとか無限に考えられるから有限時間で証明するのは無理では?
0012デフォルトの名無しさん
垢版 |
2018/09/28(金) 23:31:28.87ID:Trt/L8Tp
例えばR^3の関数f(x, y, z)で
xが最小の時負、xが最小でなくyが最小の時0、xかyが最小でなくzが最小の時正
になるC^∞級の関数は存在するのでこの関数を使えば比較は1回で済む
0013デフォルトの名無しさん
垢版 |
2018/09/29(土) 00:17:28.49ID:mZMDBHA7
>>12
例えばどんな関数?
0015デフォルトの名無しさん
垢版 |
2018/09/29(土) 01:06:03.17ID:IuTgmxg/
比較というのは差をみつけることだからな
ココでの差は引き算の差の意味ではない、当然

数字を引き算して差を求めることもできる、当然
0017デフォルトの名無しさん
垢版 |
2018/10/01(月) 20:03:33.29ID:IziOBEHB
お題:f(n)::={nを連続するいくつかの正整数の和として表す表し方の総数}とおく
例えば、15=7+8=4+5+6=1+2+3+4+5よりf(15)=4である
上限Nが与えられたとき、n<=Nでf(n)が奇数となるようなnをすべて足し合わせた値を求めよ

10 -> 24
100 -> 665
1000 -> 18006
10000 -> 571940
100000 -> 18010994
1000000 -> 569929080
10000000 -> 18001029437
100000000 -> 569128815672
1000000000 -> 17994029079715
0018デフォルトの名無しさん
垢版 |
2018/10/01(月) 20:21:00.27ID:XiA3uZUZ
> nを連続するいくつかの正整数の和として表す表し方の総数

15は7+8と4+5+6と1+2+3+4+5の3通りの表し方があって
その総数f(15)が4ってどういうこと?
0024デフォルトの名無しさん
垢版 |
2018/10/04(木) 17:48:26.02ID:WD/5XFit
10月の学校に着いた時間と帰った時間を平日分全部出力する(土日のみ休みで平日は必ず学校がある)
A君は神経質なので秒まで着いた時間と帰った時間をメモする
時間は任意とする。
入力例
2018/10/01 09:25:00
2018/10/01 17:30:00
出力例
入力例と同じフォーマットの形式の日付時間が平日分全て出力された後に、
今度は別のフォーマットで平日分全て出力される
出力例
2018/10/01 09:25:00
2018/10/01 17:30:00
2018/10/02 09:26:00
2018/10/02 17:24:00
:
:
:
平日のみ全部出力
:
:
別フォーマット出力例
20181001 092500
20181001 173000
0029デフォルトの名無しさん
垢版 |
2018/10/04(木) 21:05:04.35ID:THaWokSR
平日って設定要る?
文字列 "YYYY/MM/DD HH:MM:SS" をいろんなフォーマットに変換するだけの問題じゃ駄目?
なんで一旦 echo するの?
責めてるんじゃなくて単純な疑問ね
0030デフォルトの名無しさん
垢版 |
2018/10/04(木) 22:21:43.46ID:pTnAHI9j
>>24 C++
#include <cstdio>
#include <vector>
#include <tuple>

using namespace std;

int zeller(int y, int m, int d) {
if (m < 3) {
y--;
m += 12;
}
return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d ) % 7;
}

int main() {
vector<tuple<int, int, int, int, int, int>> v;
for (int y, m, d, h, i, s; scanf("%d/%d/%d %d:%d:%d", &y, &m, &d, &h, &i, &s) == 6; ) {
if (int w = zeller(y, m, d); 1 <= w && w <= 5) {
v.emplace_back(y, m, d, h, i, s);
}
}
for (auto [y, m, d, h, i, s] : v) {
printf("%d/%02d/%02d %02d:%02d:%02d\n", y, m, d, h, i, s);
}
for (auto [y, m, d, h, i, s] : v) {
printf("%d%02d%02d %02d%02d%02d\n", y, m, d, h, i, s);
}
}
0031デフォルトの名無しさん
垢版 |
2018/10/04(木) 22:45:58.84ID:yblvOSiR
>>29
平日って設定の理由としては、問題を少し複雑にしたかったから、あえて入れてみた
まあその制限が問題を難しくしてるのかって話もあるけど
文字列を色々なフォーマットにするでもいいけど、日本語でおkとか入力例とか出力例が自分でも適当過ぎた気がするので、また今度の機会に‥

>>30
C++は好きな言語だ
今度の連休で遊ばせてもらいます
0032デフォルトの名無しさん
垢版 |
2018/10/04(木) 22:49:59.54ID:9/syaOEb
そう言えば寝てたら未来へ行っちゃうってのは、Islandにちょっと似てる。
0033デフォルトの名無しさん
垢版 |
2018/10/04(木) 22:50:28.48ID:9/syaOEb
ごめん。誤爆。
0035デフォルトの名無しさん
垢版 |
2018/10/05(金) 07:17:46.24ID:wqnG0hHC
春分の日と秋分の日はその前の年に気象庁だかどっかから指定される休日だから任意の時刻に対して平日判定を行うのは不可能
0037デフォルトの名無しさん
垢版 |
2018/10/05(金) 09:07:05.89ID:wqnG0hHC
ああ10月限定かすまんな
それでも無駄な情報が多くて何をさせたい問題なのかやっぱりわからんわ
0038デフォルトの名無しさん
垢版 |
2018/10/05(金) 09:48:23.51ID:ExR6m3Ew
お題
1から連続する自然数の並びで
最初の a個の総和と
それに続くb個の総和が
等しくなるものを
好きなだけ求めるち
0039デフォルトの名無しさん
垢版 |
2018/10/05(金) 10:50:56.93ID:wqnG0hHC
>>38
(0..10**8).each{|i|n=2*i*(i+1)+1;x=Integer.sqrt(n);puts'a=%d, b=%d'%[a=(x-1)/2,i-a]if x**2==n}
#=>a=0, b=0
a=2, b=1
a=14, b=6
a=84, b=35
a=492, b=204
a=2870, b=1189
a=16730, b=6930
a=97512, b=40391
a=568344, b=235416
a=3312554, b=1372105
a=19306982, b=7997214
0042デフォルトの名無しさん
垢版 |
2018/10/06(土) 10:59:33.32ID:MgCaJaM3
半角スペース区切りで数字が入力されるのでソートして出力しなさい
いろんなアルゴリズムでやってみよう

-*- input -*-
3 1 4 1 5 9 2 6 53 58 97 93 2 38 46 26

-*- output -*-
1 1 2 2 3 4 5 6 9 26 38 46 53 58 93 97

例) Ruby
ボゴソート
ary = gets.split.map(&:to_i)
nil while ary.shuffle!.each_cons(2).any?{|a, b| a > b}
puts ary * ' '

バブルソート
ary = gets.split.map(&:to_i)
(ary.size - 1).times do
  ary.each_cons(2).with_index{|(a, b), i| ary[i, 2] = b, a if a > b}
end
puts ary * ' '
0043デフォルトの名無しさん
垢版 |
2018/10/06(土) 13:39:49.65ID:J8Y2BFN6
perl -ne '@d=split;print join(" ",sort {$a <=> $b} @d)."\n"'

無念無想のままたった今打った。1回も試していない。
0047デフォルトの名無しさん
垢版 |
2018/10/07(日) 00:58:45.52ID:KvcjzmFM
>>24
A君は平日以外学校に行かんのだろ?
なら曜日なんぞ気にせず入力された登下校時刻を単に変換するだけになるような
0048デフォルトの名無しさん
垢版 |
2018/10/07(日) 07:50:57.08ID:VJ+UDRYt
アスペか?アスペにはこのスレはたぶん無理

↑これの読解もままならないだろうが(苦笑
0050デフォルトの名無しさん
垢版 |
2018/10/07(日) 18:04:09.18ID:t8TfnMHv
お題
現在の時刻をスウォッチ・インターネットタイムで表示する

@042
0052デフォルトの名無しさん
垢版 |
2018/10/07(日) 21:21:58.39ID:T4GR84FI
ビール標準時が基準点でないものはスウォッチ・インターネットタイムではない
0054デフォルトの名無しさん
垢版 |
2018/10/08(月) 02:11:26.03ID:tKqgyITq
perl -e '$s=86400;$n=1000*((time()+3600)%$s)/$s;printf "@%d\n",$n'

今実行するとこう出る。

@757
0055デフォルトの名無しさん
垢版 |
2018/10/08(月) 16:16:40.26ID:SHTmPUE+
https://exoplanetarchive.ipac.caltech.edu/docs/transit_algorithms.html

まずこのサイトを読んで日時(UTC基準)からJDを求めるプログラムを作りなさい
逆に日時(UTC基準)から時刻を求めるプログラムを作りなさい

このサイトに書いてあるとおりに作るとプログラムの結果は正しくならない

プログラムの結果が正しくなるように修正し、
このサイトのどこに誤記があるかその箇所を指摘しなさい
0056デフォルトの名無しさん
垢版 |
2018/10/08(月) 16:19:35.99ID:SHTmPUE+
>>55訂正

(正)逆にJDから日時(UTC基準)を求めるプログラムも作りなさい
(誤)逆に日時(UTC基準)から時刻を求めるプログラムを作りなさい
0059デフォルトの名無しさん
垢版 |
2018/10/08(月) 22:51:07.00ID:P7JfEPgv
>>58
365.25 は 101101101.01(2) だから誤差の心配は無いよね?

(1..3000).each{|n| p n if (365.25*n).to_i != 1461*n/4 }
とかやってみて
0060デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:14:43.42ID:c9HgNpeF
>>59
それは良いとしても ( (c-122.1)/365.25 ).to_i の類の表現が他の個所にも複数あり
この内のどれかが
p (5.151/1.717).to_i #=> 2
のようにならないとはコードをみただけでは明確ではなく
剰えrubyのFloat classの精度は実装依存であるためこの様な処理はすべきではない
0061デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:58:05.73ID:5rk01rQ6

ruby って IEEE 754 に準拠してないの?
信じ難いなそれ
使い物にならないじゃん
0064デフォルトの名無しさん
垢版 |
2018/10/09(火) 07:49:23.39ID:G0ViTg21
関係ないってそういう意味ではないのでは?
>>61の指摘することとIEEE 754は関係ないってだけで。
例えば32bitか64bitでdouble型の精度が違うなんて別に珍しいことではないと思うんですけど。
0065デフォルトの名無しさん
垢版 |
2018/10/09(火) 19:02:39.94ID:jSAcVkU7
> 32bitか64bitでdouble型の

ん? 32bitのdoubleなんてありえるの?
IEEE 754以外で倍制度を決めてる何かがあるの?
0066デフォルトの名無しさん
垢版 |
2018/10/09(火) 21:21:14.72ID:7Krlta4j
>>60
たかだか30行程度のループも再帰もない一本道なので具体的に示してもらえるとありがたいです。
この種のプログラムは地デジの日付情報が MJDで ARIBの規格書にも載っていて、
ごく一般的に使われているので、もし問題があるようならばなんとかしたいですよね。

>( (c-122.1)/365.25 ).to_i
浮動小数点で JD が扱える精度+αくらいならこれは問題ないと思いますが。
c は整数ですし、分母の 365.25もすでに説明しましたね。
グレゴリオ暦6239年で JD が 4000000辺りで分子が 365.25の倍数前後は
4000217.1/365.25 と 4000218.1/365.25 だから仮数部が 19bitほどあればいいわけですね。
# こんな定数のままだとコンパイラが最適化してしまいますけどね

組み込み用途などによっては考慮すべきかもしれないけれど、
最初のお題(>>55 )ってそういう意図があったのでしょうか?
>このサイトに書いてあるとおりに作るとプログラムの結果は正しくならない
これは特定の環境に限られたものを指していたのかな?
0067デフォルトの名無しさん
垢版 |
2018/10/09(火) 21:40:48.90ID:BHyo+myF
精度的に問題ないって理解してれば良いのでは
よく理解してない人が小数点使う必要ない場面で使って事故って何も分かりませんみたいな事あるし
コンシューマゲームなんかだとシビアなんで、癖みたいにしておかないとハマってしまうけど
0068デフォルトの名無しさん
垢版 |
2018/10/09(火) 22:33:03.53ID:uKgwXIAC
>>55はココからが本当の本題

@ >>58のコードでの誤記の指摘は概ね正解 ただ>>58のコードの修正だけでは紀元前に対応していない 紀元前が対応するように修正しなさい
A @のプログラムの通日を整数の通ナノ秒にして、ナノ秒までの時刻を正確に相互変換できるようにしなさい
B Aにうるう秒をいれて正確に相互変換できるようにしなさい(制約で問題が発生する場合、問題が発生する時刻を書きなさい)
  参考URL:http://maia.usno.navy.mil/ser7/tai-utc.dat

Bは普通にやったら結構めんどい課題と考えられる
力技でやるなら暇人以外にはオススメしない(力技でやらないほうがいいと一応警告しておいたからな)
コードの一部を出力するコードをサクッと作るぐらいの力量がなければ
きっとサクッとはできないしサクッと結果の評価もできないと考えられる
0069デフォルトの名無しさん
垢版 |
2018/10/09(火) 22:35:06.29ID:uKgwXIAC
訂正
(正)>>57
(誤)>>58
0070デフォルトの名無しさん
垢版 |
2018/10/09(火) 22:56:04.77ID:uKgwXIAC
https://ideone.com/fF1kvl
Bで使えるデータは用意しておいた
気が向いたヤツはチャレンジしなさい
0072デフォルトの名無しさん
垢版 |
2018/10/10(水) 00:03:10.45ID:uHP11E7s
C言語スレとかのいろいろな所に出没してる半角先生だ
どこでも相手にされなくなったから出題しに来た
0073デフォルトの名無しさん
垢版 |
2018/10/10(水) 09:42:44.92ID:hOT3iUsl
サマータイムスレでの暴論って何なんだろう?

まさかのサマータイム賛成なんて奴だったら許せんな。
0074デフォルトの名無しさん
垢版 |
2018/10/10(水) 16:39:18.23ID:slDdF7J+
お題
倍精度実数で整数部分が正確に表現できる最大値を求める
0075デフォルトの名無しさん
垢版 |
2018/10/10(水) 17:03:11.31ID:8BTNYbZT
浮動小数点実数型と言えど最大要素に近い
部分は、整数×2^整数という形の整数也
0078デフォルトの名無しさん
垢版 |
2018/10/10(水) 18:05:44.00ID:TfVezTBt
区間を求めるなら仮数部だけで収まる最大値だけど、
とある数の整数部が正しく表現されているだけなら仮数部も込みで double の最大値が答え

それを std::numeric_limits<double>max() や DBL_MAX を使わずに計算せよ、ということか
0079デフォルトの名無しさん
垢版 |
2018/10/10(水) 19:38:40.27ID:TfVezTBt
>>74を2分探索で計算で出すコード書いてて ideone のコンパイラのバグ見つけた気がする

https://ideone.com/D3ip5M
if 文の条件式の値が1なのに実行されない
find_max<char> とか int32_t で起きる

何か間違ってるかな
0080デフォルトの名無しさん
垢版 |
2018/10/10(水) 20:37:17.47ID:GOApHyvI
符号付き整数オーバーフロー(未定義動作)のせいで
変な最適化でもかかってるんじゃね?
0081デフォルトの名無しさん
垢版 |
2018/10/10(水) 21:07:51.69ID:3iBo9D9z
>>68
通常 JDは UTCを元にするので閏秒は考慮しないと思いますよ、
天文計算などする場合は必要に応じて UT1とかに変換しているのじゃないかと?
0082デフォルトの名無しさん
垢版 |
2018/10/10(水) 22:22:14.63ID:TfVezTBt
>>80
なるほど。
オーバフローが未定義動作だとすると符号付整数の最大値を求めるのは難しそうだな。
0083デフォルトの名無しさん
垢版 |
2018/10/11(木) 00:30:47.35ID:p15CvoFg
ものすごい頭悪いこといってるわ。。。

  UTCは う る う 秒 入 れ た 時 刻 のことだぞ

マジでなんでこんな頭悪いの

天文でつかわれるユリウス日なんかはアホがいうとおり固定
1光年も固定でもないとヤバイからな
1光年は光が1ユリウス年(365.25日)進む距離になる

そもそもオレの課題ではそんなことを問題になんかしてないからな
課題どおりにやればいい
0084デフォルトの名無しさん
垢版 |
2018/10/11(木) 00:34:27.93ID:p15CvoFg
低学歴知恵遅れが知ったぶりしてハジかく典型的な例といっていい
低学歴知恵遅れはいちいち自分が低学歴知恵遅れですと自白するからな
0085デフォルトの名無しさん
垢版 |
2018/10/11(木) 01:18:58.62ID:ZbBeURnP
おまえまたくっさいくっさい自演しとんのか
0087デフォルトの名無しさん
垢版 |
2018/10/11(木) 13:22:48.89ID:yY2EC70D
相手にされなくなったんで問題だせば自動的に相手にされると思い込んでいる
その辺りが半角先生の思考の限界
0088デフォルトの名無しさん
垢版 |
2018/10/11(木) 14:46:25.14ID:MYvNBgY5
ここが適切なのかわかりませんが、知恵を頂けたら幸いです。
当方CGクリエーターで、プログラミングの知識は殆どありません。
そこで質問なのですが、
Aのオブジェクトの座標値が(-1,-2,-3)として、Bのオブジェクトの座標値が(1,2,3)の場合、
Bのワールド位置を維持して、BをAのローカル座標位置へ移動させるには
どのような行列式になるでしょうか?
ネットで座標変換とか色々調べてみましたが、子のワールド位置を維持した状態で
親に該当するローカル座標へ移動させる方法がわかりませんでした。

本来の目的としては、
CGアニメーションソフトのコンストレイント機能にペアレントがありますが、
それを行列式(ノード)で行いたいのです。
(コンストレインのペアレントとは、
時間軸上の任意の位置で親子関係の接続や解除を行うことが出来る機能です。
その接続/解除時には、子は現在のワールド位置を維持します。
0091デフォルトの名無しさん
垢版 |
2018/10/11(木) 16:45:05.30ID:NcfxmDj4
>>88
>Aのオブジェクトの座標値が(-1,-2,-3)として、Bのオブジェクトの座標値が(1,2,3)の場合、

(1,2,3) を (-1,-2,-3) からの相対値で表すということなら
(1,2,3) 引くことの (-1,-2,-3) イコール (2,4,6)
0092デフォルトの名無しさん
垢版 |
2018/10/11(木) 21:49:13.39ID:anEb94RG
>>68 >B Aにうるう秒をいれて正確に相互変換できるようにしなさい
>>83 >UTCは う る う 秒 入 れ た 時 刻 のことだぞ
うるう秒を入れるでなく、外すが正解ですね。すでに UTCには閏秒が入っていますから。
UTC(協定世界時)は TAI(国際原子時)を元に閏秒で補正して UT1(世界時)に合わせています。
7:00:00(UTC)の一日先の時間が24h+-1sec(閏秒)でも時刻は7:00:00(UTC)となるわけです。
よって JDに24hを足すと翌日になり JD/24h%7で曜日が分かります。
未来の日付も計算可能ですが、閏秒を入れないTAI(国際原子時)では地球の自転次第で変化します。

>天文でつかわれるユリウス日なんかはアホがいうとおり固定
逆です、天文計算で使うような時間は UT(世界時)を基準にしています。
それは天体の運動方程式を解くために基準の時刻からの正確な時間が必要だからです。
0093デフォルトの名無しさん
垢版 |
2018/10/11(木) 23:02:27.87ID:p15CvoFg
https://warwick.ac.uk/fac/sci/physics/research/astro/people/steeghs/mpags-as2/mpags_techniques_2012_1b.pdf

・International Atomic Time (TAI)
 - SI second defined by frequency of hyperfine transition of cesium133
 - Measured and counted with international network of atomic clocks

・Co-ordinated Universal Time (UTC)
 - Our civil time (in winter)
 - Based on SI second, with 86400s/day
 - Kept synchronised with UT1 since 1972 by addition of leap seconds
 - Leap seconds not added to TAI, so TAI-UTC is not constant
 - Currently (Nov 2012) TAI - UTC = 35s
 - Use of leap secs currently under discussion (inconvenient for astro)

・Co-ordinated Universal Time (UTC)
 - Currently (Nov 2012) TAI - UTC = 35s

・Calendar is independent of time system, so state both, e.g.
 - 2011 November 11 11:00:00.0 UTC
 - 2011 November 11 11:00:34.0 TAI
 - JD 2455876.958333 UTC
 - JD 2455876.958727 TAI

コレでオレの課題ができないなら
人間やめたほうがいい
0095デフォルトの名無しさん
垢版 |
2018/10/12(金) 02:02:42.62ID:ZYTXH3K/
プログラミングのお題
「10以下の素数の和を求めよ」

答え
「17。コード書くまでもないんだがこれでいいのか?」

これはおかしいだろう
0097デフォルトの名無しさん
垢版 |
2018/10/12(金) 02:35:54.36ID:xbwLlD7o
え?じゃ、こんな感じ?

perl -e 'for($n=1;(2**$n)!=(2**$n+1);$n++){} printf "%d, %.0f\n", $n, 2 ** $n;'

動かすとこう出るが。

53, 9007199254740992
0100デフォルトの名無しさん
垢版 |
2018/10/12(金) 09:39:43.72ID:1UpgDbu2
first(10)って普通は最初の10個を列挙するもんだがrubyは違うのか…
名前重要ってわりにセンスないな
0101デフォルトの名無しさん
垢版 |
2018/10/12(金) 10:33:46.63ID:oIm8hJ6E
じゃあちなみにこの関数名は何ならいいんだ?
お前の考えを言ってみろよ
センスを判定してやるよ
0102デフォルトの名無しさん
垢版 |
2018/10/12(金) 10:49:03.90ID:6UbBSJp3
first(10)が10までってセンスは普通におかしいだろ
つーかrubyも最初の10個返すんだが…?
0104デフォルトの名無しさん
垢版 |
2018/10/12(金) 13:50:43.62ID:oIm8hJ6E
ruby/ruby: The Ruby Programming Language
ttps://github.com/ruby/ruby

そりゃそうだろ
スクリプト言語のソースコードは公開されてて誰でも読めるが
大抵のユーザーは書かれたものを脳死で信じるしかないだろ

それともお前は使うスクリプト言語のソースコードは全部精査してるのか?
コンパイラのソースコードまで熟読してるのか?

ンなモン、脳死で信じるしかねーだろ
0105デフォルトの名無しさん
垢版 |
2018/10/12(金) 13:54:46.58ID:VST6PShP
最近JavaとかC++とか少ないな
Javaは例の騒動があるから仕方ないとしてCとかC++はないんか
0106デフォルトの名無しさん
垢版 |
2018/10/12(金) 16:36:53.91ID:OhxorjMK
>>105
>>79はC++だね。
0109デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:13:31.37ID:jorGy8Se
>>79
gcc8.1だと

char
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 0
(!(n > d && is_usual_num(n))) 1
(!(n > d && is_usual_num(n))) 0
break
calculated = -128
numeric_limits = 127
128
127

となるね
0111デフォルトの名無しさん
垢版 |
2018/10/12(金) 21:27:58.87ID:+EEi3z6C
なぜか言語自体のコード読む読まないの話になってるけど、これくらいのコードなら動かせばすぐにfirstが何してるか分かるじゃん、って思っただけだわ
0112デフォルトの名無しさん
垢版 |
2018/10/13(土) 10:05:11.14ID:m4emGyLz
お題
方程式 1/n = 1/x + 1/y (ただし、n,x,yは正整数でx≦y)について考える
例えばn=4のとき、1/4 = 1/5 + 1/20 = 1/6 + 1/12 = 1/8 + 1/8 より解の個数は3である
上限Mが与えられたとき、上の方程式の解の個数がMを超える最小のnの値を求めよ

2 -> 4
5 -> 12
10 -> 24
100 -> 1260
1000 -> 180180
10000 -> 116396280
250000000000 -> ?
0114デフォルトの名無しさん
垢版 |
2018/10/13(土) 11:32:11.63ID:QkDteBzw
>>112
n = 2の時
1/4 + 1/4 = 1/2
1/3 + 1/6 = 1/2
だけだから結果は2だよ
n=4の時より大きくなることはあり得ないし
0118デフォルトの名無しさん
垢版 |
2018/10/17(水) 11:31:35.00ID:UkGf74ne
お題
[0,1]の一様乱数をN個発生させ、小さい順に並べてa(1), ..., a(N)とする
同様にもうN個作って小さい順にb(1), ..., b(N)とする

同じ順位同士で(a(1), b(1)), ..., (a(N), b(N)) とペアを作った時、a>bとなるペアの個数は0〜N個になるが、その分布は?
またa, bを一様分布以外の分布から取ってくるとどうなる?
0120デフォルトの名無しさん
垢版 |
2018/10/17(水) 13:07:54.93ID:OYXuI76a
>>119
シミュレーションしてみるのも面白いかなと
0121デフォルトの名無しさん
垢版 |
2018/10/17(水) 13:50:50.88ID:8efdFbKL
趣味で
0124デフォルトの名無しさん
垢版 |
2018/10/17(水) 15:55:41.32ID:mC+TJhph
数学に逃げちゃ駄目だ。
0125デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:12:22.62ID:DXXGfTNm
乱数全部同じパターンを引いてもその結果のみから分布を論じてかまわないというならそれでもいいがな
0126デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:34:51.31ID:slnS35LM
ちょっとやってみた
J で

NB. monadic sort operator
sort=: /:~

NB. monadic operator returns count of a_n > b_n
NB. where a and b is sorted y-length array of rand(1000)
do1=: verb define
a =. sort ?y$1000
b =. sort ?y$1000
+/ (a>b)
)

NB. dyad operator returns count of number x in array y
count=: dyad define
+/ (x = y)
)

続く
0127デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:35:05.08ID:IG2KKzqQ
>>118 Squeak/Pharo Smalltalkでシミュレーションのみ
擬似乱数発生器は Squeak の場合 Mersenne Twister(Pharo なら Park-Miller)

| N M random bag |
N := 10.
M := 1e6.
random := Random new.
bag := Bag new.
M timesRepeat: [
| pairs count |
pairs := (random next: N) with: (random next: N) collect: [:a :b | {a. b}].
count := pairs count: [:pair | [:a :b | a > b] valueWithArguments: pair].
bag add: count
].
bag sortedElements

"Squeak =>{
0->981.
1->9873.
2->44008.
3->117136.
4->205258.
5->246203.
6->204286.
7->117345.
8->44247.
9->9702.
10->961} "
0128デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:38:20.84ID:cKcilnbV
>>118 Squeak/Pharo Smalltalkでシミュレーションのみ
擬似乱数発生器は Squeak の場合 Mersenne Twister(Pharo なら Park-Miller)

| N M random bag |
N := 10.
M := 1e6.
random := Random new.
bag := Bag new.
M timesRepeat: [
| pairs count |
pairs := (random next: N) with: (random next: N) collect: [:a :b | {a. b}].
count := pairs count: [:pair | [:a :b | a > b] valueWithArguments: pair].
bag add: count
].
bag sortedElements

"Squeak =>{
0->981.
1->9873.
2->44008.
3->117136.
4->205258.
5->246203.
6->204286.
7->117345.
8->44247.
9->9702.
10->961} "
0130デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:41:12.83ID:slnS35LM
続き
NB. 長さ100の配列で100000回試行
r =: (do1 "0) 100000$100

NB. r を表示
r
=> 43 77 58 31 23 36 59 26 85 15 73 72 4 34 0 26 22 26 85 70 95 2 64 46 22 84 22 86 78 39 51 34 92 94 68 98 47 38 68 92 48 43 19 97 80 18 13 65 76 79 17 88 19 39 72 74 16 54 32 11 99 3 80 32 94 25 87 91 ...

NB. 0...100 の各数値の出現数
(i. 101) (count "0 1) r
=> 109 107 118 94 104 93 98 100 76 87 97 102 93 98 101 94 94 90 112 107 92 103 109 97 112 89 113 118 97 108 96 81 86 103 87 102 107 101 95 90 96 102 96 87 100 88 108 115 97 119 129 104 94 100 104 101 114...

NB. グラフ化
plot (i. 101) (count "0 1) r
https://i.imgur.com/QSKqVC6.jpg

一様分布っぽい
0132デフォルトの名無しさん
垢版 |
2018/10/17(水) 17:47:40.41ID:slnS35LM
理屈で考えると乱数がどんな分布でも a、b の分布が同じならコレの結果は常に同じ分布か
0133デフォルトの名無しさん
垢版 |
2018/10/17(水) 19:01:16.05ID:wdgUzBYj
なんか書き込めん…

>>131

たしかに^^;

pairs := (random next: N) sort with: (random next: N) sort collect: [:a :b | {a. b}].

で同じ分布になった
0134デフォルトの名無しさん
垢版 |
2018/10/17(水) 22:28:10.42ID:9jVKFKz5
ハローワールドの次にやる問題ってなんだろう
0135デフォルトの名無しさん
垢版 |
2018/10/17(水) 22:28:34.01ID:Ny9Q/0jK
ハローワークへ行きなさい
0138デフォルトの名無しさん
垢版 |
2018/10/18(木) 09:27:49.01ID:xtVP5nmJ
>>137
echoコマンドの実装ってことじゃない?
\0xxx や \n も解釈するようなの作ると初心者には結構勉強になるかも。
0141デフォルトの名無しさん
垢版 |
2018/10/19(金) 16:49:17.22ID:F1UCQFsO
お題
標準入力から入力したデータをそのまま標準出力人出力する
0142デフォルトの名無しさん
垢版 |
2018/10/19(金) 17:05:33.84ID:veK9KPY5
http://3dnchu.com/archives/tree-it/
このようなソフトはvisual studioで作るんですか?
なんの言語がいいか教えてください
0143デフォルトの名無しさん
垢版 |
2018/10/19(金) 17:15:05.14ID:gPrGaWTX
>>141
cat
0148デフォルトの名無しさん
垢版 |
2018/10/20(土) 03:08:59.15ID:gD7ZVb6v
iso-8859-2を入力したら文字化けしたりUTF-7を入力したら文字化けしなかったりするのは美しくないから文字コードを指定させないといかん
0149デフォルトの名無しさん
垢版 |
2018/10/20(土) 05:27:36.15ID:qwv4GmvH
>>146
Kotlin
https://paiza.io/projects/jg9Pa-PO2UCwSLFPL3draw

入力はデフォルトのエンコーディングで Java のライブラリ内部で Unicode に自動変換させ、出力は UTF-8 になると想定して作られている。
つまり元の Unicode で \x0080 以上は UTF-8 だと全てマルチバイトになるので化けるようにしてある。
化け方は2通りでサロゲートペアの文字は % になりその他は * になる。
0150デフォルトの名無しさん
垢版 |
2018/10/20(土) 17:10:58.56ID:hxCjYBWY
>>141 Io
File standardInput contents print
0151デフォルトの名無しさん
垢版 |
2018/10/20(土) 17:46:57.83ID:cv2X893a
お題: 超簡単なステートマシン
以下の3つのデータがランダムに入力される。
1: hi
2: wake up
3: sleep
1が入力された場合、状態がwake upであれば「hello」、状態がsleepであれば「zzz...」と出力せよ。
2が入力されたら状態をwake upに、3が入力されたら状態をsleepに移行せよ。
0152デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:05:02.67ID:Nttc2RvP
>>151
つまり、hi以外で2、3に該当しない奴も無視で良いの?(hiは無視で良いんだよね)

データは勝手に標準入力にするけど。
(リダイレクトでファイルからに出来るし)
0153デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:08:05.20ID:Nttc2RvP
あれ、違うぞ?
hiが入力された時、「かつ」wake upだったら”hello”出力か。
んでsleepなら”zzz...”ね。
それ以外無視と。
了解。
0154デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:12:34.08ID:Nttc2RvP
てか、1ー3の数字だけで良いわ。
状態の意味はわかったけど、状態の文字は要らんね。
0155デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:16:14.29ID:xvv7H8Vz
それ以外をどう考慮すべきかは書かれてないから、
ここは「3つのデータがランダムに入力される」を信じたフリをして手抜きをするのが吉

そんなことよりステートマシンなら初期状態は与えろよw
0156デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:28:45.80ID:AUqXYm6F
>>151
python3


state = "sleep"

while True:
x = input("> ")
if x == "hi":
print("zzz..." if state == "sleep" else "hello")
elif x == "wake up":
state = "wake up"
elif x == "sleep":
state = "sleep"
else:
print("invalid input.")
0157デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:42:18.95ID:Nttc2RvP
#include <stdio.h>
#include <conio.h>

int main(void)
{
char c,state = 0;

while(1)
{
c = getchar();
switch(c)
{
case '1':
if(state == '2')
{
printf("hello");
}
else if(state == '3')
{
printf("zzz...");
}
break;
0158デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:43:23.41ID:Nttc2RvP
case '2':
state = '2';
break;
case '3':
state = '3';
break;
default:
break;
0159デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:43:31.11ID:Nttc2RvP
}
}
return 0;
}

バッファ 無い方がいいのかと思ってバッファ無し版。(押したら即時入力)
conio.hは環境依存だけど、どうせWinだろ。
stdio.hのgetcだったら、バッファがあるからEnter押さないとだけど最初の1文字が入る。

面倒臭かったからステータスは数字に直さず文字そのまま使った。
0160デフォルトの名無しさん
垢版 |
2018/10/20(土) 20:20:44.01ID:WvTfEY4N
お題
2つの区間の共通部分を出力せよ

[1,3] [2,4] => [2,3]
(1,2) [1,2] => (1,2)
[0,100) (5,+inf) => (5,100)
(-inf,2] [1,+inf) => [1,2]
[1,2) [2,3) => {}
0162デフォルトの名無しさん
垢版 |
2018/10/21(日) 04:42:48.87ID:sz/a4USN
>>151
Kotlin
https://paiza.io/projects/RpML2-t6V1kplmMq_f0usw

初期状態は sleep にした。
wake up と sleep 以外の入力に対しては ERROR を出力して状態は変化させないようにした。
入力が何だったか分かるようにするために行頭に >> を付けて入力文字列を出すようにした。
0163デフォルトの名無しさん
垢版 |
2018/10/21(日) 04:53:27.38ID:sz/a4USN
>>151
Perl の1行プログラム

perl -ne 'BEGIN{$s=0;%x=("sleep"=>0,"wake up"=>1);%r=(0=>"zzz...",1=>"hello")}print ">> $_";chomp;\
if(defined($x{$_})){$s=$x{$_}}elsif($_ eq "hi"){print"$r{$s}\n"}else{print "ERROR\n"}'

仕様は>>162と同じ。
1行が長くなったので1行目の行末に \ を入れて2行に分けて書いてある。
0165デフォルトの名無しさん
垢版 |
2018/10/21(日) 09:40:05.59ID:UVDgsDD7
>>151 GNU Smalltalk
入力は、数値ではなくメッセージで
状態推移は、クラスチェンジで(つまりインスタンス変数なし&条件分岐なし)
…な感じで、他言語では思いつきにくい実装で遊んでみました

Object subclass: Machine [
wakeUp [ ^self ]
sleep [ ^self ]
hi [ self subclassResponsibility ]
state [ ^self class displayNl ]
Other := nil.
]
Machine class extend [ new [ ^WakeUp basicNew ] ]
Machine subclass: WakeUp [ hi [ 'hello' displayNl ] ]
Machine subclass: Sleep [ hi [ 'zzz...' displayNl ] ]
Machine extend [ Other := Sleep basicNew ]
WakeUp extend [ sleep [ ^self become: Other ] ]
Sleep extend [ wakeUp [ ^self become: Other ] ]

| machine |
machine := Machine new.
machine state. "=> WakeUp "
machine hi. "=> hello "
machine sleep; state. "=> Sleep "
machine hi. "=> zzz... "
machine wakeUp; state. "=> WakeUp "
machine wakeUp; state. "=> WakeUp "
machine sleep; state. "=> Sleep "
machine sleep; state. "=> Sleep "

https://ideone.com/vyCRfq
0166デフォルトの名無しさん
垢版 |
2018/10/21(日) 11:09:36.22ID:S2kctYlU
>>151
PowerShell、初期状態は 'Sleep'

function StateMachine {
 param([parameter(ValueFromPipeline=$true)][string]$Event)
 begin { $InSleep = $true }
 process {
  switch($Event){
  'hi'{ Write-Host "$(if($InSleep){'zzz...'}else{'hellow'})"}
  'wake up'{$InSleep=$false}
  'sleep'{$InSleep=$true}
  }
 }
}
'hi','sleep','hi','wake up','hi' | StateMachine
0167デフォルトの名無しさん
垢版 |
2018/10/21(日) 18:51:44.61ID:7SU77e8C
>>160
Python3
https://ideone.com/BBteSk
infは対応してないので1億とか適当な大きい値で代用
0168デフォルトの名無しさん
垢版 |
2018/10/21(日) 22:29:32.21ID:4ZLg1Jin
>>141 Lua
io.write(io.read("*a"))
0169デフォルトの名無しさん
垢版 |
2018/10/22(月) 01:45:31.26ID:mc31Kn/b
>>2
これおかしくね?
0171デフォルトの名無しさん
垢版 |
2018/10/23(火) 21:37:05.53ID:HCMpmlk6
お題
Excel列番号の数字表記とアルファベット表記を相互変換せよ

A => 1
AA => 27
ABC => ?
26 => Z
266379 => ?
0173デフォルトの名無しさん
垢版 |
2018/10/23(火) 22:19:56.82ID:UJUp/CV/
>>171 Ruby
f=->n{n.to_s(26).tr('0-9a-p',r='@-Y').sub(/(.)@/){$1.tr('A-Z',r)+?Z}.delete ?@}
g=->s{s.tr('A-Z','0-9a-p').to_i(26)+(26**s.length-1)/25}
puts '%s => %s'%[$_.chop!,~/\d/?f[$_.to_i]:g[$_]]while gets
# =>
A => 1
AA => 27
ABC => 731
26 => Z
266379 => ODAI
0175デフォルトの名無しさん
垢版 |
2018/10/23(火) 23:51:06.93ID:H259Ae8g
var trans = alpha => parseInt((parseInt(alpha, 36) - parseInt('9'.repeat(alpha.length), 36)).toString(36), 26)

trans('A')
//=> 1
trans('AA')
//=> 27
trans('ABC')
//=> 731

順変換だけやってみたけどすごい不安…
Aがゼロ的な物なのか1的な物なのかこんがらがる…
0176デフォルトの名無しさん
垢版 |
2018/10/24(水) 00:17:51.17ID:n2SwZ/Io
>>175
Aは0扱いでよい。
与えられた文字列を str にとして x = str[A-Zの26進数] に対して
求める数 f(x) f N\{0} -> N\{0} は
f(x) = x + (26**g(x) - 1)/25
(g(x) := x == 0 ? 1 : [log_26(x)] + 1).
f は全単射なので逆写像f^(-1)が存在するので
f と f^(-1) が答え.
0178デフォルトの名無しさん
垢版 |
2018/10/25(木) 11:51:35.92ID:3ObU9lli
>>171 Pharo/Squeak Smalltalk

| fromExcelColm toExcelColm |

fromExcelColm := [:str | str asByteArray reversed - 64 polynomialEval: 26].

toExcelColm := [:n |
| nn digits |
nn := n.
digits := OrderedCollection new.
[(nn := nn - 1) >= 0] whileTrue: [digits addFirst: nn \\ 26. nn := nn // 26].
(digits asByteArray + 65) asString
].

fromExcelColm value: 'A'. "=> 1 "
fromExcelColm value: 'AA'. "=> 27 "
fromExcelColm value: 'ABC'. "=> 731 "
toExcelColm value: 26. "=> 'Z' "
toExcelColm value: 266379. "=> 'ODAI' "
fromExcelColm value: 'EXCEL'. "=> 2708874 "
toExcelColm value: 2788185942068. "=> 'MICROSOFT' "
0179デフォルトの名無しさん
垢版 |
2018/10/25(木) 12:50:39.12ID:hw/Q19JU
>>175
それ Z の時に失敗しない?

他の言語でやってみて失敗したので足したり引いたりする数を色々ひねったらうまく行ったけどね。
0181デフォルトの名無しさん
垢版 |
2018/10/25(木) 16:39:59.02ID:wLNEFoo1
>>176
>Aは0扱いでよい。
>与えられた文字列を str にとして x = str[A-Zの26進数] に対して

それだと "A" も "AAAAAA" も x = 0 になるから g がダメだな
0182デフォルトの名無しさん
垢版 |
2018/10/25(木) 16:46:00.18ID:9VVQwm/j
やっぱり36進数[0-9a-z]使った横着は出来ないのか…
0185デフォルトの名無しさん
垢版 |
2018/10/25(木) 17:46:06.11ID:wLNEFoo1
デコードは A-Z を 1 から 26 とする 0 を持たない変則 26 進数として数値化すりゃあいいんだよ
以下J

26 #. _64 + a. i. 'ABC'
==> 731

26 #. _64 + a. i. 'ODAI'
==> 266379

エンコードはちょっと1行では説明しにくい
0187デフォルトの名無しさん
垢版 |
2018/10/25(木) 17:53:10.85ID:hw/Q19JU
>>182
もう一捻り必要なんだよ。
考えてくと何れわかる。
0188デフォルトの名無しさん
垢版 |
2018/10/25(木) 18:17:57.30ID:wLNEFoo1
>>186
下からn桁目の重み付けが 26^n で(1番下を0桁とする)、
各桁の数字が1〜26なんだよ
これで0以外の数は表記できる

AAA は 1*26*26 + 1 *26 + 1
ABC は 1*26*26 + 2 *26 + 3
YAZ は 25*26*26 + 1*26 + 26
0190デフォルトの名無しさん
垢版 |
2018/10/25(木) 20:05:21.59ID:na0fZQbz
全くの素人質問で申し訳ありませんが、お知恵拝借したくお願いします。

http://www.cjh.com.cn/
の画面左まんなか辺りの

三峡水? 25日 19?00分 174.64 -(入) 15200(出)

を自動で毎日夜21時に取得して

https://egg.5ch.net/test/read.cgi/river/1507607675/

に自動で書き込む方法はありますでしょうか?
長年誰かが手写しでしたが、死屍累々でございます、、、、なのです、、
0195デフォルトの名無しさん
垢版 |
2018/10/25(木) 23:59:06.56ID:9OC64j5F
>>190
2chのcgiは仕様変更ちょいちょいあって追いかけるの面倒だから書き込みは自動保守ツールとか任せるとして、
powershellのスクリプトをタスクスケジューラで動かして出力をテキストファイルにリダイレクトして自動保守ツールに食わせりゃいいんじゃね
スクリプトはこんな感じかね

$html= Invoke-WebRequest -UseBasicParsing http://nweb.cjh.com.cn/sssqold.html
$pattern = "`"oq`":`"(\d*)`",`"q`":`"(\d*)`"[^}]+`"三峡水库`",`"tm`":(\d+),[^}]+`"z`":`"([0-9\.]+)`""
if ($html.RawContent -match $pattern) {
$time = (Get-Date "1970/1/1 0:0:0 GMT").AddMilliseconds($Matches[3])
"三峡水库 {2:dd}日 {3}m {1}(入) {0}(出)"-f $Matches[1],$Matches[2],$time,$Matches[4]
}
0198デフォルトの名無しさん
垢版 |
2018/10/26(金) 19:50:36.71ID:/kG4owY9
お題
ぷよぷよの連鎖数を求めよ。0-9がぷよ、.が空きマスを表す。

0013
0123
122.
013.
0123
=> 4

9.9.9.9.9.9
.9.9.9.9.9.
=> 1

0123
3012
2301
1230
=> 0
0200デフォルトの名無しさん
垢版 |
2018/10/26(金) 20:51:49.05ID:8JGFizba
>>198
2番目のパターンは実際のゲームではあり得ないものだとは思うが、とにかく何もない所があれば落ちてそれから何連鎖するかを求めればいいのかな?
0201デフォルトの名無しさん
垢版 |
2018/10/29(月) 19:22:44.11ID:PHNS982/
>>171
Kotlin
https://paiza.io/projects/1ZkMBpYcAWRTjh1ic8RIIQ

入力が A-Z なら数値に変換(小文字も可)、数字だけの文字列はいわゆるA1の形式に変換。それ以外は入力異常でエラー。
0203デフォルトの名無しさん
垢版 |
2018/10/30(火) 21:09:38.22ID:RM3bKAov
お題: ページャーを実装してください。標準入力から以下のデータが与えられます。不正な入力にはいい感じに対応してください。

 1行目: 現在のページ番号
 2行目: 総ページ数
 3行目: 表示するリンク数

例1
入力:
1
10
5
出力:
[1] 2 3 4 5

例2
入力:
5
10
5
出力:
3 4 [5] 6 7

例3
入力:
10
10
5
出力:
6 7 8 9 [10]
0204デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:21:08.83ID:Mk80lxDb
>>203 perl

$now = shift or die $! ;
$all = shift or die $! ;
$show = shift or die $! ;

$x = 1 + int $show/2;
$y = $all - $x + 1;

if($now <= $x){
$start = 1;
}elsif($y <= $now){
$start = $all - $show + 1;
}else{
$start = $now - int $show/2;
}

$end = $start + $show - 1;
print join " ", map{ $_ == $now ? "[$_]" : "$_" }($start..$end);
0205デフォルトの名無しさん
垢版 |
2018/10/30(火) 22:51:09.23ID:N8SwgYLQ
>>203
Python3

current = int(input())
total = int(input())
n_links = int(input())

assert 1 <= current <= total and n_links <= total

if current <= n_links//2:
seq = range(1, n_links+1)
elif current >= total-n_links//2:
seq = range(total-n_links+1, total+1)
else:
left = current - n_links//2
right = current + n_links//2 + (0 if n_links%2 == 0 else 1)
seq = range(left, right)

seq = ["[{}]".format(s) if s == current else str(s) for s in seq]
print(" ".join(seq))
0207デフォルトの名無しさん
垢版 |
2018/11/02(金) 11:25:03.96ID:b7bQuZgR
>>203 Squeak Smalltalk

| fn |

fn := [:pg :tot :wd |
| start pages |
start := pg - (wd // 2) min: tot - wd + 1 max: 1.
pages := start to: start + wd - 1.
(pages collect: [:x | (x = pg ifTrue: ['[{1}]'] ifFalse: ['{1}']) format: {x}]) joinSeparatedBy: ' '
].

#((1 10 5) (5 10 5) (10 10 5)) collect: [:tri | fn valueWithArguments: tri]

"=> #('[1] 2 3 4 5' '3 4 [5] 6 7' '6 7 8 9 [10]') "
0212デフォルトの名無しさん
垢版 |
2018/11/04(日) 13:46:33.88ID:pidkuN2F
>>203
Haskell

main = mapM_ put [(1,10,5),(5,10,5),(10,10,5)]

put (x,y,z) = return (pager x y z) >>= print

pager a b c | a <= (c `div` 2) = mklist a $ take c [1..b]
pager a b c | a > (b - c `div` 2) = mklist a $ drop (b - c) [1..b]
pager a b c = mklist a $ take c $ drop (a - c `div` 2 -1) [1..b]

mklist a xs = [small a xs , jst a xs , big a xs]

small a = filter (< a)

big a = filter (> a)

jst a = filter (== a)

結果
[[],[1],[2,3,4,5]]
[[3,4],[5],[6,7]]
[[6,7,8,9],[10],[]]

[executed "pager.hs"]
0213デフォルトの名無しさん
垢版 |
2018/11/04(日) 13:47:27.44ID:pidkuN2F
結果が切れた。。。
改めて結果。

[[],[1],[2,3,4,5]]
[[3,4],[5],[6,7]]
[[6,7,8,9],[10],[]]

[executed "pager.hs"]
0214デフォルトの名無しさん
垢版 |
2018/11/05(月) 17:57:48.99ID:GRwYYoWB
お題
3つの自然数A,B,Cが与えられる。
初項A、第二項Bであるフィボナッチ数列に対してCがその数列に含まれるかを判定せよ。
含まれる場合は第何項であるかを返し、含まれない場合は偽を返すものとする。
0215デフォルトの名無しさん
垢版 |
2018/11/05(月) 20:17:41.49ID:0wNeh4D8
>>214 python

def fibo(a, b):
_yield a
_yield b
_while True:
__yield a + b
__a, b = b, a+b

def func(fb, n):
_count = 1;
_while True:
__num = fb.next()
__print "{} th term = {}".format(count, num)
__if num >= n:
___if num == n:
____return count
___else:
____return False
__count = count + 1
_return False


a, b, c = 1, 1, 100
print func(fibo(a, b), c)
0218デフォルトの名無しさん
垢版 |
2018/11/05(月) 23:33:04.48ID:6d8cBeMO
>>214 Ruby
require 'matrix'
def hoge(a, b, c)
rm, fm, im = Matrix[[1, 1], [1, 0]], Matrix[[1, 0], [0, 1]], Matrix[[b], [a]]
(0..Float::INFINITY).each do |n|
m = fm * im
return m[1, 0] > c ? false : n if m[1, 0] >= c
fm *= rm
end
end

p hoge(0,1,88) #=> false
p hoge(0,1,89) #=> 11
p hoge(0,1,90) #=> false
0220デフォルトの名無しさん
垢版 |
2018/11/06(火) 07:54:03.24ID:GFB90oOd
C

初項の次第二項って書いてるのに、みんな何故0始まりなの。。。

#include <stdio.h>

int fibin(int,int,int);

int main(void)
{
for(int i = 0;i < 6;i++) printf("%d:%d\n",i,fibin(1,1,i));
return 0;
}

int fibin(int fst,int snd,int num)
{
int i = 2,fib = fst;

if(fst == num) return 1;
if(snd == num) return 2;

while(fib != num)
{
fib = fst;
fib += snd;
if(fib <= num) i++;
else return -1;
fst = snd;
snd = fib;
}
return i;
}
0221デフォルトの名無しさん
垢版 |
2018/11/06(火) 09:23:46.31ID:jl2IXbjS
(A,B,C)が(0,0,0),(0,1,0),(0,1,1),(1,0,0),(1,0,1)の時はCが無限回、(1,1,1),(0,X,X),(X,0,X),(X,X,X)(2≦X)の時はCが2回出現することがあるが考慮した方が良いか?
0222デフォルトの名無しさん
垢版 |
2018/11/06(火) 10:48:03.28ID:VF9SVEaj
A,Bによっては無限ループになり得ないか?
0223219
垢版 |
2018/11/06(火) 11:49:20.62ID:13CfGTjW
そういやa,bが0,0だと足しても0だからcも0じゃないと無限ループするかな。
0224219
垢版 |
2018/11/06(火) 11:52:26.86ID:13CfGTjW
した。見事にした。
足してゼロなら特別扱いして終わらせる処理がないとダメだったということだな。
今さら直す気は起きんが。
0225デフォルトの名無しさん
垢版 |
2018/11/06(火) 11:52:29.61ID:GFB90oOd
>>221
今まで投稿されてるコード見る限りは最初に見つけた時点で停止。

>>222
自然数って指示だから止まるはずだけど、関数の引数側でunsigned指定して(Javaとかだとuint)おいた方が良いかもね。
0226デフォルトの名無しさん
垢版 |
2018/11/06(火) 12:34:42.11ID:jAy4xbYh
>>214 Squeak/Pharo Smalltalk

| fibGen fn |

fibGen := [:fst :snd |
Generator on: [:g |
| a b |
a := fst. b := snd.
g yield: a. [b := a+b. g yield: (a := b-a)] repeat
]
].

fn := [:A :B :C |
| count fib last |
count := 1. fib := fibGen value: A value: B.
[(last := fib next) < C] whileTrue: [count := count + 1].
last = C ifTrue: [count] ifFalse: [false]
].

fn value: 1 value: 1 value: 89. "=> 11 "
fn value: 1 value: 1 value: 90. "=> false "
0227デフォルトの名無しさん
垢版 |
2018/11/06(火) 14:46:16.34ID:GFB90oOd
Haskell

main = mapM_
(\x -> putStr (show x ++ ":") >> print (fibin 0 1 x))
[0..6]

fibin 0 0 c | c /= 0 = Nothing
fibin a b c = lookup c $
zip (take (10 + c) fib) [1..]
where fib = a:b:(zipWith (+) fib (tail fib))
0229デフォルトの名無しさん
垢版 |
2018/11/06(火) 22:17:30.30ID:Nv8RqtnA
お題
xy平面上の点がn+1個与えられる(各点のx座標は互いに異なる)
与えられた点をすべて通る関数 y=a[i]x^n+...+a[1]x+a[0] の係数a[i]を求めよ

[入力]
点の個数(n+1)
x[0] y[0]
...
x[n] y[n]

[出力]
a[n] ... a[0]

2
0 1
1 3
=> 2 1 (y=2x+1)


1
100 100
=> 100

5
0 1
-1 5
2 2
4 -1
1 0
=> -2/15 4/15 49/30 -83/30 1
0230デフォルトの名無しさん
垢版 |
2018/11/06(火) 23:24:52.38ID:bpzsP6yI
【ラグランジュ補間】
Σ[i=1,n] )y[i]Π[k≠i](x-x[k])/ (x[i]-x[k])
この係数を計算するだけ。

こういう純数学的な処理は、お題としてはどうかな?
応用上、常に展開した係数を求めるのに意味がある
とも限らんし、精度評価が重要だったりとか
0231デフォルトの名無しさん
垢版 |
2018/11/06(火) 23:43:20.04ID:iVEsbroy
>>229
線形代数は偉大

import numpy as np
N = int(input())
x, y = [], []
for i in range(N):
_x, _y = map(float, input().split())
x.append(_x)
y.append(_y)

x = np.array(x)
y = np.array(y)
px = np.array([x**k for k in range(N)])

a = np.dot(y, np.linalg.inv(px))
print(a[::-1])
0232デフォルトの名無しさん
垢版 |
2018/11/06(火) 23:51:57.59ID:bpzsP6yI
[1 x[0] x[0]^2...x[0]^n] [a[n]] =[y[0]]
[1 x[1] x[1]^2... x[1]^n] [a[n-1]]=[y[1]
[1 x[2] x[2]^2...x[2]^n] [a[n-2]]=[y[2]]
...
[1 x[n] x[n]^2 .... x[n]^n] [a[0] ]=[y[n]]

を解かせたというわけか...
0234デフォルトの名無しさん
垢版 |
2018/11/07(水) 00:56:30.16ID:yYgCxC/p
お題: 四則演算の文字列を受け取って計算結果を返す
1+2+3+4
=> 10

4+5*6-2*3
=> 28

5+12*(2+9/3)/((2+3)*5-7*3)
=> 20
0235デフォルトの名無しさん
垢版 |
2018/11/07(水) 00:58:06.61ID:B66LtM9k
>>229 Ruby
s = ->a, b{a.zip(b).map{|i, j| i - j}}
t = ->a, k{a.map{|i| i * k}}
n = gets.to_i - 1
m = $<.read.split($/).map{|e| f[n, *e.split.map(&:to_r)]}
(1..n+1).each do |r|
(nonzero = m[r- 1..-1].find_index{|e| e[r].nonzero?} + r - 1) && next
m[r - 1], m[nonzero] = m[nonzero], m[r - 1]
m[r - 1] = t[m[r - 1], 1/m[r - 1][r]]
[*[*(0..n)] - [r - 1]].each{|i| m[i] = s[m[i], t[m[r - 1], m[i][r]/m[r - 1][r]]]}
end
puts m.transpose[0].map{|i| i.denominator == 1 ? i.to_i : i} * ' '

2
0 1
1 3
#=> 2 1 (y=2x+1)

3
1 1 1 1
5 4 2 1
8 9 3 1
#=> -1/2 11/2 -4
0236デフォルトの名無しさん
垢版 |
2018/11/07(水) 01:00:36.71ID:B66LtM9k
>>235 訂正 尚複数解存在する時は最も次数の小さいものを出力
2
0 1
1 3
#=> 2 1

3
1 1
5 2
8 3
#=> -1/2 11/2 -4
0238デフォルトの名無しさん
垢版 |
2018/11/07(水) 02:11:40.28ID:B66LtM9k
>>235 訂正
s = ->a, b{a.zip(b).map{|i, j| i - j}}
t = ->a, k{a.map{|i| i * k}}
n = gets.to_i
m = $<.read.split($/).map{|e| f[n + 1, *e.split.map(&:to_r)]}
n.times do |r|
  (nonzero = m[r..-1].find_index{|e| e[r].nonzero?} + r) || next
  m[r], m[nonzero] = t[m[nonzero], 1/m[nonzero][r + 1]], m[r]
  [*[*(0..n + 1)] - [r]].each{|i| m[i] = s[m[i], t[m[r], m[i][r + 1]/m[r][r + 1]]]}
end
puts m.transpose[0].map{|i| i.denominator == 1 ? i.to_i : i} * ' '
0239デフォルトの名無しさん
垢版 |
2018/11/07(水) 12:58:28.67ID:jk7t6Ngg
>>229 Squeak Smalltalk

| fn |

fn := [:points |
| xs ys fi gi |
xs := points collect: #x.
ys := points collect: #y.
fi := [:x :i | ((1 to: xs size) copyWithout: i) inject: 1 into: [:prod :k | prod * (x - (xs at: k))]].
gi := [:i |
(0 to: xs size - 1) collect: [:n | n = 0 ifTrue: [1] ifFalse: [
(Array streamContents: [:ss |
(xs copyWithoutIndex: i) combinations: n atATimeDo: [:comb |
ss nextPut: (comb negated reduce: #*)]
]
) sum
]]
].
(ys * ((1 to: xs size) collect: gi) / (xs collectWithIndex: fi)) sum
].

fn value: {0@1. 1@3}. "=> #(2 1) "
fn value: {100@100}. "=> #(100) "
fn value: {0@1. -1@5. 2@2. 4@ -1. 1@0}. "=> {(-2/15) . (4/15) . (49/30) . (-83/30) . 1} "
0240デフォルトの名無しさん
垢版 |
2018/11/07(水) 13:01:59.20ID:jk7t6Ngg
>>229 Pharo Smalltalk w/PolyMath >>231っぽく

"Metacello new
repository: 'github://PolyMathOrg/PolyMath:master/src';
baseline: 'PolyMath';
load"

| fn |

fn := [:points |
| xs ys xp |
xs := points collect: #x.
ys := points collect: #y.
xp := (PMMatrix rows: ((xs size - 1 to: 0 by: -1) collect: [:m | xs raisedTo: m])) transpose.
(xp inverse * ys asPMVector) asArray
].

fn value: {0@1. 1@3}. "=> #(2 1) "
fn value: {100@100}. "=> #(100) "
fn value: {0@1. -1@5. 2@2. 4@ -1. 1@0}. "=> {(-2/15) . (4/15) . (49/30) . (-83/30) . 1} "
0241デフォルトの名無しさん
垢版 |
2018/11/07(水) 18:36:22.03ID:LRSzKna1
お題
Windows bitmap画像(.bmp)は通常、下から上に向かって画像が記録されているが、
高さに負の値を指定することで、上から下へ向かって画像を記録することができる。
これを利用してbmp画像の上下を反転せよ。
0243219
垢版 |
2018/11/07(水) 19:20:37.53ID:bimd4khF
>>242
プログラムを作るのがお題だろう。
ここはプログラミングのお題スレなんだからこれでいいんだよ。
むしろ人がある程度プログラムの仕様を考えなければならないような数学問題みたいなやつがダメなお題。
0244デフォルトの名無しさん
垢版 |
2018/11/07(水) 19:56:07.71ID:5DjOPE5m
>>241 Ruby
in_fname = 'hoge.bmp'
out_fname = 'hoge_ud.bmp'

File.binwrite(out_fname, File.binread(in_fname).tap{|b| b[22, 4] = [-b[22, 4].unpack(?l).pop].pack(?l))
0245デフォルトの名無しさん
垢版 |
2018/11/07(水) 20:06:47.46ID:umLQTzF1
>>243
あなたがそういう問題しか好きじゃないか解けないだけでしょ
スレ民の総意みたいな言い方しないで
0246デフォルトの名無しさん
垢版 |
2018/11/07(水) 20:14:12.09ID:Lazgvcn1
>>243
紙とえんぴつで解ける数学問題みたいなやつがプログラミングのお題としてダメなのは同意なんだけど>>241は例えば
画像の上下を反転せよ。入力はbmpとする。
とかのほうが良かったんじゃないかな。
愚直に配列いじる奴を尻目に仕様を利用して華麗に解くやつが現れる。
これがいいんじゃないか。
0247219
垢版 |
2018/11/07(水) 21:05:56.46ID:bimd4khF
>>245
スレ民の総意がどうであろうともこのスレはプログラミングのお題スレなんだからプログラミングのお題になってないのはスレチであることには代わりがない。
適切なスレに書くかまたはなければ新たにそれ用のスレを作って書けば良い。

>>246
それでもいいかも知れないが問題が簡略化されているために自分で仕様を調べるというプログラミングとは少し違う作業が発生するな。
更に仕様の盲点に気付くかというクイズ的な要素もある。
0248デフォルトの名無しさん
垢版 |
2018/11/07(水) 21:15:41.59ID:wOCAlbJb
まあ式を実装するだけの数学問題と大差ないお題にしてしまうような要素は不要だったな
0249デフォルトの名無しさん
垢版 |
2018/11/07(水) 21:15:43.65ID:h4FWJh3K
>>245
>>244 じゃないけど、数学の問題は問題自体が分からないから手が出せない。
高卒でも分かるように噛み砕いて貰えれば書けるかもだが。
0250デフォルトの名無しさん
垢版 |
2018/11/07(水) 21:17:30.61ID:h4FWJh3K
そう考えると、プログラミングの能力って言語覚えるより問題を理解する能力だよな。。。
0251デフォルトの名無しさん
垢版 |
2018/11/07(水) 22:05:04.79ID:DuFCNJWg
噛み砕くとこうだな
ファイルの22バイトめから保存されている4バイト長の整数値の符号を反転せよ。
ただし数値は下位バイトから順に格納されており、負数は2の補数表現を用いるものとする。
0252デフォルトの名無しさん
垢版 |
2018/11/07(水) 22:06:17.13ID:DuFCNJWg
出力は反転した数値以外は元のファイルと同じ内容のファイルとする

も要るか
0253デフォルトの名無しさん
垢版 |
2018/11/07(水) 22:14:53.17ID:h4FWJh3K
>>251
ごめん
>>229-230 の方が分からないんだ。。。
0255デフォルトの名無しさん
垢版 |
2018/11/08(木) 03:03:27.47ID:yQlGi5bN
>>243
>ここはプログラミングのお題スレなんだからこれでいいんだよ。
>むしろ人がある程度プログラムの仕様を考えなければならないような数学問題みたいなやつがダメなお題。

スレタイ『プログラマーは何を勉強すべきか?』

プログラマーは何を勉強すべきかということだが、最新のトレンドに適応した勉強が必要だ。
俺は今までこれだけ沢山勉強してきたという人も、実は最新のトレンドに適応していない可能性もある。

5、結論
  以上の結果より導き出される京大英語で8割を超すための対策は、「ネイティブ英語とは何か」
を定義づけして学ぶことに尽きるだろう。
  たとえば、「この料理はまずい」という英作文なら受験生に多いのが
 This dish tastes poor.
しかし、これは評価されない。なぜなら、英語として正しくてもマナー違反。英検英語なら否定文にして、
This dish isn't good. これでマナーは改善された。
  しかし、ネイティブなら I don't like this dish. と言うだろう。本当に不味い場合は、
Yuck! と叫ぶ。そういう違いだ。
 問題は、
「受験英語の参考書や問題集で取り上げられている構文や表現が現実に使われている英語と違う」
  という事実。それを指導している教師や講師も、外国生活がなく50年前の表現を気づかずに指導して
いること。そのために、校内テストや模試で高得点や上位の順位をとっても落ちてしまうこと。
https://storys.jp/story/18159
0256デフォルトの名無しさん
垢版 |
2018/11/08(木) 03:57:11.05ID:AySxWi85
「この料理はまずい」の時点でマナー違反なんだからそのまま訳すのが正しい
料理がまずいときの一言を答えさせたいならそう出題すればいいことだ

そういう出題側の質とか意識してんのかなこいつ
0257デフォルトの名無しさん
垢版 |
2018/11/08(木) 04:48:49.11ID:QHwNiY6E
数学のように、頭の中で正しいかどうかを、証明するような問題は、面倒くさい。
このスレでは、頭を使わず、単純な総当たり問題が好まれる

その方が、プログラミング的な問題
0258デフォルトの名無しさん
垢版 |
2018/11/08(木) 05:18:56.02ID:HOEn5tLb
お題:
自然数Nと、N個の「半角の小文字アルファベットと数字からなる1文字以上の文字列」が標準入力から順次与えられます。
文字列をNatural Sort*して標準出力から順次出力してください。
追加問題:
お題1を正規表現を使わず実装してください。

*:
"a120"と"a13"が与えられた場合、"a13","a120"の順番にソートするようにする。
また、今回は"a01"と"a1"が与えられた場合、連続する数字が少ない方を先にする、すなわち"a1","a01"の順になるようにするものとし、
"0"と"a"のどちらが先に来るかについては自由とします。
0259デフォルトの名無しさん
垢版 |
2018/11/08(木) 05:51:13.63ID:yQlGi5bN
>>257
>数学のように、頭の中で正しいかどうかを、証明するような問題は、面倒くさい。
>このスレでは、頭を使わず、単純な総当たり問題が好まれる

ならば、「チンポがシコシコする」という日本語表現は、文法的に正しいのか?

チンポ「を」シコシコするのではなくて、チンポ「が」シコシコする。この場合、「チンポ」は主語となる。

オブジェクト指向で言う「集約」は2種類あって、全体(俺)と部分(チンポ)が繋がっている場合と、
全体(俺)と部分(チンボ)が別々になっている場合とが考えられる。けれども「チンボ」はそれ自体
が独立した生き物であり、所有者の意思とは無関係に、勃起して「シコシコする」。
例えば寝てる時にエロい夢みて朝起きてみたらチンコが勃起して射精してたとか。

違うか?

「胸がドキドキする」は良いが、「チンポがシコシコする」はダメな理由を、50字以内で述べろ!
0260デフォルトの名無しさん
垢版 |
2018/11/08(木) 07:42:34.26ID:Tu3rCJEk
>>257
まあそうなんだけど、数学スレでガンガンプログラミング言語で答え出してる奴がいて正直羨ましい。
0261デフォルトの名無しさん
垢版 |
2018/11/08(木) 09:21:24.69ID:UCtqQ5sl
なぜそのスレで頑張らないのか。
二軍でヒーローになろうと思ってここで数学の問題出してるの?
0262デフォルトの名無しさん
垢版 |
2018/11/08(木) 09:28:43.02ID:Tu3rCJEk

私は出題者じゃ無いよ。
0263デフォルトの名無しさん
垢版 |
2018/11/08(木) 09:57:33.73ID:2oWgTmr1
>>261
>なぜそのスレで頑張らないのか。
>二軍でヒーローになろうと思ってここで数学の問題出してるの?

俺はただパソコンに向かって独り言ブツブツ言って、チンポがシコシコしてるだけだが?
0265デフォルトの名無しさん
垢版 |
2018/11/08(木) 10:23:04.41ID:Cbg63GbQ
>>259
君が何を言いたいのかよくわからない。
0266デフォルトの名無しさん
垢版 |
2018/11/08(木) 10:34:41.85ID:yQlGi5bN
>>265
『チンポ』についての生態学は、俺にもよくわからん。
0268デフォルトの名無しさん
垢版 |
2018/11/08(木) 14:52:40.11ID:9PdT3eEJ
>>267
>>258
>また、今回は"a01"と"a1"が与えられた場合、連続する数字が少ない方を先にする、すなわち"a1","a01"の順になるようにするものとし、
0274デフォルトの名無しさん
垢版 |
2018/11/08(木) 15:33:18.20ID:quzojjRV
ソートの問題、
連続する数字はその連を数値として比較しつつ同じ数値のときは桁数少を前としているわけだよな

つまり
a01a
a1b
a01b
をソートすると
a01a
a1b
a01b
0275デフォルトの名無しさん
垢版 |
2018/11/08(木) 16:29:56.18ID:Tu3rCJEk
>>258
Haskell

main = concat $ map qsort grop

grop = map filterlen [1..(maximum $ map length input)]

filterlen n = filter (\x -> n == length x) input

qsort [] = []
qsort (x:xs) = small ++ [x] ++ big
where small = qsort [a |a <- xs, a <= x]
big = qsort [a | a <- xs, a > x]

input = ["a130","a12","a001","a01","a1","1"]
0276デフォルトの名無しさん
垢版 |
2018/11/08(木) 16:31:19.84ID:Tu3rCJEk
input = ["a130","a12","a001","a01","a1","1"]
0277デフォルトの名無しさん
垢版 |
2018/11/08(木) 18:41:10.95ID:e5hl87sZ
>>274
>連続する数字はその連を数値として比較しつつ同じ数値のときは桁数少を前としているわけだよな

同じ数値のときじゃなくて全体が等しいときか
0279デフォルトの名無しさん
垢版 |
2018/11/08(木) 19:15:05.42ID:85A5tG8V
お題
M行N列の領域をジグザグスキャンするときの順序を求めよ

3 3
=>
1 2 6
3 5 7
4 8 9

4 2
=>
1 2
3 5
4 6
7 8

3 5
=>
01 02 06 07 12
03 05 08 11 13
04 09 10 14 15

1 8
=>
1 2 3 4 5 6 7 8
0281デフォルトの名無しさん
垢版 |
2018/11/08(木) 22:11:37.46ID:Tu3rCJEk
>>278
そう?
ナチュラルソートっての知らんけど、その結果見ても仕様通りと思うんだが。
0282デフォルトの名無しさん
垢版 |
2018/11/08(木) 22:16:02.65ID:EeFetNer
>>267を訂正 Ruby
puts$<.readlines.sort_by{|a|a.scan(/(\D*)(\d+)/).map{|i,j|[i,j.to_i,j.size]}}

# stdin
a01b2
a1b0002
a130
a12
a001
a1
1

# stdout
1
a1
a1b0002
a01b2
a001
a12
a130
0283デフォルトの名無しさん
垢版 |
2018/11/08(木) 23:33:47.08ID:TLTEncZh
誰に何を文句言うわけでもないがナチュラルソートってのは一般に
"01.25" < "1.5"
"01m 25cm" < "1m 35cm" とか
"Chapter 001 section 5" < "Chapter 1 section 6"
となるような順序での整列
逆でもいいけど

問題の仕様はどうかしらんが単に用語の解説ね
0284デフォルトの名無しさん
垢版 |
2018/11/08(木) 23:49:40.65ID:I6IWEGdd
今回の問題の仕様とは微妙に違うから回答にはならないけど

echo -e "01m30s\n1m45s\n02m03s" | sort -V
01m30s
1m45s
02m03s

ナチュラルソートならこうなるべきだな
0285デフォルトの名無しさん
垢版 |
2018/11/09(金) 09:07:23.82ID:cVPfgm+I
>>283-284の仕様で Ruby

args = [
  '01.25', '1.5', '01m 25cm', '1m 35cm',
  'Chapter 001 section 5', 'Chapter 1 section 6',
  '01m30s', '1m45s', '02m03s'
]

nsort = lambda do |args|
  f = ->str{str.scan(/(?=.)(\D*)(\d+(\.\d+)?)/).flat_map{|a, b| b.empty? ? [a] : [a, b.to_r]}}
  g = ->str{str.scan(/\d+/).map(&:size)}
  args.sort do |str1, str2|
    comparison = f[str1] <=> f[str2]
    comparison.zero? ? g[str1] <=> g[str2] : comparison
  end
end

p nsort[args]
#=>["01m30s",
"1m45s",
"01m 25cm",
"1m 35cm",
"01.25",
"1.5",
"02m03s",
"Chapter 001 section 5",
"Chapter 1 section 6"]
0286デフォルトの名無しさん
垢版 |
2018/11/09(金) 17:42:13.83ID:SNvr5Euv
>>265
『チンポ』については、自分でも良くわからない、何とも言えない不思議な生き物だ。
0287デフォルトの名無しさん
垢版 |
2018/11/09(金) 18:36:42.14ID:B4AEy6G3
お題
1以上N以下の奇数を並べた数の桁数を求めよ

3
=> 2 (13)

10
=> 5 (13579)

9999
=> 19445 (135...99979999)

123456789
=> ?

31415926535897
=> ?
0288デフォルトの名無しさん
垢版 |
2018/11/09(金) 18:45:16.11ID:DHGOZxva
>>287
桁数というか奇数が何個かって話やね。
わざわざ分かりにくい仕様とか、コミュ障かと。
0289デフォルトの名無しさん
垢版 |
2018/11/09(金) 18:47:33.93ID:DHGOZxva
ん、ああ。
10とか100とかになったら個数と桁数は違うか。
悪かった。
0292デフォルトの名無しさん
垢版 |
2018/11/09(金) 19:38:13.95ID:JsSTi+Gx
>>290
問題の意味がわからん。何か例を書いてくれ。
0295デフォルトの名無しさん
垢版 |
2018/11/09(金) 19:46:54.75ID:EUp1VEAA
>>287
Haskell

main = mapM_ print $ zip3 lst fosl fos

oddstr [] = []
oddstr (x:xs) = show x:oddstr xs

fo = map (\x-> filter (odd) [1..x]) lst

foo f = map (f.concat.oddstr) fo

fos = foo id

fosl = foo length

lst = [3,10,999,123456789,31415926535897]

コードはすぐ出来たけど、計算が終わらないw
奇数が多すぎてバッファに残ってなさそうだから、ファイルにリダイレクトし直しかな。。。
0296デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:06:34.46ID:JsSTi+Gx
>>287
スマホから直接一度も試さずに書くが、Kotlin だと理屈の上ではこれでできると思う。
nが最大値な。

println((1..n step 2).joinToString("").length)

かといってこんなのメモリ食うだけ。
0297デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:38:18.97ID:Zs2FyImb
>>287 Ruby

args = [0, 1, 2, 3, 10, 9999, 123456789, 31415926535897]

floor_log10 = -> n {r = 1; (0..n).find{ r *= 10; r > n}}
kotae = ->n{
x = floor_log10[n + 1]
((9*x - 1)*10**x + 10)/18 + (n-10**x+1)/2 * (x + 1) + (n < 8 ? n & 1 : 0)
}
args.each{|e| puts '%d => %d' % [e, kotae[e]]}
# =>
0 => 0
1 => 1
2 => 1
3 => 2
10 => 5
9999 => 19445
123456789 => 500000000
31415926535897 => 214355930195731
0299デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:58:02.15ID:lMSYlD+9
すまん。途中で誤爆した。
>>297
なんでこうなるの??
あと最後のn < 8 ? n & 1 : 0も数式で表わせる?
0300デフォルトの名無しさん
垢版 |
2018/11/09(金) 22:05:09.74ID:gJrymgLI
>>287
Python3

print(len("".join(map(str, range(1, int(input())+1, 2)))))

を実行したらフリーズしたので

odd = range(1, int(input())+1, 2)
keta = 0
for i in odd:
keta += len(str(i))
print(keta)
#==============
123456789
=> 500000000
31415926535897
=> 終わらん
0301デフォルトの名無しさん
垢版 |
2018/11/09(金) 22:09:18.25ID:EUp1VEAA
>>295
123456789の桁数は500000000ってのは分かった。
0302デフォルトの名無しさん
垢版 |
2018/11/09(金) 22:23:23.31ID:PBoRuHnu
>>299
0からnまでの奇数を並べてできる数の桁数をf(n)とすると(n >= 0)
p := [log10(n+1)] として n >= 10の時
f(n) = Σ[k は 0〜[(n-1)/2]]( (2k+1)の桁数 )
  = 1*(0〜9までの奇数の数) + 2*(10〜99までの奇数の数) + ...
+ p*(10^(p-1)〜10^p-1までの奇数の数) + (p+1)*(10^p〜nまでの奇数の数)
  = 1*5 + Σ[k は 2〜p]45k*10^(k-2) + (p+1)*[(n - 10^p + 1)/2]
  = 45/100*Σ[k は 1〜p]k*10^k + 1/2 + (p+1)*[(n - 10^p + 1)/2]
  = ((9p - 1)10^p + 1)/18 + 1/2 + (p+1)*[(n - 10^p + 1)/2]
  = ((9p - 1)10^p + 10)/18 + (p+1)*[(n - 10^p + 1)/2] …… (*)
n = 0, 2, 4, 8, 9 の時はちょうど (*)
n = 1, 3, 5, 7 時は (*) + 1 なので
f(n) = ((9p - 1)10^p + 10)/18 + (p+1)*[(n - 10^p + 1)/2] + (n < 8 ? n & 1 : 0)
末尾の項を無理やり数式にしたいなら
[8/(n + 1)]((1 - (-1)^n)/2)(2^((5 - n)/2)([n/7] + 1))
とかにすればいいんじゃない意味ないけど
0303デフォルトの名無しさん
垢版 |
2018/11/09(金) 23:35:53.00ID:QKOvQ/Be
>>287 Squeak/Pharo Smalltalk

| fn |

fn := [:N |
| nDig |
nDig := N log truncated.
(1 to: nDig)
inject: (1 to: N by: 2) size * (nDig + 1)
into: [:tot :m | tot - ((10 raisedTo: m) / 2)]
].

#(3 10 9999 123456789 31415926535897) collect: fn

"=> #(2 5 19445 500000000 214355930195731) "
0304デフォルトの名無しさん
垢版 |
2018/11/09(金) 23:56:11.30ID:EzT7HP1o
>>302
訂正
((9p - 1)10^p + 10)/18 -> [((9p - 1)10^p + 10)/18]
あと (n < 8 ? n & 1 : 0) は (1 - (-1)^n)/2*[3/([√n] + 1)] の方がより簡単か
0307デフォルトの名無しさん
垢版 |
2018/11/10(土) 04:35:26.34ID:PYYpj2JU
>>258
Kotlin
https://paiza.io/projects/sjgIQuhZ44UZcdFZ2CwncQ

色々考えたが結局クラス作ってそこに数字列と文字列で切り分けて入れておいて比較時にそこ見るようにした。

入力の仕様は拡張されていて、最初に数字だけがあった場合はその後に続く単語がその個数あるとみなして
入力を行うが、最初に数字がない場合は無制限に読む。出力は入力した単語とソート後の単語を出す。
0308デフォルトの名無しさん
垢版 |
2018/11/10(土) 05:36:17.18ID:zQnB+SVr
提案
回答は言語別に別スレで

2スレ位になるかな?
評価価値基準で別れていくんじゃないかと

ここではコメントのみになるのかな。
0310デフォルトの名無しさん
垢版 |
2018/11/10(土) 06:43:43.85ID:zQnB+SVr
乱立して過疎ってる特定言語専用スレの活性化に寄与することを願いたいしコード例が増えることはそれぞれメリットあるんじゃないかと。
ここと相互リンクは必ず貼る。他の言語と比較しない
他を貶さないを基本ルールに。
0312デフォルトの名無しさん
垢版 |
2018/11/10(土) 08:21:22.38ID:2tLivqWS
>乱立して過疎ってる特定言語

具体的に何?
一番肝心のこと言ってないから説得力がまるで無い
0313デフォルトの名無しさん
垢版 |
2018/11/10(土) 09:22:59.55ID:dp2CGyZQ
お題:
A,B,Cの3人が1から5までの値が1つずつ書かれた5枚のカードを使ってインディアンポーカーを行う。
各々ランダムに1枚カードを引き、自分は値を見ず他の参加者に値が見えるように額にかざす。
この状態でA,B,Cの順に自分の値が今回引かれた3枚の中で最大(MAX)か,2番目に大きい(MID)か,最小(MIN)かを予想して答える。
AとBはパスしてもよいものとし、誰かが答えた時点で終了となる。
なお全員必ず正解するものとする。
各々の引いたカードの値を引数にとり、一回分のインディアンポーカーの結果を出力する関数indian_poker(a, b, c)を実装せよ。

期待動作例:
indian_poker(3, 2, 1) // 「A is MAX」
indian_poker(5, 2, 4) // 「B is MIN」
indian_poker(4, 2, 3) // 「C is MID」
0314デフォルトの名無しさん
垢版 |
2018/11/10(土) 09:43:13.06ID:9vqEahoA
そのスレの流れを無視してよそのスレで出されたお題の答えだけ書かれても、そのスレの住人には邪魔なだけだと思う。
0315デフォルトの名無しさん
垢版 |
2018/11/10(土) 09:56:28.53ID:X2YiMm/N
こういう指示語ばかり使うやつはだいたい頭悪い
0316デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:03:50.52ID:0iGN/oEh
>>313
マ板で見かけた入社試験過去問か。
プログラマー脱落者として辞退します。
0317デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:10:03.22ID:zQnB+SVr
乱立して過疎ってる (特定言語専用(スレッド))
形容詞句?の係りはこれな

(こういうものの表しかたにも流儀が色々あって混在するとややこしい)
0318デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:19:13.79ID:2tLivqWS
係り受けなんてどーでもいいよ
「特定言語」って具体的に何なんだ、って聞いてるだけじゃん
返答が『形容詞句?の係りはこれな』って人の話をわざと聞かない人間だろ
かなりのサイコパスなんで『乱立して過疎ってるスレ』とやらに誘いこんでマウンティングしたいだけじゃねえの
なぜなら、特定言語の具体的な名前を5時間経っても未だに出さない、
口を開いたかと思えば「係り受けはこうだから」
もう頭がおかしいだろこいつ
0319デフォルトの名無しさん
垢版 |
2018/11/10(土) 10:34:20.29ID:zQnB+SVr
一つの言語を話題の軸に置いたスレッドは幾らでもあるだろ?この板には。
過疎ってるのも伸びてるのも全部特定言語専用スレな
0321デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:08:46.45ID:1MT6N26R
そもそもここが過疎だし、他スレなんかにここのコード書いても荒らしにしかならんので当然ながら反対
やりたい奴だけ勝手にやってろ
0322デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:14:10.79ID:16GnFLu/
>>313
一人が答えた時点で終了になるのに全員正解とは
0323デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:20:45.22ID:zQnB+SVr
幾らなんでも既存スレ無許可で乗っ取るのはやめてほしい。
でも逆にそちらで希望された場合には別スレにしなくてもいいのでは?リンクさえあれば
0325デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:33:27.18ID:16GnFLu/
>>313
答えた者が必ず正解するならAが常にあてずっぽうで正解できることになるな
パスする意味も無い

言わんとすることは推測できるが、問題文としては明らかにおかしい
各自、論理的に正解が絞りきれた場合のみ解答し、そうで無ければ必ずパスするものとする。又、その論理に誤りはないものとする。みたいな条件が必要
0327デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:36:49.05ID:16GnFLu/
>>326
ごり押しで草
0328デフォルトの名無しさん
垢版 |
2018/11/10(土) 11:44:08.17ID:16GnFLu/
Aは常に正解する
Aは常に正しい
故にA is GOD
0329デフォルトの名無しさん
垢版 |
2018/11/10(土) 12:18:21.41ID:2tLivqWS
>>313は9月末あたりに話題になってた
ttps://qiita.com/gorillab/items/fab2a6637f681221f687
ttps://qiita-image-store.s3.amazonaws.com/0/169376/80ea2cf1-37e7-60b0-3230-c7dc1d2d60cc.jpeg
0330デフォルトの名無しさん
垢版 |
2018/11/10(土) 12:38:22.96ID:16GnFLu/
>>329
元ネタからして雑すぎて草
0332デフォルトの名無しさん
垢版 |
2018/11/10(土) 12:44:51.58ID:xqriZsUd
>>313 Ruby

def indian_poker(a, b, c)
  x = [Set[1, 2], Set[1, 5], Set[4, 5]]
  winner, winners_num = case
    when x.include?(Set[b, c]) then [?A, a]
    when a == 3 || (b == 3 && Set[a, b, c] != Set[2, 3, 4]) || x.include?(Set[a, c]) ||
      Set[b, c] == Set[2, 4] then [?B, b]
  else [?C, c]
  end
  '%s is %s' % [winner, %w[MIN MID MAX].zip([a, b, c].sort).find{|e| e.last == winners_num}.first]
end

arr = [*(1..5)].permutation(3){|i| puts '%p -> %s' % [i, indian_poker(*i)]};
# =>
[1, 2, 3] -> C is MAX
[1, 2, 4] -> B is MID
[1, 2, 5] -> B is MID
...
以下>>326と同じ
0333デフォルトの名無しさん
垢版 |
2018/11/10(土) 13:25:37.16ID:hLxIIZfE
>>325
> 各自、論理的に正解が絞りきれた場合のみ解答し、そうで無ければ必ずパスするものとする。又、その論理に誤りはないものとする。みたいな条件が必要
流石にその程度は理解しようよ…
0335デフォルトの名無しさん
垢版 |
2018/11/10(土) 13:37:54.71ID:16GnFLu/
>>333
書いてないことは何でもあり

論理パズルにするならちゃんとルールは全て掲示しないと駄目
0336デフォルトの名無しさん
垢版 |
2018/11/10(土) 13:52:54.08ID:9b5VuL4P
お題
n^n^nの下2桁を求めよ(^はべき乗、nは1以上の整数)

1 => 1
2 => 16 (2^2^2 = 2^4 = 16)
3 => 87 (3^3^3 = 3^27 = 7625597484987)
4 => 96
11 => 11
13 => 53
100 => 0
777 => ??
0338デフォルトの名無しさん
垢版 |
2018/11/10(土) 15:46:45.95ID:16GnFLu/
>>336
777の出力は77になればいいのかな?
その入力でこうなるの面白いな
0340デフォルトの名無しさん
垢版 |
2018/11/10(土) 16:06:41.30ID:16GnFLu/
>>339
すまんコード修正したら97になったわ
はやとちりだった
0342デフォルトの名無しさん
垢版 |
2018/11/10(土) 17:09:13.33ID:xqriZsUd
>>336 Ruby
def powmod(n, e, m)
  case e
  when 0 then 1
  when :even?.to_proc then powmod(n * n % m, e >> 1, m)
  else n * powmod(n, e - 1, m) % m
  end
end

def kotae(n, m)
  index, cycle = (1..m).each_with_object([1]) do |i, a|
    x = (a.last * n % m)
    ind = a.index(x)
    ind.nil? ? a.push(x) : (break([ind, i - ind]))
  end
  x = n.times.reduce(1){|r, i| r *= n; r < index ? r : break}
  y = x.nil? ? index + (powmod(n, n, cycle) - index) % cycle : x
  powmod(n, y, m)
end

[0, 1, 2, 3, 4, 5, 10, 11, 13, 100, 777].each{|i| puts '%d -> %06d' % [i, kotae(i, 10**6)]}
# =>0 -> 000000
1 -> 000001
2 -> 000016
3 -> 484987
4 -> 084096
5 -> 203125
10 -> 000000
11 -> 906611
13 -> 549053
100 -> 000000
777 -> 977097
0344デフォルトの名無しさん
垢版 |
2018/11/10(土) 17:52:39.10ID:AvCW4uHY
python

def ans(num):
_def calc(N):
__n = (N ** 2) % 100
__p = []
__while n not in p:
___p.append(n)
___n = (n * N) % 100
__return p

_loop = calc(num)
_step = num**num % len(loop)
_if len(loop) == 1:
__print(loop[0])
_else:
__print(loop[step-2])

for x in [0,1,2,3,4,5,10,11,13,777]:
_ans(x)

-> 0,1,16,87,96,25,0,11,53,97
0346デフォルトの名無しさん
垢版 |
2018/11/10(土) 19:50:00.93ID:nd1h6x9x
>>343
わかった上で愚直にごり押しコード書いただけだよな
引数順列の列挙もドストレートで素敵w
0347デフォルトの名無しさん
垢版 |
2018/11/10(土) 20:50:56.73ID:G7iMNc/F
>>313 Squeak/Pharo Smalltalk

| numOfCards indianPoker |
numOfCards := 5.
indianPoker := [:args |
| cards names infer |
cards := (1 to: numOfCards) asArray.
names := (Character alphabet asUppercase first: args size) asArray collect: #asSymbol.
infer := nil. (infer := [:dealts :limit |
| turn possibilities lastAns answers |
turn := 0. answers := OrderedCollection new.
possibilities := dealts collect: [:dealt | cards asSet removeAll: dealts; add: dealt; yourself].
lastAns := nil -> #?.
[lastAns value = #? and: [(turn := turn + 1) < limit]] whileTrue: [
| myCards others |
myCards := possibilities atWrap: turn.
turn > 1 ifTrue: [
(myCards copyWithout: (dealts atWrap: turn)) do: [:pCard |
(infer value: (dealts copy atWrap: turn put: pCard; yourself) value: turn) value ~= #?
ifTrue: [myCards remove: pCard]]].
others := dealts copyWithoutIndex: turn - 1 \\ 3 + 1.
lastAns := (names atWrap: turn) -> (true caseOf: {
[others min > myCards max] -> [#MIN].
[others max < myCards min] -> [#MAX].
[others max > myCards max and: [others min < myCards min]] -> [#MID]
} otherwise: [#?])
]. lastAns]) value: args value: Float infinity
].

indianPoker value: #(3 2 1). " #A->#MAX "
indianPoker value: #(5 2 4). " #B->#MIN "
indianPoker value: #(4 2 3). " #C->#MID "
0350デフォルトの名無しさん
垢版 |
2018/11/11(日) 12:53:19.00ID:ILkwXRqJ
>>336 Squeak/Pharo Smalltalk

| fn |
fn := [:N |
(Array new: 3 withAll: N) reduce: [:mex :n |
mex \\ 100 = 0 ifTrue: [0] ifFalse: [n raisedTo: mex modulo: 100]
]
].

#(1 2 3 4 11 13 100 777) collect: fn

"=> #(1 16 87 96 11 53 0 97) "
0355デフォルトの名無しさん
垢版 |
2018/11/11(日) 16:24:01.50ID:xWJTm2Oc
お題
n次のヒルベルト曲線を描画せよ

n=1
■□■
■□■
■■■

n=3
■□■■■■■□■■■■■□■
■□■□□□■□■□□□■□■
■■■□■■■□■■■□■■■
□□□□■□□□□□■□□□□
■■■□■■■□■■■□■■■
■□■□□□■□■□□□■□■
■□■■■■■□■■■■■□■
■□□□□□□□□□□□□□■
■■■□■■■■■■■□■■■
□□■□■□□□□□■□■□□
■■■□■■■□■■■□■■■
■□□□□□■□■□□□□□■
■□■■■□■□■□■■■□■
■□■□■□■□■□■□■□■
■■■□■■■□■■■□■■■
0356デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:11:10.50ID:Gv5Fmm22
>>336 Perl5

use bignum (l=>GMP);
for $i (1,2,3,4,11,13,100,777) {
$j = $i % 100;
$k = $j ** $j % 100;
$p = $j ** $k % 100;
printf "$i %02d\n", $p;
}

実行例
$ time perl 12_338.pl
1 01
2 16
3 87
4 96
11 11
13 53
100 00
777 97

0.562 secs
0357デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:52:24.96ID:tvDFPkAv
>>355 Ruby
def hilbert_curve(n)
  return [[1, 0, 1], [1, 0, 1], [1, 1, 1]] if n == 1
  hc = hilbert_curve(n - 1)
  [
    *hc.transpose.reverse.zip(hc.reverse.transpose).map{|a, b| [*a, 0, *b]},
    [1, *Array.new(2**(n + 1) - 3, 0), 1],
    *hc.zip(hc).map.with_index{|(a, b), i| [*a, 1/(i + 1), *b]}
  ]
end

[1, 3].each{|e| puts "n = #{e}", hilbert_curve(e).map{|a| a.join.gsub(/\d/, ?0 => ?□, ?1 => ?■)}.join($/)}
# => n = 1
■□■
■□■
■■■
n = 3
■□■■■■■□■■■■■□■
■□■□□□■□■□□□■□■
■■■□■■■□■■■□■■■
□□□□■□□□□□■□□□□
■■■□■■■□■■■□■■■
■□■□□□■□■□□□■□■
■□■■■■■□■■■■■□■
■□□□□□□□□□□□□□■
■■■□■■■■■■■□■■■
□□■□■□□□□□■□■□□
■■■□■■■□■■■□■■■
■□□□□□■□■□□□□□■
■□■■■□■□■□■■■□■
■□■□■□■□■□■□■□■
■■■□■■■□■■■□■■■
0358デフォルトの名無しさん
垢版 |
2018/11/11(日) 22:01:36.28ID:B3f/927d
>>336
Haskell
素直に書いた版。
何やってるかは分かりやすい。

main = mapM_ put $ zip list $ map f list

put (x,y) = putStr (show x ++ ":") >> print y

f x = (x ^ x ^ x) `mod` 100

list = [1,2,3,4,5,6,7,8]
0359デフォルトの名無しさん
垢版 |
2018/11/11(日) 22:10:56.11ID:B3f/927d
Haskell
Perlの人のパクリ版(めちゃ速い)

main = mapM_ put $ zip list $ map f list

put (x,y) = putStr (show x ++ ":") >> print y

f x = p
where j = x `mod` 100
k = j ^ j `mod` 100
p = j ^ k `mod` 100

list = [1,2,3,4,11,13,100,777]
0362デフォルトの名無しさん
垢版 |
2018/11/11(日) 23:59:16.36ID:lebYcZ/K
>>360
use bignum (l=>GMP);
for $i (10) {
$j = $i % 100;
$k = $j ** $j % 100;
$p = $j ** $k % 100;
printf "$i %02d\n", $p;
}

$i = 10;
print ($i**$i)**$i;

実行結果
$ perl 12_338_1.pl
10 01
10000000000

ダメですね合いませんね。
単に左辺を%100すると一般性はありませんでした。サーせん。
ちゃんと循環性を見るとか、別の解法が要りますね
0363デフォルトの名無しさん
垢版 |
2018/11/12(月) 00:02:23.31ID:EX0FpiMD
ちなみに循環性を見るとこんな感じになってました
use bignum (l=>GMP);
use Tie::IxHash;
use feature 'say';
for $i (0,1,2,3,4,5,10,11,13,777) {
tie my %h,'Tie::IxHash';
$p = $i;
for (1..100) {
last if exists $h{$p} and $h{$p} > 10;
$h{sprintf "%02d", $p % 100} = $_;
$p = $p * $i % 100;
}
@a = keys %h;
say "$i: ", scalar @a, ": @a", ": $p";
}

実行結果
1: 1: 01: 1
2: 21: 02 04 08 16 32 64 28 56 12 24 48 96 92 84 68 36 72 44 88 76 52: 48
3: 20: 03 09 27 81 43 29 87 61 83 49 47 41 23 69 07 21 63 89 67 01: 47
4: 10: 04 16 64 56 24 96 84 36 44 76: 16
5: 2: 05 25: 25
10: 2: 10 00: 0
11: 10: 11 21 31 41 51 61 71 81 91 01: 11
13: 20: 13 69 97 61 93 09 17 21 73 49 37 81 53 89 57 41 33 29 77 01: 37
777: 20: 77 29 33 41 57 89 53 81 37 49 73 21 17 09 93 61 97 69 13 01: 73
0367デフォルトの名無しさん
垢版 |
2018/11/12(月) 00:11:06.48ID:D6ILV7Jx
>>362
iが10で割り切れれば00って別で切り分ければ良いんじゃ無いかな。
0368デフォルトの名無しさん
垢版 |
2018/11/12(月) 00:18:43.46ID:EX0FpiMD
>>367
10については、そいうやり方も考えられるけど
上記の循環の例の11,13,777は指数を%100しても解は合うが
他の数値も単に指数を%100して解が合うか、一般性は疑わしいので、
>>356はちょっと勇み足だったかもしれないテヘペロ
0369デフォルトの名無しさん
垢版 |
2018/11/12(月) 00:19:14.52ID:JEwLf6Zk
>>363
0〜99までとりあえず循環部分の周期は全て20の約数になるみたいだけど
数学雑魚の俺には理屈がわからなかった

とりあえず、ざっくり100の剰余取るだけだと循環開始より小さい指数になったときにおかしくなりそう
0371デフォルトの名無しさん
垢版 |
2018/11/12(月) 02:34:45.23ID:MtlIUxHY
多分数学的には証明されていることだろうと思うが、x ^ 100 とか x ^ 200 とか x ^ 300 って、
下3桁の結果が同じになるようだな。どうしてかはわからんが。多分考えて行くとその内わかる
んだろう。後の事は数学が得意な人に任せた。
0372デフォルトの名無しさん
垢版 |
2018/11/12(月) 04:19:59.43ID:lDwndekZ
x^22 - x^2
が常に100で割り切れるのが理由だと思う
なので巡回群の長さは高々20までになる
0373デフォルトの名無しさん
垢版 |
2018/11/12(月) 04:44:54.48ID:lDwndekZ
もう少し分かりやすく書くと x^20 - 1 と x^21 - x が
100で割り切れる保証はない(実際大部分は割り切れない)が
x^22 - x^2 は絶対に100で割り切れる(合同式を用いれば証明は簡明)ので
一般に2以上の自然数 n に対して x^(n+20) - x^n ≡ 0 mod 100が成り立つ(xは整数)

よって一般に指数部の20の剰余を取っても問題ないと言える
0374デフォルトの名無しさん
垢版 |
2018/11/12(月) 04:49:06.55ID:fKeD1dzA
>>371
任意の整数 10n + r (-4 <= r <= 5)に対して
(10n + r)^100 = r^100 mod 1000 なので mod 1000 で
0^100 = 0
5^100 = 625^25 = 625
(±1)^100 = 1
(±2)^100 = 24^10 = 376
(±3)^100 = 243^5 = 1
(±4)^100 = 376^2 = 376
となって 0, 1, 376, 625 は2乗しても下3桁は変わらないから
任意の整数は100n乗しても下3桁は常に同じだね
0377デフォルトの名無しさん
垢版 |
2018/11/12(月) 11:03:12.07ID:oQPj2WUY
とりあえず>>336の出題者は用意してあった解答を出そうか
くそ問題かどうかはそれを見て判断する
0379デフォルトの名無しさん
垢版 |
2018/11/12(月) 11:51:52.42ID:oQPj2WUY
回答の多さとクソさとの相関はないだろ
例えばQiitaでいいねが多ければクソじゃないということがないのと同じように

そういうのはいいから出題者は早めに解答だしてくれ
0380デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:01:03.54ID:iaSpw+rm
ボクがわからないからクソとか草生えるわ
なんでお前の救い難い知的レベルに合わせてやらなければならいんだよ
0381デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:07:32.95ID:iShTB70W
>>379
最近のQiitaのトレンド見てて いいねの数=内容の薄さ だと思うようになってきたわ
0382デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:11:20.95ID:b6USGf7s
今回の問題はべき剰余の特殊な場合を求めるものだけど、工夫する余地もいくつかあり悪い問題ではないと思った。
というかなぜこれを悪い問題だと思ったんだ?
0384デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:23:12.24ID:hXyGmgtP
a↑↑b mod n を一般化してみたらテトレーション計算より
最初に使うφ(n)の計算のほうが重かった
10**nなら2**n * 5**nなので高速に計算できますけども
0385デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:28:21.72ID:TKKxOWxM
このスレは不特定言語スレだけど
高速性ならC/C++/Rast
コンパクト性の追求ならSmallTalkとかRubyとか
RADならJavaとかPythonとか定番固定化。
既にもうある程度少数特定言語スレになりつつあ
る希ガス
0387デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:49:28.80ID:7mLFygVa
>>380
> なんでお前の救い難い知的レベルに合わせてやらなければならいんだよ

数学の素養のあるっぽいやつのよくやりがちなダメな考え方だな
そういう(逆)選民思想を持っているならこのスレで出題するのはやめてくれ

そもそも良問と思うものをけなされるお前自身がたのしくないだろ?
0388デフォルトの名無しさん
垢版 |
2018/11/12(月) 12:56:08.79ID:1XBBjLKo
いずれにせよ出題者がどこまで考えて出題したか(つまり良問か否か)はそいつ自らの解答を見れば一目瞭然だよ
論よりコード
はよ出せ
0389デフォルトの名無しさん
垢版 |
2018/11/12(月) 13:24:01.86ID:WWnCJgTu
問題の良さって問題じゃなく解答で決まるものなのか?
問題だけで問題の良さが確定しないのは初めて知ったわ
0390デフォルトの名無しさん
垢版 |
2018/11/12(月) 13:26:44.24ID:DYCuacpe
も一回言うけどこの問題はプログラミングのお題としてはよく見るような問題だぞ。
揚げ足取りというか難癖付けてる奴はおかしいだろ。
それこそスレチだから黙ってろよ。
0391デフォルトの名無しさん
垢版 |
2018/11/12(月) 13:28:23.55ID:X+KqJ1/Z
>>389
解答で決まるなんて誰もいっとらんがな(数学の前にやることあるんじゃ?w)
解答を見れば「どこまで考えて出題したか」が一目瞭然ということ
どこまで考えて出された問題かで良問か否かが決まる

もとより様々な状況で「結果的に良問」ということは実際あるしそれは否定する気は無いが、蓋然性は低い
0392デフォルトの名無しさん
垢版 |
2018/11/12(月) 13:38:11.17ID:b6USGf7s
この程度のことで選民思想がどうのとか言い出すのはおかしいと思うよ。
冪剰余の計算は面白いテーマだし。
逆に悪問だと言ってる人がその根拠を示すべきだと思うんだけど。
0393デフォルトの名無しさん
垢版 |
2018/11/12(月) 13:57:27.23ID:9RzF2H48
>>392
「この程度(のレベル)」とか言ってる選民思想バリバリの奴が
自分は違うって体で何か主張したところでぜんぜん説得力ないんだがw

ともあれ、回答が多い割に文句なしの正答が出てこないのがこのスレ的には異常事態だろ
お題 and/or 出題者をクソだと疑う十分な根拠になりうる
0394デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:13:38.48ID:b6USGf7s
>>393
英語の授業で"How are you?" "I'm fine. Thank you" って言ったら「ペダンチックだ。帰国子女ぶるな」といわれたくらいに衝撃的。
大体問題が理解できないのに「文句なしの正答」を見極められるというのはおかしくない?
こっちからすればここに既にある回答の内のいくつか(>>348とか)は「文句なしの正答」なんだけど。
問題が理解できないのに「文句なしの正答」を見極められるならそれらのどこが不十分なのか説明しなさい。
それができなければ数学ができる出来ない以前にただのモンスタークレーマーみたいな傲慢野郎だ。
0395デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:16:13.02ID:CqB5lm+V
まーた頭おかしいのが暴れてんのか
>>393はNGぶっこむからIDころころ変えるな
もしくはコテハンつけろよゴミが
0396デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:24:13.52ID:D6ILV7Jx
>>355とか良い問題じゃ無い?
私は解けないが。
0399デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:27:56.77ID:9RzF2H48
あとお前ら(直近ではID:9RzF2H48とID:CqB5lm+V)
勝手にクソ問題断定のクレーマー扱いしとるが
出題者の用意していた解答次第では良問の可能性も(わずかだが)あるんだからな
ほどほどにしとけよw
0401デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:33:57.40ID:DYCuacpe
どうやら ID:9RzF2H48 は人を馬鹿にしたいだけみたいだな。
きちんと説明してもらってんのに言ってることがわけわからんし。
冪剰余の最適化なんて教科書にあってもいいくらいものすごくありふれたお題だっていうのに馬鹿らしい。
0402デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:37:03.80ID:CqB5lm+V
数学の話ししてるのにイライラして思わずクソ問題呼ばわりして引くに引けなくなったんだろ
0403デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:43:20.29ID:b6USGf7s
>>397
いやだから>>348とかって例を挙げてるでしょ。ばかにしてる?
それで結局悪問だという根拠は示せないんだよね?
じゃあ悪いことしたんだからまだいるか知らないけど出題者に謝罪しようね。
君ははっきり言って不快だよ。
0404デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:46:44.76ID:9RzF2H48
>>401
本音がでたなw中立ぶるよりお前ららしいわ

>>402
こんなん数学に入るかボケが
つーかお前のためにID固定してやってんだからレスすんな
0405デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:52:28.57ID:9RzF2H48
>>403
自分で回答も出せないやつが他人のコード気安く挙げてんじゃねーよ
お前が考えて出したコードならいくらでもケチつけたるわw
0406デフォルトの名無しさん
垢版 |
2018/11/12(月) 16:55:43.17ID:CqB5lm+V
>>404
図星突かれて痛かったのか?
バカを愚弄するのはホント楽しいわ
てか「数学板でやれ。問題からしてクソだった」って言ってたくせにこんなの数学に入らないっておかしいだろ
数学に入らないなら数学板推すなよアホか
結果的に数学よりも遥かにスレ違いの話題でこの場を荒らして皆に迷惑かけてんのはお前だ
お前はみんなの迷惑なの
0407デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:00:57.95ID:b6USGf7s
>>405
>ともあれ、回答が多い割に文句なしの正答が出てこない
って言うからその反例として件のレスなのに、開き直ってお前がコード書けだなんて控えめに言って狂ってる。
相手が言ったことも読まないし自分が行ったことすら覚えていないんじゃあ対話不可能。
ただただ不快な存在。
0408デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:01:55.26ID:D6ILV7Jx
>>336 は情報爆発でメモリ使いまくる処理をいかにメモリ使わずに処理できるかって意味じゃ悪く無いと思う。
私はプログラマーじゃ無いから思い付けなかったが、こう言うのはプログラマーの本領発揮する分野じゃないかな。

そして >>355 も解けない私。。。Orz
GUIならネットに落ちてるけど、CUIってのが味噌だよね。
0409デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:02:08.43ID:9RzF2H48
>>403
それは出題者のコードじゃないだろ?
ほんとお前、日本語読解とか論理的思考とか大丈夫なの?
0411デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:03:00.49ID:DYCuacpe
>>404
ものすごくありふれたお題に文句付けてるんだからあきれてものも言えないってだけ。
別に中立ぶってなどいない。お前のことは見下してるが。
0412デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:06:56.26ID:b6USGf7s
>>409
>ともあれ、回答が多い割に文句なしの正答が出てこない
と言ったのはそちらで、それに対してこっちがその反例として件のレスを挙げたのに本気で意味不明。
会話を破綻させに行っているのは君でしょ。自分が書いたことすら覚えていないのだから。
さすがに不愉快だ。
0413デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:08:31.84ID:1o1kfQH0
馬鹿は相手がどの高さいるのかもわからずに人を馬鹿にする
頭が悪いので周囲が何を言ってるのか何一つ理解できない
そして自尊心の塊
0415デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:13:08.29ID:9RzF2H48
>>412
お前は自分の「文句なし」に自信持ちすぎだろw
あと「出題者の用意していた解答次第では良問の可能性も(わずかだが)ある」は無視ですかそうですか
0417デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:17:08.81ID:b6USGf7s
>>415
対話する意図がないと判断した。
もういい。疲れた。
控えめに言って、君はもう死んだ方が良いよ。
0418デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:21:16.54ID:4IQEu5Ky
最近あっちこっちで暴れてる単芝君か
5chに居場所が無くてもリアル犯罪に走るなよな
0419デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:21:58.58ID:D6ILV7Jx
良い加減にしろ!
もうオマイらで >>336 の文句なしの正当とやらを出し合えや。
0420デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:23:23.00ID:eZ2UdI/8
・数学の話ばかりしてうざい ←わかる
・作者は答え書いて ←わからなくもない
・答え書かないからクソ問題! ←は?
0421デフォルトの名無しさん
垢版 |
2018/11/12(月) 17:54:26.10ID:9RzF2H48
>>420
誤解があるので訂正しておくけど
出題者が「落とし穴」をちゃんと想定できていれば良問だしそれを確認せんがための「答え出せ」だよ

でも、勘違いしたままたまたま答えが合ってしまう入出力例しか提示されていない
and/or それを排除できる例を出せない時点でこの問題はそれなりにクソ問題だと思う

引っ掛けて貶めたり、選抜や順位を競うことを目的とした場所じゃないんだからここは
0422デフォルトの名無しさん
垢版 |
2018/11/12(月) 18:12:43.91ID:eZ2UdI/8
n^n^n % 100計算するのに落とし穴も何もないだろ
フェルマーの小定理チックに指数部で剰余とるだなんて誰も想定できねえよ
なんでキチガイは間違えたらそこから学ばずに問題の方(しかも真っ当)にケチ付けるんだか
運動会で転ぶと怪我をするからグラウンドの至る所にクッションを置いておけと言うモンペと同レベルのキチガイ
0423デフォルトの名無しさん
垢版 |
2018/11/12(月) 18:26:31.10ID:bzMEonQL
なんで数学板でやらないのかね。
数学板ではザコだからプログラム板でマウント取りたいとか?ww
0427デフォルトの名無しさん
垢版 |
2018/11/12(月) 18:55:17.39ID:eZ2UdI/8
>>425
お前以外誰もその問題にケチ付けてねえのに住人面すんな
素直に頭悪いが悪いのが悔しいですって言えよ
0428デフォルトの名無しさん
垢版 |
2018/11/12(月) 19:18:26.81ID:h68nq2of
プログラミングできてもネットリテラシーは低いんだな
0429デフォルトの名無しさん
垢版 |
2018/11/12(月) 19:28:11.51ID:+FWS6rf7
ID:9RzF2H48
こいつ前からこの板荒らしまくってる粘着野郎だぞ
意思疎通は不可能だから無視しとけ
0432デフォルトの名無しさん
垢版 |
2018/11/12(月) 19:54:05.95ID:I5PkaEyl
自分で計算して求めるのを作るか、ライブラリを使ってしまうか、悩ましいところですな・・・
0433336
垢版 |
2018/11/12(月) 19:58:23.85ID:rYIWpX0E
悪い意味で盛り上がってて苦笑するしかない

C++
https://ideone.com/HUZiK8

Ruby読めないけど>>342と大体同じ考え方なのかな
0434デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:20:47.61ID:4WXaKeF0
お題
0から99までの整数を2進数で表したとき、1が奇数個あるものを全て挙げよ
0436デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:27:55.24ID:q04ZIund
>>430 Ruby 日付ライブラリ使うのもつまらないので冗談で

(1900..2018).select{|y| (y%100*5/4 - y/2000) % 7 == 4}
# => [1909, 1915, 1920, 1926, 1937, 1943, 1948, 1954, 1965, 1971, 1976, 1982, 1993, 1999, 2004, 2010]
0437デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:31:45.80ID:q04ZIund
>>434 Ruby
p (0..99).select{|i| i.digits(2).count(1).odd?};
# => [1, 2, 4, 7, 8, 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32,
35, 37, 38, 41, 42, 44, 47, 49, 50, 52, 55, 56, 59,61, 62, 64, 67,
69, 70, 73, 74, 76, 79, 81, 82, 84, 87, 88, 91, 93, 94, 97, 98]
0438デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:36:43.90ID:MOsxqjp/
>>430
J
分けて計算
years=:1900 + i. 119
saturdays =: 6= weekday years(,"0 1) 7 31
saturdays # years
出力
1909 1915 1920 1926 1937 1943 1948 1954 1965 1971 1976 1982 1993 1999 2004 2010

1行で
(#~ 6&=@weekday@(,&7 31)"0) 1900+i.119
出力は同じ
0439デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:55:43.70ID:MOsxqjp/
>>434
J

(#~ 2&|@+/@(#.^:_1"0)) i.100
出力
1 2 4 7 8 11 13 14 16 19 21 22 25 26 28 31 32 35 37 38 41 42 44 47 49 50 52 55 56 59 61 62 64 67 69 70 73 74 76 79 81 82 84 87 88 91 93 94 97 98
0440デフォルトの名無しさん
垢版 |
2018/11/12(月) 21:30:19.73ID:WG+vGwsG
>>434 Perl5
use feature say;
$,=',';
say = grep{1&sprintf("%b", $_) =~ tr/1/1/} 0..99;

実行
$ perl 12_434.pl
1,2,4,7,8,11,13,14,16,19,21,22,25,26,28,31,32,35,37,38,41,42,44,47,49,50,52,55,56,59,61,62,64,67,69,70,73,74,76,79,81,82,84,87,88,91,93,94,97,98
0441デフォルトの名無しさん
垢版 |
2018/11/12(月) 21:32:31.70ID:WG+vGwsG
>>440 ゴメンよけいな=が入っていたので削除

>>434 Perl5
use feature say;
$,=',';
say grep{1&sprintf("%b", $_) =~ tr/1/1/} 0..99;

実行
$ perl 12_434.pl
1,2,4,7,8,11,13,14,16,19,21,22,25,26,28,31,32,35,37,38,41,42,44,47,49,50,52,55,56,59,61,62,64,67,69,70,73,74,76,79,81,82,84,87,88,91,93,94,97,98
0447デフォルトの名無しさん
垢版 |
2018/11/13(火) 00:27:29.87ID:7jyC4IO4
python

>>430
import datetime
[x for x in range(1900,2018) if datetime.datetime(x,7,31).weekday() == 5]
-> [1909, 1915, 1920, 1926, 1937, 1943, 1948, 1954, 1965, 1971, 1976, 1982, 1993, 1999, 2004, 2010]
ツェラーの公式を用いた別解
[x for x in range(1900,2018) if (x + int(x/4) - int(x/100) + int(x/400) + 1) % 7 == 6]

>>434
[x for x in range(1,99) if format(x,"b").count("1") % 2]
->
[1, 2, 4, 7, 8, 11, 13, 14, 16, 19, 21, 22, 25, 26, 28,
31, 32, 35, 37, 38, 41, 42, 44, 47, 49, 50, 52, 55, 56, 59,
61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81, 82, 84, 87, 88, 91, 93, 94, 97, 98]
0449デフォルトの名無しさん
垢版 |
2018/11/13(火) 00:43:41.95ID:bZ0HXQ7X
>>434
Haskell

main = print.tnum.filodd.zip list $ map bsum list

tnum = map (\(x,_) -> x)

filodd = filter (\(x,y) -> odd y)

bsum = sum.blist

blist 0 = []
blist n = (n `mod` 2):blist (n `div` 2)

list = [0..99]

実行結果
[1,2,4,7,8,11,13,14,16,19,21,22,25,26,28,31,32,35,37,38,41,42,44,47,49,50,52,55,56,59,61,62,64,67,69,70,73,74,76,79,81,82,84,87,88,91,93,94,97,98]
0452デフォルトの名無しさん
垢版 |
2018/11/13(火) 01:11:01.02ID:qGbdPj8P
>>430 Squeak/Pharo Smalltalk

(1900 to: 2018) select: [:y | (Date year: y month: 7 day: 31) weekday = #Saturday]

"=> #(1909 1915 1920 1926 1937 1943 1948 1954 1965 1971 1976 1982 1993 1999 2004 2010) "
0453デフォルトの名無しさん
垢版 |
2018/11/13(火) 01:23:34.12ID:qGbdPj8P
>>434 Squeak/Pharo Smalltalk

(0 to: 99) select: [:x | ((x radix: 2) occurrencesOf: $1) odd]

"=> #(1 2 4 7 8 11 13 14 16 19 21 22 25 26 28 31 32 35 37 38 41 42 44 47 49 50
52 55 56 59 61 62 64 67 69 70 73 74 76 79 81 82 84 87 88 91 93 94 97 98) "
0454デフォルトの名無しさん
垢版 |
2018/11/13(火) 01:59:27.96ID:4/lVJDsB
>>447>>448をJavascriptに引き写してみた。

>>430
[...function*(){for(i=1900;i++<2018;)if((i+~~(i/4)-~~(i/100)+~~(i/400)+1)%7==6)yield i}()]

>>434
[...function*(){for(i=0;i++<99;)if(i.toString(2).match(/1/g).length%2)yield i}()]

汚い…
Pythonの内包表記は良いなぁ…
0455デフォルトの名無しさん
垢版 |
2018/11/13(火) 02:08:16.58ID:JCaIqwLF
>>279やってみた
J

z=: dyad define " 0
s=: ([+ (], (((_1:^+)*+)))) "0 0
>: |: (y,x)$((i.c)/:,(+:c)(#."0 1)|(i.y)s/(i.x))i.i.c=.x*y
)

3 z 3
1 2 6
3 5 7
4 8 9

4 z 2
1 2
3 5
4 6
7 8

3 z 5
1 2 6 7 12
3 5 8 11 13
4 9 10 14 15

1 z 8
1 2 3 4 5 6 8 7
0457デフォルトの名無しさん
垢版 |
2018/11/13(火) 02:27:33.07ID:JCaIqwLF
>>455は各 (x,y) の項について
主キー x + y
副キー x + (-1)^(x+y) * (x+y)
とするとジグザグ順に昇順のキーが得られるので
そのキーでソートしたときの順位を表示、というやり方
0459デフォルトの名無しさん
垢版 |
2018/11/13(火) 12:04:16.15ID:/6RlnNZj
>>430
C
https://paiza.io/projects/Xq4YBZq4qJJLOZLsNTyWng

ライブラリ使用。
コンパイラとライブラリの対応の問題だろうが、32bit環境ではできなかった。time_t型がlongか何かになっていて足りなかったからだろうと思う。
まともに動くかどうかは(またはコンパイルできるかどうかは)環境依存ということになる。
0460デフォルトの名無しさん
垢版 |
2018/11/13(火) 14:23:32.25ID:TStmpOw3
>>279 Squeak Smalltalk >>457 を参考に (joinを直せばPharoも可)

| fn |
fn := [:M :N |
| digits xs ys primaries secondaries sorted |
digits := (M * N) log ceiling.
xs := (1 to: M) collect: [:idx | (1 to: N) asArray].
ys := (1 to: M) collect: [:idx | Array new: N withAll: idx].
primaries := xs + ys.
secondaries := primaries \\ 2 * 2 - 1 * xs.
sorted := ((1 to: M) gather: [:y | (1 to: N) collect: [:x | x@y]]) sort:
[:pt | (primaries at: pt y) at: pt x] ascending, [:pt | (secondaries at: pt y) at: pt x] descending.
sorted doWithIndex: [:pt :idx | (xs at: pt y) at: pt x put: (idx printStringPadded: digits)].
(xs collect: [:row | row joinSeparatedBy: ' ']) asStringWithCr
].

fn value: 3 value: 3. "=>
'1 2 6
3 5 7
4 8 9' "
fn value: 4 value: 2. "=>
'1 2
3 5
4 6
7 8' "
fn value: 3 value: 5. "=>
'01 02 06 07 12
03 05 08 11 13
04 09 10 14 15' "
fn value: 1 value: 8. "=>
'1 2 3 4 5 6 7 8' "
0461デフォルトの名無しさん
垢版 |
2018/11/13(火) 15:05:24.75ID:x0SFJuPP
>>457
副キーは x+y の偶奇に応じて上下や左右が反転してればいいわけだから
単に (-1)^(x+y)*x とか (-1)^(x+y)*y で十分か
0462デフォルトの名無しさん
垢版 |
2018/11/13(火) 16:16:43.59ID:GUmX5rsv
>>336 Squeak/Pharo Smalltalk >>342 を参考に

| fn |

fn := [:N :exp :lastNDigs |
| M series count nextVal initial cycle nextExp |
M := 10 raisedTo: lastNDigs.
series := OrderedCollection with: N \\ M.
count := 0.
[(series addIfNotPresent: (nextVal := series last * N \\ M); size) = (count := count + 1)] whileFalse.
initial := series indexOf: nextVal.
cycle := series size - initial + 1.
nextExp := N.
exp - 1 timesRepeat: [nextExp := (nextExp between: 1 and: series size)
ifTrue: [series at: nextExp]
ifFalse: [series at: nextExp - initial \\ cycle + initial]].
nextExp printStringPadded: lastNDigs
].

#(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 3 value: 2)].
"=> {1->'01' . 2->'16' . 3->'87' . 4->'96' . 5->'25' .
10->'00' . 11->'11' . 13->'53' . 100->'00' . 777->'97'} "

#(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 3 value: 6)].
"=> {1->'000001' . 2->'000016' . 3->'484987' . 4->'084096' . 5->'203125' .
10->'000000' . 11->'906611' . 13->'549053' . 100->'000000' . 777->'977097'} "

#(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 4 value: 3)].
"=> {1->'001' . 2->'536' . 3->'387' . 4->'896' . 5->'125' .
10->'000' . 11->'611' . 13->'053' . 100->'000' . 777->'097'} "
0464デフォルトの名無しさん
垢版 |
2018/11/13(火) 17:15:46.99ID:GUmX5rsv
>>355 Squeak Smalltalk ヒルベルトは組み込みなので…

| fn |
fn := [:n |
| form m lines |
form := Form extent: (m := 2 << n - 2) + 1 asPoint.
(Pen newOnForm: form) place: 0@m; hilbert: n side: 2.
lines := (m to: 0 by: -1) collect: [:y |
(0 to: m) inject: '' into: [:acc :x | acc copyWith: ('□■' at: (form pixelValueAt: x@y) + 1)]
].
lines asStringWithCr
].
fn value: 1. "=>
'■□■
■□■
■■■' "
fn value: 3. "=>
'■□■■■■■□■■■■■□■
■□■□□□■□■□□□■□■
■■■□■■■□■■■□■■■
□□□□■□□□□□■□□□□
■■■□■■■□■■■□■■■
■□■□□□■□■□□□■□■
■□■■■■■□■■■■■□■
■□□□□□□□□□□□□□■
■■■□■■■■■■■□■■■
□□■□■□□□□□■□■□□
■■■□■■■□■■■□■■■
■□□□□□■□■□□□□□■
■□■■■□■□■□■■■□■
■□■□■□■□■□■□■□■
■■■□■■■□■■■□■■■' "
0465デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:58:02.16ID:6xZ1V9iJ
>>279 Ruby >>457とは別のアプローチで

def zigzag(h, w)
  min, max = [h, w].minmax
  sum, multi = h + w, h * w
  f = -> n {n < min ? n + 1 : n >= max - 1 ? sum - n - 1 : min}
  diagonal = (sum - 1).times.with_object([*1..multi]).map{|i, ary| ary.shift(f[i]).tap{|a| i.odd? && a.reverse!}}
  len = Math.log10(multi).floor + 1
  h.times.map{|i| diagonal[i, w].map(&:pop)}.map{|e| e.map{|i| "%0#{len}d" % i}.join(' ')}.join($/)
end

[[3, 3], [4, 2], [3, 5], [1, 8]].each{|e| puts "%d %d =>\n%s\n\n" % [*e, zigzag(*e)]}
# =>
3 3 =>
1 2 6
3 5 7
4 8 9

4 2 =>
1 2
3 5
4 6
7 8

3 5 =>
01 02 06 07 12
03 05 08 11 13
04 09 10 14 15

1 8 =>
1 2 3 4 5 6 7 8
0466デフォルトの名無しさん
垢版 |
2018/11/13(火) 19:36:47.61ID:57oATazI
>>434
Python3
https://ideone.com/N66H4z

=> 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28 31 32 35 37 38 41 42 44 47 49 50 52 55 56 59 61 62 64 67 69 70 73 74 76 79 81 82 84 87 88 91 93 94 97 98
0467デフォルトの名無しさん
垢版 |
2018/11/13(火) 21:13:13.10ID:VjbjD5Cz
お題
直方体の体積を求めよ。三辺の長さはそれぞれ自然数+単位(mm,cm,m,km)の形式で与えられる。
答えは自然数+単位(mm^3,cm^3,m^3,km^3)の形式で、数値部分がなるべく小さくなるように単位を選択せよ。

2cm 3cm 4cm
=> 24cm^3

5mm 5mm 40mm
=> 1cm^3

3m 100000000km 3mm
=> 900000000m^3
0468デフォルトの名無しさん
垢版 |
2018/11/13(火) 21:46:22.87ID:ZM1FA5dW
>>467 Ruby
def to_mili(num, unit)
  case unit
  when 'mm' then num
  when 'cm' then num * 10
  when 'm' then num * 1000
  when 'km' then num * 1000000
  end
end

def volume(sides)
  v_mili = sides.scan(/(\d+)([a-z]+)/i).map{|side, unit| to_mili(side.to_i, unit)}.reduce(:*)
  [[10**18, 'km^3'], [10**9, 'm^3'], [10**3, 'cm^3'], [1, 'mm^3']].each{|coe, unit| return [v_mili / coe, unit] if v_mili % coe == 0}
end

['2cm 3cm 4cm', '5mm 5mm 40mm', '3m 100000000km 3mm'].each{|sides| puts '%s => %d%s' % [sides, *volume(sides)]}
# =>
2cm 3cm 4cm => 24cm^3
5mm 5mm 40mm => 1cm^3
3m 100000000km 3mm => 900000000m^3
0469デフォルトの名無しさん
垢版 |
2018/11/13(火) 22:46:25.57ID:jgdNCfY5
プログラミング無料で学んで就職できる?
https://et-irodori.com/b/2202
0471デフォルトの名無しさん
垢版 |
2018/11/14(水) 00:08:48.41ID:pC5Ut3Ig
お題: 品物がN個あり,ぞれぞれ体積はa(1), ..., a(N)である。
すべての品物を複数のダンボール(容積C)に分けて詰めるとき,必要になるダンボールの最小数を求めよ。

例:
C: 30
a: 8 5 10 6 4 5 8 5 9 6 9
=> 3

C: 120
a: 33 61 58 41 50 21 60 64
=> 4

C: 120
a: 33 61 58 41 50 21 60 64 23 45 67 78 89
=> 7
0474 ◆QZaw55cn4c
垢版 |
2018/11/14(水) 00:58:44.50ID:1oDeoExT
>>473
typo, "recursive"
ええと、>>472 に近いのは >>449 かもしれませんが、>>449 は bit 数を具体的に求めきっていますか?それとも >>472 のように真理値まで短縮してリターンしてますか?
haskell はよくわからないので…
0475デフォルトの名無しさん
垢版 |
2018/11/14(水) 01:04:38.44ID:xfEiy+CV
>>471
全探索したら、3つ目の例の答えが6になったんだが合ってる?
[21 33 60] [23 89] [41 78] [45 64] [50 67] [58 61]
0477デフォルトの名無しさん
垢版 |
2018/11/14(水) 05:43:59.41ID:BYIKTG47
>>336 J
f=:3 : 0
y 100&|@^ y^y
)
0480デフォルトの名無しさん
垢版 |
2018/11/14(水) 06:38:51.58ID:BYIKTG47
>>478
v6で動いたけどな
0481デフォルトの名無しさん
垢版 |
2018/11/14(水) 07:48:55.58ID:XWwMTSMS
>>474
むっちゃ愚直に10進数から2進数に変換してるだけです^^;
http://www.it-license.com/cardinal_number/DecimalToBinary.html

ただ、今回は1になってるビットが奇数かどうかだけなのでビット順は逆になっても構わないだろうと、
速い方でリストにしてます。

blist n = (n `mod` 2):blist (n `div` 2)

だとビット順は逆さま。

blist n = (n `mod` 2) ++ blist (n `div` 2)

とすると正しい順番ですが遅くなります。

あとは1と0だけのリストなので合計求めて

sum.blist ―2進数に変換しながら1の合計を求める。

入力と関連付けて

zip list

奇数だけをフィルタリングしてます。

filodd = filter (\(_,y) -> odd y)
0482デフォルトの名無しさん
垢版 |
2018/11/14(水) 07:53:25.46ID:BYIKTG47
>>477の実行結果

f @>1 2 3 4 11 13 100 777x
1 16 87 96 11 53 0 97
0483デフォルトの名無しさん
垢版 |
2018/11/14(水) 08:04:51.77ID:W0CfAPru
>>477
最後の y の前に x: つければどのバージョンでも動くな
100 のとき 0 にならないからダメだけど
0484デフォルトの名無しさん
垢版 |
2018/11/14(水) 08:08:08.67ID:W0CfAPru
>>483
>100 のとき 0 にならないからダメだけど

いやこっちは言いがかりだった。ちゃんと動く。
0485 ◆QZaw55cn4c
垢版 |
2018/11/14(水) 08:16:08.16ID:1oDeoExT
>>481
解説ありがとうございます。
>blist n = (n `mod` 2) : blist (n `div` 2)
この : は (cond atom list) の : なんですね、なんとかわかるようになりました
0487デフォルトの名無しさん
垢版 |
2018/11/14(水) 08:34:57.16ID:W0CfAPru
言いがかりだったというか
いちゃもんを付けてごめんなさい

100|777x^777x^777x これはngで
777(100&|@^) 777x^777x これはok

とか勉強になりました (累乗の剰余の特別扱いか?)
0490デフォルトの名無しさん
垢版 |
2018/11/14(水) 14:13:39.09ID:bryEJhFF
>>489
順列と足し算の問題ではないのか?
てか、今のところそれしか思い浮かばない。
0492デフォルトの名無しさん
垢版 |
2018/11/14(水) 14:57:13.49ID:bryEJhFF
正にコンピュータ向けの仕事
0493デフォルトの名無しさん
垢版 |
2018/11/14(水) 15:18:37.83ID:XWwMTSMS
実際は大量購入した方が安くなるから、よく出るサイズを大量購入して、それ以下の重量は全部よく出るサイズにした方が安上がりだったりする。
(だからアマゾンの箱は無駄にでかい)

まあこれはプログラミング上の問題だが。
0499デフォルトの名無しさん
垢版 |
2018/11/15(木) 02:07:53.71ID:lbhTVho0
>>471
Kotlin

このアルゴリズムで良いのかいまいちわからん。
箱の中に入れられる最大の品物を詰め込み続け入れられなくなったら次の箱を用意して同じことを繰り返すという方法。
結果を見ると一応出来ているようではあるが、これでうまく行く理由がはっきりわからない。

https://paiza.io/projects/rWdvvAZRxR1Qhr8B6PaM2Q

入力は1行の先頭に容積、その後スペース区切りで品物の体積。
結果は箱の数とそれぞれの箱に詰め込んだ品物。
0503499
垢版 |
2018/11/15(木) 09:09:38.39ID:RDhHOc3n
>>500>>501>>502
なるほど。じゃあダメだな。
0505114
垢版 |
2018/11/15(木) 23:46:11.08ID:lNkjj0jr
>>471
Haskell

問題と同じ答えになったんだが、どうやら三番目は6個になるっぽい?
じゃあダメか。。。

main = print $ map mapbox (slist list)

slist xs = map (\(x,y) -> (x, qsort y)) xs

mapbox (x,y) = (x,box 0 x [] y)

box n _ [] [] = n
box n _ ns [] = n + 1
box n c ns [x] | c >= sum (x:ns) = n + 1
box n c ns [x] | c < sum (x:ns) = n + 2
box n c ns (x:xs) | c == sum (x:ns) = box (n + 1) c [] xs
box n c ns (x:xs) | c > sum (x:ns) = box n c (x:ns) xs
box n c ns (x:xs) | c < sum (x:ns) && c > sum ((minimum xs):ns) =
box n c ((last xs):ns) (x:(init xs))
box n c ns (x:xs) | c < sum (x:ns) && c < sum ((minimum xs):ns) =
box (n + 1) c [] (x:xs)
box n c ns (x:xs) | c < sum (x:ns) && c == sum ((minimum xs):ns) =
box (n + 1) c [] (x:(init xs))
0506114
垢版 |
2018/11/15(木) 23:46:25.95ID:lNkjj0jr
qsort [] = []
qsort (x:xs) = large ++ [x] ++ small
where
small = qsort [a|a <- xs,a <= x]
large = qsort [a|a <- xs,a > x]

list = [(30,[8,5,10,6,4,5,8,5,9,6,9]),
(120,[33,61,58,41,50,21,60,64]),
(120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]

出力

[(30,3),(120,4),(120,7)]
0507デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:52:24.73ID:Q7kJgHrD
>>279
python 3

def wall2(height, width):
__maps = {x : [] for x in range(height)}
__counts = {w: [x for x in range(height) for y in range(width) if x + y == w] for w in range(height + width)}
__num = iter(range(1, 1 + height * width))
__for k,v in counts.items():
____for vv in sorted(v, reverse= not k % 2):maps[vv].append(next(num))
__for v in range(height):
____print(" ".join(map(lambda x: "%0{}d".format(len(str(width * height))) % x, maps[v])))
__else: print()

for x in [[3,3],[4,2],[3,5],[1,8]]: wall(*x)

やまほどrange()を書かないといけない宿業
0508114
垢版 |
2018/11/16(金) 08:32:20.01ID:00yShIqx
>>506
結果がはみ出てた。。。

[(30,3),(120,4),(120,7)]

大きい順に入れて、はみ出たら一番小さいのを入れてみる(入ったら入れて、はみ出たらアカウント)アルゴリズムにしたけど、
大きい順に入れて、はみ出たら入る最大の数字に出会うまで探索。探すものが無くなったらカウントってアルゴリズムに変えても結果は変わらず。
どうやって三番目が6個で済むんだろ。
出来た人、アルゴリズム教えて><
0510デフォルトの名無しさん
垢版 |
2018/11/16(金) 11:04:51.39ID:qaNu/as0
>>508
89 23| 67 45| 78 41| 60 21 33| 64 50| 61 58

全探索ではないけど
33 61 58 41 50 21 60 64 23 45 67 78 89
これを全ての順列作って前から順に120以内ぎりぎりのところで区切っていく
ってやり方で出てくる

このやり方もこれでは出来たけど最適解が必ず見つかるか分からない
0511114
垢版 |
2018/11/16(金) 11:42:51.07ID:00yShIqx
>>510
ありがとう。

やってみたけど、こっちでは順列だと1個増えた。
(と言うか、自分もソートしてから渡してるので順列なんだよね。念のため小さい順にしたら増えた)

うーん。。。
やってる事同じっぽいのに、なぜだ。。。
0512114
垢版 |
2018/11/16(金) 11:55:02.54ID:00yShIqx
自分は最後の一個入れようとして、入りきらなかったら入る分一個、はみ出た分一個で2個カウントしてるんだけど、そこが1個とカウントしてるとかだったり。。。
そう言う勘違いであってほしいな。。。

box n c ns [] [x] | c < sum (x:ns) = n + 2 -- x+nsで入りきらないので、nsで一個、xで一個。

じゃないと私じゃお手上げ\(^o^)/
0513デフォルトの名無しさん
垢版 |
2018/11/16(金) 11:57:38.57ID:qaNu/as0
入るとか入らないとかじゃなくてこの並びが出てきたら左から順に区切って行くだけだよ
89 23 67 45 78 41 60 21 33 64 50 61 58
0515114
垢版 |
2018/11/16(金) 12:23:45.77ID:00yShIqx
おおう。。。勘違い。
順列の意味勘違いしてた。
数学の順列か。分かった。
やってみる。
ありがとう。
0516デフォルトの名無しさん
垢版 |
2018/11/16(金) 12:25:57.98ID:tOyusnlA
>>510
必ず見つかる
最小になるパターンの内各箱の中を逆順にソートした数列を考えてみると自明
0517114
垢版 |
2018/11/16(金) 15:20:04.95ID:00yShIqx
多分これで出るはずだけど、家のPCが低スペックでメモリ不足で止まる。。。(ideoneでも止まる辺り、現実的じゃない)
(小さいリストでは確かめて見たので、動いてるっぽい?)

import Data.List

main = print $ map (\(x,ys)->(x, bmin x ys)) list

bmin x xs = minimum $ map (\lst -> box 0 x [] lst)
$ permutations xs

box c x [] [] = c
box c x ns [] = c + 1
box c x ns (y:ys) | x < sum (y:ns) = box (c + 1) x [] (y:ys)
box c x ns (y:ys) | x >= sum (y:ns) = box c x (y:ns) ys

list = [(30,[8,5,10,6,4,5,8,5,9,6,9]),
(120,[33,61,58,41,50,21,60,64]),
(120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]

せっかく >>510 さんに順列と言うヒント貰っておいて活かしきれてない。。。ごめん。
0518114
垢版 |
2018/11/16(金) 15:22:31.31ID:00yShIqx
>>510 さんに折角、順列って言うヒント貰っておいて活かせなかった。
ごめん。
0520デフォルトの名無しさん
垢版 |
2018/11/16(金) 15:40:46.44ID:i0pW9pnK
>>471
https://ideone.com/gsuOUp

力技、順列力技ゆえN<=20程度しか求められない。
TSPのやつの変形(2^n*n)、
冗長な計算してるのだろうが、実装できない

ついでに、min(乱択(5000回),貪欲解*2) 回答も書いてみた。
最初のと比較をしてみると、3000テストで42個、間違えた。
(ideone上は100テストで2つ間違っている)

※N,Cが小さければ、
この程度で、そのくらい当たりやすい問題なのだろう。
(逆に間違いを探すのが大変)

余談
これは『ビンパッキング問題』そのもの
でかいNに対しては、ググればもっといい近似値の求め方がある。
0521デフォルトの名無しさん
垢版 |
2018/11/16(金) 17:13:07.29ID:36ZZe95D
ビンパッキングって焼きなまし法(近傍が分からない)のとビームサーチ、どっちが効率良いだろうか
0523デフォルトの名無しさん
垢版 |
2018/11/16(金) 17:46:29.02ID:TvsPH/qp
>>522 Ruby
f = ->n{s = 0; while 0 < n /= 5; s += n; end; s}

[0, 1, 2, 3, 4, 5, 10, 100, 1000000,
10000000000000000].each{|e| puts '%d => %d' % [e, f[e]]}
# =>
0 => 0
1 => 0
2 => 0
3 => 0
4 => 0
5 => 1
10 => 2
100 => 24
1000000 => 249998
10000000000000000 => 2499999999999996
0524デフォルトの名無しさん
垢版 |
2018/11/16(金) 19:19:00.00ID:KTZidSV2
お題
N段の三角形ピラミッドの一筆書きを構成せよ

例えば、2段の三角形ピラミッドは以下のような図形である
 △
△ △

頂点の番号は上から順番に
1
2 3
4 5 6
……
と与えられる。

(入出力例)
N=1
=> 3 2 1 3

N=2
=> 1 2 4 5 2 3 5 6 3 1
=> 1 3 5 6 3 2 5 4 2 1 (解は複数あるが、そのうちの一つを出力すればよい)
0525デフォルトの名無しさん
垢版 |
2018/11/16(金) 20:05:31.22ID:JjlNk60X
>>524 Ruby
def hitofude(n)
  return [1] if n == 0
  x, y = n*(n + 1)/2, (n + 1)*(n + 2)/2
  [
    y,
    *hitofude(n - 1),
    *(1...n).flat_map{|i| [y - i, x - i]},
    *(x + 1..y),
  ]
end

[2, 3, 4].each{|i| p hitofude(i)}
# =>
[6, 3, 1, 2, 3, 5, 2, 4, 5, 6]
[10, 6, 3, 1, 2, 3, 5, 2, 4, 5, 6, 9, 5, 8, 4, 7, 8, 9, 10]
[15, 10, 6, 3, 1, 2, 3, 5, 2, 4, 5, 6, 9, 5, 8, 4, 7, 8, 9, 10, 14, 9, 13, 8, 12, 7, 11, 12, 13, 14, 15]
0527デフォルトの名無しさん
垢版 |
2018/11/17(土) 09:45:00.71ID:u+BaxmkL
>>471
やった。
順列使わないで三番目が6個になった!

Haskell

main = mapM_ print $ map mapbox (slist list)

slist xs = map (\(x,y) -> (x, qsort y)) xs

mapbox (x,y) = (x,length (box x [] [] y))

box _ [] [] [] = [[]]
box _ ns [] [] = [ns]
box c ns ys [x] | c >= sum (x:ns) = box c (x:ns) [] (reverse ys)
box c ns ys [x] | c < sum (x:ns) = [ns] ++ box c [] [] (reverse (x:ys))
box c ns ys (x:xs) | c >= sum (x:ns) = box c (x:ns) ys xs
box c ns ys (x:xs) | c < sum (x:ns) && c >= sum ((last xs):ns) = box c ns (x:ys) xs
box c ns ys (x:xs) | c < sum (x:ns) && c < sum ((last xs):ns) = [ns] ++ box c [] [] (reverse ys ++ (x:xs))


qsort [] = []
qsort (x:xs) = large ++ [x] ++ small
where
small = qsort [a|a <- xs,a <= x]
large = qsort [a|a <- xs,a > x]

list = [(30,[8,5,10,6,4,5,8,5,9,6,9]),
(120,[33,61,58,41,50,21,60,64]),
(120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
0528デフォルトの名無しさん
垢版 |
2018/11/17(土) 09:45:32.76ID:u+BaxmkL
qsort (x:xs) = large ++ [x] ++ small
where
small = qsort [a|a <- xs,a <= x]
large = qsort [a|a <- xs,a > x]

list = [(30,[8,5,10,6,4,5,8,5,9,6,9]),
(120,[33,61,58,41,50,21,60,64]),
(120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
0529デフォルトの名無しさん
垢版 |
2018/11/17(土) 09:46:31.74ID:u+BaxmkL
(120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
0530 ◆QZaw55cn4c
垢版 |
2018/11/17(土) 11:31:38.44ID:ByrEztlA
>>496
やっと理解しました…すべての xor 演算を利用しているわけではないのですね…
0531デフォルトの名無しさん
垢版 |
2018/11/17(土) 11:41:54.02ID:u+BaxmkL
>>522
Haskell

main = mapM_ print $ zip list $ map zlen list

zlen x = (length.(filter (== '0')).show.product) [1..x]

list = [0,1,2,3,4,5,10,100,1000,10000]

Out

(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(5,1)
(10,2)
(100,30)
(1000,472)
(10000,5803)
0533デフォルトの名無しさん
垢版 |
2018/11/17(土) 12:27:52.98ID:z9owpr8+
>>522 ぺちぷ
<?php
function solve(int $n):int{
$a=0;
for($i=5;$i<=$n;$i*=5)$a+=intdiv($n,$i);
return $a;
}

foreach([1,5,10,1e2,1e6,1e16] as $i)printf("%d -> %d\n",$i,solve($i));
?>

1 -> 0
5 -> 1
10 -> 2
100 -> 24
1000000 -> 249998
10000000000000000 -> 2499999999999996
0534デフォルトの名無しさん
垢版 |
2018/11/17(土) 12:46:05.88ID:u+BaxmkL
>>532
コリャうっかりw

zlen 差替え。

zlen x = (length.(takeWhile (== '0')).reverse.show.product) [1..x]
0535デフォルトの名無しさん
垢版 |
2018/11/17(土) 12:48:16.01ID:u+BaxmkL
実行結果

(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(5,1)
(10,2)
(100,24)
(1000,249)
(10000,2499)
0536デフォルトの名無しさん
垢版 |
2018/11/17(土) 15:08:29.22ID:thhERN1M
>>522 Perl5 その1:単純にloop
for $i (0,1,2,3,4,5,10,100,1000,10000,1000000) {
($s, $n) = ($i, 0);
while ($s) {
$s = int $s / 5;
$n += $s;
}
print "$i $n\n";
}
>>522 Perl5 その2: lambdaのtail recursion
use feature current_sub;
for $i (0,1,2,3,4,5,10,100,1000,10000,1000000) {
$n = sub {my $j = shift;
$j ? do {my $s = int $j / 5;
$s + __SUB__->($s)} : 0;
}->($i);
print "$i $n\n";
}
いずれも実行結果は
$ perl 12_522.pl
0 0
1 0
2 0
3 0
4 0
5 1
10 2
100 24
1000 249
10000 2499
1000000 249998
= i/5のreductionよりもエレガントな解法をしばらく考えていたけど一旦断念して投稿します
0537デフォルトの名無しさん
垢版 |
2018/11/17(土) 17:48:20.07ID:corCuJCM
お題
月(01から12)、日(01から31)、時(00から59)、分(00から59)、秒(00から59)の10桁の日付データで
全部の桁が異なる場合を全て求める。だ
0538デフォルトの名無しさん
垢版 |
2018/11/17(土) 17:53:02.90ID:corCuJCM
すいません。最後の文字はゴミです無視してください
0540デフォルトの名無しさん
垢版 |
2018/11/17(土) 19:03:48.66ID:corCuJCM
>>539
その通りです。すいません。
時(00から23)に訂正します。
0541デフォルトの名無しさん
垢版 |
2018/11/17(土) 19:42:56.43ID:qglse9qW
>>537 Ruby
date = (3..9).flat_map do |mo|
  [*1..2].permutation.flat_map do |dd, dh|
    ([*3..5] - [mo]).permutation(2).flat_map do |dm, ds|
      ([*3..9] - [mo, dm, ds]).permutation.map do |d, h, m, s|
        [0, mo, dd, d, dh, h, dm, m, ds, s] if dh == 1 || h < 4
      end
    end
  end
end.compact

p date.size
# => 768
puts date.map(&:join)
# => 0326174859
0326174958
0326184759
0326184957
0326194758
0326194857
0327164859
0327164958
0327184659
0327184956
... 略
0543デフォルトの名無しさん
垢版 |
2018/11/17(土) 20:30:15.26ID:z9owpr8+
>>536
ルジャンドルの定理がエレガントでは無いと申すか
0544デフォルトの名無しさん
垢版 |
2018/11/17(土) 20:54:52.23ID:u+BaxmkL
>>537
Haskell

main = ((mapM_ putStrLn).only.(zip (ccheck date10))) date10

n2 n | n < 10 = '0':show n
n2 n = show n

only = (map (\(_, d) -> d)).filter (\(x,_) -> x == False)

ccheck = map ((elem False).count)

count xs = map (\c -> ((<2).length.(filter (== c))) xs) "1234567890"


date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec]
| month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]]

パターン数字や最初付近が合ってるかはRubyの人(>>541)ので確認したので多分合ってる。
0545デフォルトの名無しさん
垢版 |
2018/11/17(土) 20:56:09.09ID:u+BaxmkL
ccheck = map ((elem False).count)

count xs = map (\c -> ((<2).length.(filter (== c))) xs) "1234567890"


date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec]
| month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]]


>>541 の人ので答え合わせしたので、多分合ってる。
0546デフォルトの名無しさん
垢版 |
2018/11/17(土) 20:57:39.57ID:u+BaxmkL
date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec]
| month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]]


>>541 の結果で答え合わせ済み。
0547デフォルトの名無しさん
垢版 |
2018/11/17(土) 20:58:20.76ID:u+BaxmkL
>>541 の結果で答え合わせ済み。
0549デフォルトの名無しさん
垢版 |
2018/11/17(土) 22:37:13.60ID:BeWwS75G
>>537 Perl5
sub f {grep{!/(.)\1/} map{sprintf "%02d", $_} @_}
sub g {map{$_=>1} split'', shift}
for $M (1..10,12) {
($S) = f($M);
$D = $M == 2 ? 28 : ($M =~ /(4|6|9)/ ? 30 : 31);
for $d (f 1..$D) {
%t = g "$S$d";
next if 4 != keys %t;
for $h (f 1..23) {
%t = g "$S$d$h";
next if 6 != keys %t;
for $m (f 0..59) {
%t = map{$_=>1} split'', "$S$d$h$m";
next if 8 != keys %t;
for $s (f 0..59) {
%t = map{$_=>1} split'', "$S$d$h$m$s";
next if 10 != keys %t;
print "$S$d$h$m$s\n";
} } } } }

実行結果
$ perl 12_537.pl
0326174859
0326174958
0326175849
... 中略
0928175436
0928175634
0928175643
計768個
0550デフォルトの名無しさん
垢版 |
2018/11/17(土) 23:10:25.25ID:u+BaxmkL
>>544

03/26 17:48:59

みたいに書式化してるんだけど、RubyもPerlも数字だけなのな。。。
その方が速いのは分かるけど。
0551デフォルトの名無しさん
垢版 |
2018/11/17(土) 23:53:27.88ID:BeWwS75G
>>543
数学的にルジャンドルの定理と同じ原理に帰結する解法であっても
もっとエレガントなコードアーキテクチャ、たとえば桁の三角形の5と10を
再帰的に渡り歩いてshiftしながら足しこんでいくようなすごくシンプルで、
もっと短いコード実現を探してたという意味です。

つか5とか10とか100とか通過するたびに0が一桁二桁増えることに
パターンがあるのに気がついてうまく使おうとしたけど、
それがルジャンドルの定理のひとつだとは知りゃせんでした。
0554デフォルトの名無しさん
垢版 |
2018/11/18(日) 05:42:08.97ID:HhgIFMcS
分かっちゃ居たけど、聞いたこともない定理が出る辺り高卒にはエレガントな回答は無理ぽ。。。
0557デフォルトの名無しさん
垢版 |
2018/11/18(日) 11:15:29.83ID:HhgIFMcS
>>522
せっかくルジャンドルの定理を知ったので作り直してみた。
Haskell

main = ((mapM_ print).(zip list).(map (zlen 0 1))) list

zlen ans x n | 5 ^ x > n = ans
zlen ans x n = zlen (n `div` (5 ^ x) + ans) (x + 1) n

list = [0,1,2,3,4,5,10,100,1000,10000,12000,100000000]
0558デフォルトの名無しさん
垢版 |
2018/11/18(日) 13:05:15.26ID:oKOqkAfz
お題:同調圧力

要素0,1からなる3次以上の正方行列がある。
縦、横、対角線に0が1個だと1に変化する。この変化が繰り返される。
最後にすべての要素が1になる最小数の1の数と初期配置を求めよ。
0560デフォルトの名無しさん
垢版 |
2018/11/18(日) 14:07:39.31ID:/U8hetN/
>>554
ttp://examist.jp/mathematics/math-a/integer/kaijyou-soinsu/
ttps://www.youtube.com/watch?v=pWV0mlibNGQ

高校数学の範囲内だろ
「高卒」なる言い訳が通用するほど高校数学は甘くない
0562デフォルトの名無しさん
垢版 |
2018/11/18(日) 14:54:31.18ID:HhgIFMcS
>>555

>>559-560

そうだね。
高卒だからは言い訳だ。
そう言うのを思いつけない頭の悪さでプログラマーに成れなかった。
それだけだな。
0563デフォルトの名無しさん
垢版 |
2018/11/18(日) 15:01:13.02ID:XHHQeobW
>>562
短時間で車輪を思い付く/付かないはある意味、向き/不向きでもある
そういうひらめきタイプじゃなくてもちゃんと食べているプログラマーはいっぱいいるぞ
0564デフォルトの名無しさん
垢版 |
2018/11/18(日) 16:24:57.02ID:HhgIFMcS
>>563
ありがとう。
でももう、プログラマー目指す年齢じゃないから^^;

iPadのHaskell(Raskell)で力付くでも12000!までは解ける辺り、
効率悪くてもとりあえず動く物を作れるようになったのは良い時代になったと思う。
0565 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 19:54:03.12ID:KS5/UdBT
>>560
その動画、素因数の5を数えればよい、と言い切っちゃっているが、2は数えなくてもいいのか?あるいは 2 を数えなくてもいい理由を述べていないよね
それに、どうして素因数分解は必ずひととおりになるのですか?二通りになるかもしれないのでは?
0566デフォルトの名無しさん
垢版 |
2018/11/18(日) 19:58:30.97ID:/tSlZOJ0
そうだね
おまけに足し算がアーベル群を成していないかもしれないから和と自然数の定義から確認しないと駄目だね
0567デフォルトの名無しさん
垢版 |
2018/11/18(日) 21:11:02.75ID:cU5Dmtcu
今、((2n-1)2^m, n5^m)をペアで考えるよ
そうすると、1≦n, mで常に(2n-1)2^m≦n2^(m+1)≦n4^m≦n5^mになる
で、ということはx!の中にある5の倍数が含まれるなら、対応した2の倍数もまた含まれていて素因数の個数が同じ
なので素因数は5だけ数えれば良い
素因数分解が一通りなのは自明なので定義からやり直せ
0568デフォルトの名無しさん
垢版 |
2018/11/18(日) 21:18:15.05ID:HyP7YfXU
2以上のnに対しn!=(2^p)*(5^q)*N(Nと2と5は互いに素)とする非負整数p,q,Nがただ一組存在して
p>qであることはほとんど自明だが証明しろと言われると…
0569デフォルトの名無しさん
垢版 |
2018/11/18(日) 21:24:02.32ID:HhgIFMcS
>>565

https://mathtrain.jp/legendretheorem

末尾の 0の数は,10で何回割り切れるか,すなわち 2で割れる回数と 5で割れる回数の少ない方である。
(直感的に考えて 5 で割れる回数のほうが少ないので 5で割れる回数だけ考えればよいが練習のため,)
0571 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 21:56:44.59ID:KS5/UdBT
>>567
>素因数分解が一通りなのは自明
自明ではないと思います…「素数の定義は 1 と自身以外の約数を持たない」であって「素数の積が一通り」ではないですから

>そうすると、1≦n, mで常に(2n-1)2^m≦5^mになる
OKです

>で、ということはx!の中にある5の倍数が含まれるなら、対応した2の倍数もまた含まれていて素因数の個数が同じ
ここは飛躍しているのでは?
n・5^m →(2n-1)・2^m
と対応づけるとき n・5^m の形の数が決して (2n-1)・2^m の形にならないのであれば一対一の対応がとれますが、n・5^m の形であってかつ (2n-1)・2^m の形である整数が存在する場合は一対一の対応にならない
厳密に一対一の対応にならないのなら、因数 2 の個数と因数 5 の個数の大小についてなにもいえないのでは?
0572 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 21:58:55.74ID:KS5/UdBT
>>569
>直感的に考えて 5 で割れる回数のほうが少ないので
あくまでも「直感的に」ですよね
厳密にそういえますか?
0574デフォルトの名無しさん
垢版 |
2018/11/18(日) 22:33:22.36ID:ryC6c2pW
>>565
証明はされているしググれば出てくる
内容についてはこのスレの趣旨的にここで深く論じる事ではないと思う
0576デフォルトの名無しさん
垢版 |
2018/11/18(日) 22:42:22.16ID:qz83zcM7
お題
UTF-8のバイト列が与えられるので、Unicodeのコードポイントを求めよ

6F 64 61 69
=> U+006F U+0064 U+0061 U+0069

E3 81 8A E9 A1 8C
=> U+304A U+984C

C2 A9 F0 9F 8D 94 E9 A6 99 41
=> U+00A9 U+1F354 U+9999 U+0041
0578 ◆QZaw55cn4c
垢版 |
2018/11/18(日) 23:51:49.66ID:KS5/UdBT
>>574
>内容についてはこのスレの趣旨的にここで深く論じる事ではない
一理あるとは思います
0580デフォルトの名無しさん
垢版 |
2018/11/19(月) 00:12:50.43ID:En0/bEno
>>571 n・5^m=(2n-1)・2^mなら、nは2の累乗かつ2n-1は5の累乗(2と5は互いに素なので)
でも、2n-1が5の累乗だとするとn=3,13,63,313…と奇数なので(f(1)=3, f(x)=f(x-1)+2・5^(x-1)で導出)nが2の累乗であることに矛盾する
素因数分解が一意なのはwikipediaにでも載ってる
というか自分である程度考えてよ……粗探ししてないでさ
0582 ◆QZaw55cn4c
垢版 |
2018/11/19(月) 00:25:31.38ID:MufxDZB0
>>580
> n・5^m=(2n-1)・2^m
そう置くのではなく
a・5^b = (2c-1)・2^d
と置くべきなのでは?

たとえば m = 1 のとき n の小さいものから順に
1・5 → 1・2
2・5 → 3・2
3・5 → 5・2…@
ここ@で 5・2 はすでに数え上げているので、一対一対応になっていないと思います
一対一対応にならない以上、>>571 の推論は飛躍しているのではないでしょうか
繰り返しますが

>>571
「n・5^m の形であってかつ (2n-1)・2^m の形である整数が存在する場合は一対一の対応にならない
厳密に一対一の対応にならないのなら、因数 2 の個数と因数 5 の個数の大小についてなにもいえないのでは?」
です
0584デフォルトの名無しさん
垢版 |
2018/11/19(月) 01:06:40.64ID:4D1JIT10
>>576
大変勉強になりました。

const getCP = s => [...new TextDecoder('utf-8').decode(Uint8Array.from(s.split` `.map(x => parseInt(x, 16))))].map(u => 'U+' + u.codePointAt().toString(16).toUpperCase().padStart(4, 0)).join` `

getCP('6F 64 61 69')
=> "U+006F U+0064 U+0061 U+0069"
getCP('E3 81 8A E9 A1 8C')
=> "U+304A U+984C"
getCP('C2 A9 F0 9F 8D 94 E9 A6 99 41')
=> "U+00A9 U+1F354 U+9999 U+0041"
0588デフォルトの名無しさん
垢版 |
2018/11/19(月) 10:25:48.15ID:X6/A5UND
問題と言うより、単純な興味なんだけど。
Cでこんなコード書いて
(Hello World!!が横に流れ続けて下でマークがクルクル回る)

https://ideone.com/ZaZSaa

それをHaskellで書いてみたのね。

https://ideone.com/ui16nc

ハイブリッドな言語増えて来たので、他の言語だとどう書くのかなって。
出来れば破壊的なのと、関数型っぽく非破壊的なのと見てみたい。
(ミュータブル版とイミュータブル版)
0590デフォルトの名無しさん
垢版 |
2018/11/19(月) 11:00:22.26ID:X6/A5UND
>>589
精一杯考えて説明したつもりなので、Cのコードコンパイルして実際にコマンドで動かしてもらえれば。

それと同じ動きになるコードを書いて欲しいと言うことです。
(出来れば初期化以外の変数代入有りと無しで)
0592デフォルトの名無しさん
垢版 |
2018/11/20(火) 00:53:04.42ID:yKairBEQ
>>576
python 3
for x in ["6F 64 61 69","E3 81 8A E9 A1 8C","C2 A9 F0 9F 8D 94 E9 A6 99 41"]:
__print(" ".join(['U+{:04X}'.format(ord(y)) for y in bytes.fromhex(x).decode("utf-8")]))
->
U+006F U+0064 U+0061 U+0069
U+304A U+984C
U+00A9 U+1F354 U+9999 U+0041
0596デフォルトの名無しさん
垢版 |
2018/11/20(火) 11:19:51.35ID:XC6mINx9
>>576 Ruby 仕様をそのまま。ただし冗長性のチェックだけはしていない

def divide_prefix(byte)
  raise 'invalid byte' if byte & 0xF8 == 0xF8
  prefix_len = (1..8).find{|i| (byte >> 8 - i) & 1 == 0}
  prefix = (1 << prefix_len - 1) - 1 << 1
  {prefix: prefix, body: byte - (prefix << 8 - prefix_len)}
end

def utf8_codepoints(bytes)
  ary = bytes.map{|e| divide_prefix(e)}
  leading_bytes = ary.select{|dc| dc[:prefix] != 0x02}
  leading_bytes.map do |lb|
    utf8_char = ary.shift(lb[:prefix] == 0 ? 1 : lb[:prefix].bit_length - 1)
    raise 'invalid sequence' if utf8_char[1..-1]&.any?{|dc| dc[:prefix] != 0x02}
    utf8_char.reverse_each.with_index.map{|dc, i| dc[:body] << 6 * i}.sum
  end
end

[
  '6F 64 61 69',
  'E3 81 8A E9 A1 8C',
  'C2 A9 F0 9F 8D 94 E9 A6 99 41'
].each{|str| puts utf8_codepoints(str.split.map(&:hex)).map{|e| 'U+%04X' % e}.join(' ')}
# =>
U+006F U+0064 U+0061 U+0069
U+304A U+984C
U+00A9 U+1F354 U+9999 U+0041
0597デフォルトの名無しさん
垢版 |
2018/11/20(火) 13:23:53.49ID:FaN+D89v
>>588 Ruby ターミナル上で10秒間 <marquee>Hello, world</marquee> & 棒がぐるぐる的な感じ

duration = 10
wait = 0.1
str = 'Hello, World!'
len = str.size
bar = %w[- / | \\ ]
clear_lines = -> n {puts "\e[#{n}\e[#{n}A"}

# 非破壊的
str2 = 'Hello, World!' * 2
(duration / wait).round.times{|i|puts str2[i % len, len], bar[i % 4]; sleep(wait); clear_lines[2]}

# 破壊的
hello_ary = 'Hello, World!'.split('')
(duration / wait).round.times{puts hello_ary.rotate!.join, bar.rotate!.first; sleep(wait); clear_lines[2]}
0598デフォルトの名無しさん
垢版 |
2018/11/20(火) 13:50:30.38ID:+huVy/La
訂正

duration = 10
wait = 0.1
str = 'Hello, World!'
bar = %w[- / | \\ ]
clear_lines = -> n {puts "\e[#{n}\e[#{n}A"}

# 破壊的
str_ary = str.split('')
bar_ary = [*bar]
(1..duration / wait).each{puts str_ary.rotate!.join, bar_ary.rotate!.first; sleep(wait); clear_lines[2]}

# 非破壊的
str2 = str * 2
(1..duration / wait).each{|i|puts str2[i % sitr.size, str.size], bar[i % 4]; sleep(wait); clear_lines[2]}
0599デフォルトの名無しさん
垢版 |
2018/11/20(火) 23:12:15.60ID:Vm2a6rBd
世界一気持ち良いフェラチオのアルゴリズムを作れ
0600デフォルトの名無しさん
垢版 |
2018/11/21(水) 05:38:04.65ID:yscr9wE/
>>537
Ruby で実行すると、Timeout になりました!

# 10桁の文字列で、重複した文字が無いものは、いくつあるか?

month = ("01".."12").to_a
day = ("01".."31").to_a
hour = ("00".."23").to_a
min = sec = ("00".."59").to_a

# uniq! は変化が無ければ、nil
p month.product( day, hour, min, sec )
.reject { | mon, d, h, min, s | ( mon + d + h + min + s ).chars.uniq! }
.length
0601デフォルトの名無しさん
垢版 |
2018/11/21(水) 08:13:38.75ID:KQDfl3zy
>>600
.reject { | mon, d, h, min, s | ( mon + d + h + min + s ).chars.uniq! }が無駄過ぎ
.reject(&:uniq!)で良い。それでも良いコードではない
あとこれだと2月31日とかが含まれてしまう可能性考慮してないよね(実際には含まれないが)
0602デフォルトの名無しさん
垢版 |
2018/11/21(水) 13:17:27.94ID:r/9FyEhs
>>541 をちょっと変更。月を分ける必要がなかった
date = [1, 2].permutation.flat_map do |dd, dh|
  [*3..5].permutation(2).flat_map do |dm, ds|
    ([*3..9] - [dm, ds]).permutation.map do |mo, d, h, m, s|
      [0, mo, dd, d, dh, h, dm, m, ds, s] if dh == 1 || h == 3
    end
  end
end.compact.sort
0603デフォルトの名無しさん
垢版 |
2018/11/21(水) 13:59:24.73ID:89fYavxU
月日時分秒で文字列で並べる前に11月とか11日とか22日とか必ず各桁が同じ値になるやつ最初から省けば無駄がなくなって少し速くならんか?
0606デフォルトの名無しさん
垢版 |
2018/11/21(水) 19:31:36.89ID:fvygYhm9
12*31*60*60*60=80,352,000通りの桁が異なるか判定より、10桁並び替え10!=3,628,800通りが日付になってるか判定の方が速そう
0608デフォルトの名無しさん
垢版 |
2018/11/21(水) 19:50:15.56ID:XrCNlm4w
最初の4桁は高々365パターンしかないからその各組について残り6桁720通り検討すれば262,800通りで済む
0609デフォルトの名無しさん
垢版 |
2018/11/21(水) 19:55:14.22ID:XrCNlm4w
ちなみに最初の4桁で数字に重複がないのは130通りしかないからここできちんと処理すれば93,600通りで済む
0610デフォルトの名無しさん
垢版 |
2018/11/21(水) 20:17:28.45ID:Pa+SHuBo
普通にやれば768通りで済む
時間が 0x/1d 23:Mm:Ss なら
{M, S} = {4, 5} で残りは4つの数字の任意の順でOK
2 * 4! 通り

時間が 0X/2d 1h:Mm:Ss なら
M, S は異なる{3, 4, 5}の元で残りは5つの数字の任意の順でOK
3P2 * 5! 通り

全部で (2 + 3P2 * 5) * 4! = 768 通り
0611デフォルトの名無しさん
垢版 |
2018/11/21(水) 20:32:17.09ID:89fYavxU
>>605
そうかも。
やっぱただの二重ループで調べるのが一番速いかな?

最初はSetに一文字づつ入れて同じのが既にあったらっていう判定してたんだけどね、正規表現なら一発で判定できると気づいてそちらにした。
まあでも正規表現だから中で複雑な動きになってるかも知れないな。
0612デフォルトの名無しさん
垢版 |
2018/11/21(水) 20:41:48.33ID:89fYavxU
良く考えたら各桁が数字しかないから10ビットのビットフラグ立てるかBoolenArrayで10要素あれば重複調べられるな。後で変えよう。
0613デフォルトの名無しさん
垢版 |
2018/11/21(水) 21:02:48.05ID:fvygYhm9
お題
以下の操作を好きなだけ行う時、0をXにするまでに必要な最小コストを求めよ
・コスト1で値を1増減させる
・コストn+Yで値をn倍する
XとYは与えられ、0以上の整数であることが保証される
nは自然数の範囲で任意に決めて良い
例(X, Y)
1 3
20 2
63 2
出力
3
11
17
0614デフォルトの名無しさん
垢版 |
2018/11/21(水) 21:03:37.61ID:Gj+ctZjI
お題
N個の正整数を並べ替えたあと結合してできる整数の最小値を求めよ

3 2 1
=> 123

1 2 21
=> 1212

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
=> 10111121314151623456789
0616デフォルトの名無しさん
垢版 |
2018/11/21(水) 21:47:53.81ID:DBPerFhf
>>614 Perl5
use feature say;
for (<DATA>) {
s/\s*//g;
$z = tr/0//;
@a = grep{$_} sort split '';
$a = shift @a;
say join '',($a, (0)x$z, @a);
}
__DATA__
3 2 1
1 2 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

execution
$ perl 12_614.pl
123
1122
10111111112233445566789
0618デフォルトの名無しさん
垢版 |
2018/11/21(水) 22:06:23.31ID:DBPerFhf
>>616 Perl5
use List::Util max;
use feature say;
for (<DATA>) {
@a = split;
$n = max map{length} @a;
say $n;
$b = join '', sort map{$_.'a'x($n-length)} @a;
$b =~ s/a//g;
say $b;
}
__DATA__
3 2 1
1 2 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

実行
$ perl 12_614.pl
123
1212
10111213141516123456789
0619デフォルトの名無しさん
垢版 |
2018/11/21(水) 22:08:43.18ID:DBPerFhf
>>618
途中の
say $n;
は不要なdebug write、
削除して下記と差し替え

use List::Util max;
use feature say;
for (<DATA>) {
@a = split;
$n = max map{length} @a;
$b = join '', sort map{$_.'a'x($n-length)} @a;
$b =~ s/a//g;
say $b;
}
__DATA__
3 2 1
1 2 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0623デフォルトの名無しさん
垢版 |
2018/11/21(水) 22:32:28.49ID:XrCNlm4w
>>614
python3

def keyMaker(x):
__x = [int(y) for y in x]
__x.append(x[-1]+0.1)
__return x

for y in ["3 2 1","1 2 21", "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"]: print(int("".join(sorted(y.split(),key=lambda x: keyMaker(x)))))
->
123
1212
10111121314151623456789

0.1足さないと "10 11 101 100"で間違えるな
0627デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:11:59.00ID:DBPerFhf
>>614 Perl5
use feature say;
say sort{"$a$b"<=>"$b$a"} split for <DATA>;
__DATA__
3 2 1
1 2 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


実行
$ perl 12_614.pl
123
1212
10111121314151623456789
0628デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:12:22.88ID:jrFgFGaV
お題:分数を小数に直したときの循環部分の周期を求める
割り切れる場合は0とする
例:
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => ?
99998360006603 / 9999901 => ?
0630デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:21:24.98ID:jrFgFGaV
123412345/999999999 => 9
>>628の例に追加
0633デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:40:44.97ID:7Tiab2M6
>>632
循環部の周期じゃなくて、小数点以下の循環部の終わる位置を調べてる気がしてきた…修正が必要ですw
0634デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:56:52.64ID:DBPerFhf
>>628 >>630 Perl5
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my $n;
do {
$x = 10 * $x % $y;
$n++
} while $x != $m;
print "$X/$y => ", ($x ? $n : $x), "\n";
}
__DATA__
1 3
10 2
988027 983
919 870473
1223 1476221
99998360006603 9999901
123412345 999999999

実行
$ perl 12_628.pl
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => 122816
99998360006603/9999901 => 1999980
123412345/999999999 => 9
0635デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:02:55.27ID:YC9N9M8Q
>>633
そういわれると>>634も自信がなくなってきたので念のため修正
>>628 >>630 Perl5
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my ($n, %h);
$h{$x} = 1;
do {
$x = 10 * $x % $y;
$n++
} until $h{$x};
print "$X/$y => ", ($x ? $n : $x), "\n";
}
__DATA__
1 3
10 2
988027 983
919 870473
1223 1476221
99998360006603 9999901
123412345 999999999

実行
$ perl 12_628.pl
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => 122816
99998360006603/9999901 => 1999980
123412345/999999999 => 9
0640デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:16:08.77ID:YC9N9M8Q
>>638 いや変なところから巡回し始める数値があれば>>635 も無限ループ
以下修正版。しかし少し進んでからようやく巡回し始める数値ってあるんだろうか…
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my ($n, %h);
$h{$x} = 1;
while(1) {
$x = 10 * $x % $y;
$n++;
last if $h{$x};
$h{$x} = 1;
}
print "$X/$y => ", ($x ? $n : $x), "\n";
}
__DATA__
1 3
10 2
988027 983
919 870473
1223 1476221
99998360006603 9999901
123412345 999999999
0641デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:19:18.30ID:YC9N9M8Q
>>639
しらんがなサイトのtimeout秒設定とちゃいますか
いま使っているPC(CPU Core U1300 1.06Gz)では
一番遅い>>640のソースで

$ time perl 12_628.pl
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => 122816
99998360006603/9999901 => 1999980
123412345/999999999 => 9

12.312 secs
0643デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:26:34.37ID:YC9N9M8Q
>>642 うちのPCだと
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my ($n, %h);
$h{$x} = 1;
while(1) {
$x = 10 * $x % $y;
$n++;
last if $h{$x};
$h{$x} = 1;
}
print "$X/$y => ", ($x ? $n : $x), "\n";
}
__DATA__
1234 55

実行
$ time perl 12_628.pl
1234/55 => 3
0.281 secs

Perlは5.20.3 32 bit, integerは64bit のもの。
5.16.3 32 bit, integer が32bitでも
1234/55 は => 3
になるよ
0645デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:33:49.88ID:YC9N9M8Q
>>644
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my ($n, %h);
$h{$x} = 1;
while(1) {
$x = 10 * $x % $y;
$n++;
last if $h{$x};
$h{$x} = 1;
}
print "$X/$y => ", ($x ? $n : $x), "\n";
}
__DATA__
1234 555


Perl 5.20.3 32 bit, integer 64bit
$ perl.exe 12_628.pl
1234/555 => 4
0.266 secs

Perl 5.16.3 32 bit, integer 32bit
$ perl 12_628.pl
1234/555 => 4
0648 ◆QZaw55cn4c
垢版 |
2018/11/22(木) 00:44:22.07ID:r9/Xo7jY
>>583
私もよーく考えました、>>567 の推論で正しいと思い直しました。
「数字と数字を対応させる」のではなく「数字の中の因数5 と別の数字の中の因数 2 とを対応させる」んですね,週末になったらちゃんと書きます

ごめんなさい…
0649デフォルトの名無しさん
垢版 |
2018/11/22(木) 00:47:46.57ID:YC9N9M8Q
>>628 >>630 Perl5
for (<DATA>) {
($X, $y) = split;
$x = $m = $X % $y;
my ($n, %h);
$h{$x} = $n++;
while(1) {
$x = 10 * $x % $y;
last if $h{$x};
$h{$x} = $n++;
}
print "$X/$y => ", ($x ? $n-$h{$x} : $x), "\n";
}
__DATA__
1 3
10 2
988027 983
919 870473
1223 1476221
99998360006603 9999901
123412345 999999999
1234 555
実行
$ perl 12_628.pl
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => 122816
99998360006603/9999901 => 1999980
123412345/999999999 => 9
1234/555 => 3
0651デフォルトの名無しさん
垢版 |
2018/11/22(木) 03:19:07.41ID:zC+py8mV
>>613
問題の意味がわからない。
0652デフォルトの名無しさん
垢版 |
2018/11/22(木) 04:04:02.81ID:dySjvlSp
>>628 Ruby

f = -> d {
  [2, 5].each{|e| d /= e while d % e == 0}
  return 0 if d == 1
  r = 1; (1..d).find{|i| 1 == r = 10 * r % d}
}

%w[
  1/3 10/2 988027/983 919/870473 1223/1476221 99998360006603/9999901 123412345/999999999 1234/555
].each{|e| n, d = e.split(?/).map(&:to_i); puts '%d/%d => %d' % [n, d, f[d / d.gcd(n)]]}
# =>
1/3 => 1
10/2 => 0
988027/983 => 982
919/870473 => 54288
1223/1476221 => 122816
99998360006603/9999901 => 1999980
123412345/999999999 => 9
1234/555 => 3
0653デフォルトの名無しさん
垢版 |
2018/11/22(木) 15:33:08.34ID:yB1Us7SO
17941970723/5711177472=
3.
14155370
[
07847337299484291004011020163934418881248871826338
51095286012502326945724442022732505973857434350098
中略
81545008587679202836020711912487386979243218306349
2795623634229099298422222099702245
](周期=1584)
であってる?
0657デフォルトの名無しさん
垢版 |
2018/11/23(金) 19:09:31.91ID:VH48PKdk
>>613 Ruby 再帰
def cost(x, y)
return [0] if x == 0
table = cost(x - 1, y)
table << table.flat_map.with_index{|e, i|
i == 0 ? [x] : [x / i, -(-x / i)].uniq.map{|v| e + v + y + (i * v - x).abs}
}.min
end

[[1,3], [3, 1], [20, 2], [63, 2]].each{|e| puts 'X = %d, Y = %d => %d' % [*e, cost(*e).last]}
# =>
(X, Y) = (1, 3) => 1
(X, Y) = (3, 1) => 3
(X, Y) = (20, 2) => 11
(X, Y) = (63, 2) => 17
0658デフォルトの名無しさん
垢版 |
2018/11/23(金) 19:12:10.98ID:K3SLU2ZA
>>614
f = ->str{str.split.sort{|a, b| a + b <=> b + a}.join}

['3 2 1', '1 2 21', '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16'].each{|e| puts '%s => %s' % [e, f[e]]}
# =>
3 2 1 => 123
1 2 21 => 1212
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 => 10111121314151623456789
0659デフォルトの名無しさん
垢版 |
2018/11/23(金) 19:34:32.58ID:oncB24e2
お題: 入力をHTMLのリストに変換しなさい。

入力:
* aaa
* bbb
* ccc

* aaa
* bbb
* ccc

出力:
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
0660デフォルトの名無しさん
垢版 |
2018/11/23(金) 19:51:58.05ID:ZGD1vCd6
お題
非負整数の10進数表記を"マイナス10進数"表記に変換せよ

321 => 481 (400 - 80 + 1)
910 => 19090 (10000 - 9000 + 000 - 90 + 0)
909 => 909
0 => 0
11111 => 29291
123456789 => 284664829
0662デフォルトの名無しさん
垢版 |
2018/11/23(金) 21:05:33.15ID:Hqw3cjct
>>659 Ruby
puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).join('</li><l>

入力:
* aaa
* bbb
* ccc

* aaa
* bbb
* ccc

出力:
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
0663デフォルトの名無しさん
垢版 |
2018/11/23(金) 21:07:03.88ID:Hqw3cjct
>>662 途切れたので訂正
puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).('</li><li>')}.join("</ul>\n<ul>")
0664デフォルトの名無しさん
垢版 |
2018/11/23(金) 21:10:53.54ID:Hqw3cjct
>>663 連投ごめん 訂正
puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).join('</li><li>')}.join("</ul>\n<ul>")
0665デフォルトの名無しさん
垢版 |
2018/11/23(金) 22:18:17.60ID:Hqw3cjct
>>660 Ruby

f = -> n {return n if n < 10;a, b = n.divmod(100); c, d = b.divmod(10); 100 * f[a - (-c / 10)] + 10 * (-c % 10) + d}

[321, 910, 909, 0, 11111, 123456789].each{|e| puts '%d => %d' % [e, f[e]]}
# =>
321 => 481
910 => 19090
909 => 909
0 => 0
11111 => 29291
123456789 => 284664829
0666デフォルトの名無しさん
垢版 |
2018/11/23(金) 23:32:40.54ID:RKSYf6WR
>>659 Perl5
for (split /\n\n/, <<EOL)
* aaa
* bbb
* ccc

* aaa
* bbb
* ccc
EOL
{ @a = map{"<li>$_</li>"} /\* (\w+)/g;
print "<ul>", @a, "</ul>\n";
}

実行結果
$ perl 12_659.pl
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
<ul><li>aaa</li><li>bbb</li><li>ccc</li></ul>
0667デフォルトの名無しさん
垢版 |
2018/11/24(土) 00:04:24.01ID:IB4DmzOp
>>666
* 以降にスペース文字が含まれていても、もれなく扱うなら
@a = map{"<li>$_</li>"} /\* (\w+)/g;

@a = map{"<li>$_</li>"} /\* ([^\n]+)/g;
0668デフォルトの名無しさん
垢版 |
2018/11/24(土) 02:05:34.99ID:Q9o1GKtC
>>660
問題の意味がわからない。
0669デフォルトの名無しさん
垢版 |
2018/11/24(土) 02:34:23.79ID:noZFD3Jl
>>668
俺も分からなかったんで調べたら例えば4桁のn進数 A3 A2 A1 A0 の場合
A0 * n^0 + A1 * n^1 + A2 * n^2 + A3 * n^3
となるわけだけど、単純にこのnが-10ならマイナス10進数ということらしい
0671デフォルトの名無しさん
垢版 |
2018/11/24(土) 02:43:21.86ID:Q9o1GKtC
>>669
なるほど。そういうことか。ありがとう。
0673デフォルトの名無しさん
垢版 |
2018/11/24(土) 03:43:39.38ID:Q9o1GKtC
>>628
Kotlin
https://paiza.io/projects/DwesufgOG64B8-KN_ErG5w
C
https://paiza.io/projects/HwczmyQnaji1IgHICqHrIg

最初 Kotlin で作って確認した後で paiza.io にコピペして実行したら 99998360006603 / 9999901 が
タイムアウトしてしまい、じゃあ C で作るか(ついでに tsearch() 使ってみるか)と思ってやってみたが
相変わらず同じ計算でタイムアウトした。

まあしかしそれ以外の計算はなんとかなったので両方公開しとく。

アルゴリズムは割った余りを10倍するのを繰り返して同じ余りが出たらそこで循環と判定するというやつ。
0674デフォルトの名無しさん
垢版 |
2018/11/24(土) 04:00:55.96ID:7YEvwBu9
>>659 javascript
`
* aaa
* bbb
* ccc

* aaa
* bbb
* ccc
`.split`\n\n`.map(ol => `<ol><li>${ol.match(/(?<=\* ).*/g).join`</li><li>`}</li></ol>`).join`\n`
出力:
<ol><li>aaa</li><li>bbb</li><li>ccc</li></ol>
<ol><li>aaa</li><li>bbb</li><li>ccc</li></ol>

// 本物のdocument fragment作っちゃう版
var fragment = `
* aaa
* bbb
* ccc

* aaa
* bbb
* ccc
`.trim().split`\n\n`.map(ol => ol
.match(/(?<=\* ).*/g)
.reduce((acc, li) => (acc.appendChild(document.createElement`li`).innerHTML = li, acc), document.createElement`ol`))
.reduce((acc, ol) => (acc.appendChild(ol), acc), document.createDocumentFragment())

document.querySelector('div#target').appendChild(fragment)など任意のエレメントにそのままappend可能。
0676デフォルトの名無しさん
垢版 |
2018/11/24(土) 05:38:41.45ID:Q9o1GKtC
>>628
C (その2)
https://paiza.io/projects/21K5fAVsJlYtob_H0rZ9LA

よく考えたら出来た。
循環になっている桁の最初の余りを取っておいて次に出るまでカウントすれば良いだけで余りを全て保存しておく必要ないんだな。
0678デフォルトの名無しさん
垢版 |
2018/11/24(土) 08:20:40.93ID:01jBobXF
>>659
Ruby で作った。ただし、最終行に改行を追加した

text = <<"EOT"
* aaa
* bbb

* xxx
* yyy

EOT

buf = ""; result = ""

text.each_line do |line| # 1行ずつ処理する
line.chomp! # 末尾の改行を削除する

case
when line.empty? # 空文字列
result += "<ul>" + buf + "</ul>" + "\n" # ul で囲む
buf = ""
when line.start_with?( "* " )
buf += "<li>" + line.slice!( 2..-1 ) + "</li>" # "* " 以後の部分を取り出す
else
raise
end
end

puts result
0679デフォルトの名無しさん
垢版 |
2018/11/24(土) 11:05:11.18ID:1C+vWWG1
2人以上(1ユーザーに対し、1PC以上)のジャンケンゲームを作れ。
・勝ちグループにユーザーが居れば勝ちとする。
・グー=g、チョキ=v、パー=wとする。
・グー、チョキ、パー以外が入力されたら、あいこ扱い。
・全員の手もその都度表示。


Rock, Paper, Scissors! ―じゃんけんぽん(またはあいこでしょ)の英語版
(Rock = g/G, Paper = w/W, Scissors = v/V)
g
[("You",'g'),("PC1",'v'),("PC2",'g')]
You Win!!
0680デフォルトの名無しさん
垢版 |
2018/11/24(土) 12:06:59.71ID:X5g7u0K6
>>679
def janken(hand, opp_number)
  hands = opp_number.times.map{%w[g v w].sample}.unshift(hand)
  p hands.map.with_index{|h, i| [i == 0 ? 'You' : "PC#{i}", h]}
  return 'Draw' if hands.uniq.size != 2
  hands = hands.uniq.join.sum == 0xDE ? %w[w g] : hands.uniq.sort
  ['You Win!', 'You Lose!'][hands.index(hand)]
end

puts janken(?g, 1)
# => [["You", "g"], ["PC1", "v"]]
You Win!

puts janken(?v, 2)
# => [["You", "v"], ["PC1", "v"]]
Draw

puts janken(?w, 3)
# => [["You", "w"], ["PC1", "g"], ["PC2", "v"]]
Draw

puts janken(?g, 4)
# => [["You", "g"], ["PC1", "g"], ["PC2", "g"], ["PC3", "v"], ["PC4", "v"]]
You Win!
0682デフォルトの名無しさん
垢版 |
2018/11/24(土) 12:14:16.56ID:X5g7u0K6
>>680
「・グー、チョキ、パー以外が入力されたら、あいこ扱い」を見落としていたので
return 'Draw' if hands.uniq.size != 2

return 'Draw' if hands.uniq.size != 2 || %w[g, v, w].none?(hand)
に修正

puts janken('グーチョキパー', 5)
# => [["You", "グーチョキパー"], ["PC1", "g"], ["PC2", "w"], ["PC3", "v"], ["PC4", "g"], ["PC5", "
v"]]
Draw
0683デフォルトの名無しさん
垢版 |
2018/11/24(土) 12:16:11.70ID:1C+vWWG1
>>680
あ、あいこはあいこと表示して終わっちゃうのね。。。
あいこの時はまたジャンケンし直しにして欲しい。
条件に入れればよかったかなぁ。。。
0684デフォルトの名無しさん
垢版 |
2018/11/24(土) 12:26:57.03ID:hG+y0dS8
>>679
> ・グー=g、チョキ=v、パー=wとする。

グー=g、チョキ=c、パー=pか
グー=m、チョキ=v、パー=wか
どっちかに統一してほしい。
グー=g、チョキ=v、パー=wだとgが表音イニシャル、v, wが象形と統一性がない。
気になってご飯が喉を通らなくてプログラミングどころじゃない…
0685デフォルトの名無しさん
垢版 |
2018/11/24(土) 13:02:40.59ID:1C+vWWG1
gも象形のつもりだったんだが。。。
0686デフォルトの名無しさん
垢版 |
2018/11/24(土) 14:02:53.32ID:S/Hnk7Kr
>>683 Ruby

def input(message, cond); begin; puts message; end while cond.call; end

def janken
  hand_type = %w[g v w]
  input('Input the number of opponents.', proc{gets.to_i < 1})
  opp_number, hand, hands = $_.to_i
  loop do
    input('Input your hand.', proc{gets; false})
    hand = hand_type.index($_.chomp!)
    hands = opp_number.times.map{rand(3)}.unshift(hand)
    p hands.map.with_index{|h, i| i == 0 ? ['You', $_] : ["PC#{i}", hand_type[h]]}
    hand && hands.uniq.size == 2 ? break : puts('Draw')
  end
  puts %w[You\ Win! You\ Lose.][3 * hand / hands.uniq.sum / 2]
end

janken
# => Input the number of opponents.
1
Input your hand.
choki
[["You", "choki"], ["PC1", "g"]]
Draw
Input your hand.
w
[["You", "w"], ["PC1", "v"]]
You Lose.
0688679
垢版 |
2018/11/24(土) 15:20:34.57ID:1C+vWWG1
>>679
一応、自分自身でも投稿。
予想通り分岐使わないバージョン出て来た。
自分も挑戦してみようかな。

Haskell(リストに勝ち負け確定パターン(含まれてるかでグループパターン割り出し)があるか判別して、先頭要素(必ずユーザー)がパターンと同じか判定)
https://ideone.com/9EmrYI

Cとか死ねたし。(全体の勝ちグループ(各手をカウントしてグループパターン割り出し)の手を確定後、勝ちグループと同じ手に対応した文字を入力していたか判定)
https://ideone.com/AmfTOy

(能力不足の自分はあえてでは無いが)あえて条件分岐バージョンにすると言語や個人の個性出そう。
(CとHaskellでグループ分けや自分が勝ちグループ側かの判定が違うアルゴリズムになった)
その場合、アルゴリズムの説明付きだと面白そう。
0691デフォルトの名無しさん
垢版 |
2018/11/24(土) 17:14:41.52ID:ZWAqZgZk
>>690
あいこの判定を手の種類数だけでしてたせいだな
修正した
https://ideone.com/3XBPBb
0692デフォルトの名無しさん
垢版 |
2018/11/24(土) 22:52:47.96ID:5TC6Hle/
お題
順列を求めるのにシャッフルでデータをたくさん用意して
重複データを取り除くことで求めている人がいた
順列の数の何倍位のデータを用意すればいいか調べる
0695デフォルトの名無しさん
垢版 |
2018/11/24(土) 23:37:47.52ID:Wfpvwubu
>>679 PowerShell
function Janken {
  $hands = @($args[0]) + (1..$args[1] | %{ Get-Random "g","v","w" })
  ("[" + ($hands | % {"{0}`",'$_')" -f $(if ($i++ -eq 0) {"(`"You"} else {",(`"PC" + ($i-1)}) }) + "]")
  $groups = @($hands | Group-Object)
  $win = @{ "g" = "v"; "v" = "w"; "w" = "g" }[$args[0]]
  if ($groups.Count -ne 2 -or $win -eq $null) { return "Draw" }
  if (($groups | ? {$_.Name -eq $win}).Count -gt 0) { return "You Win!!" }
  return "You Lose!!"
}


PowerShell > Janken g 1
[("You",'g') ,("PC1",'v')]
You Win!!

PowerShell > Janken v 2
[("You",'v') ,("PC1",'v') ,("PC2",'g')]
You Lose!!

PowerShell > Janken w 3
[("You",'w') ,("PC1",'v') ,("PC2",'g') ,("PC3",'w')]
Draw

PowerShell > Janken a 1
[("You",'a') ,("PC1",'g')]
Draw
0697デフォルトの名無しさん
垢版 |
2018/11/25(日) 06:18:56.85ID:k7/W79Is
>>679
Kotlin
https://paiza.io/projects/3zt5CUPdhrTFhXx2z7ayvw

入力は1行単位で最初の手が自分、スペース区切りでPCの手になる。
グー、チョキ、パーと元の文字列の対応は以下に対応。

グー: "g", "G", "グー", "ぐー"
チョキ: "v", "V", "c", "C", "チョキ", "ちょき"
パー: "w", "W", "p", "P", "パー", "ぱー"

勝敗の判定は「勝」、「負」、「相子」で出る。
0698679
垢版 |
2018/11/25(日) 07:47:50.59ID:ae+bi37x
>>697
ジャンケンゲームの肝?ってPCはランダムな値を使う所だと思うんですが・・・
あと、私が勝手にアイコといえばジャンケンやり直しって勝手に思い込んでて仕様に盛り込まなかったのがダメなんですが、
アイコと(アイコ扱いの)不正入力はジャンケンやり直しの形でお願いしたいです。

>>695 さんも、アイコと(アイコ扱いの)不正入力はジャンケンやり直しの形でお願いします。
0699デフォルトの名無しさん
垢版 |
2018/11/25(日) 11:54:57.77ID:qcobBjeQ
お題
標準運指(http://taipingu.net/kotu02.html)によるタイピングを考える。
英小文字からなる文字列Sが与えられるので、Sを入力するのにかかる時間を求めなさい。
各文字の入力にかかる時間は以下の通りとする。
・1文字目
 ・ホームポジションから動かない -> 4
 ・ホームポジションから動く -> 5
・2文字目以降
 ・1つ前の文字と反対の手の指 -> 1
 ・1つ前の文字と同じ手の違う指 -> 2
 ・1つ前の文字と同じ手の同じ指 -> 3

(例)
aiueo => 9 (4+1+2+1+1)
odai => 9
pppp => 14
asdfjkl => 15
fjdksla => 10
0700デフォルトの名無しさん
垢版 |
2018/11/25(日) 12:38:51.26ID:YCGD2W4D
>>699 Ruby
h = -> c {'qaz'[c] ? 1 : 'wsx'[c] ? 2 : 'edc'[c] ? 3 : 'rfvtgb'[c] ? 4 : 'yhnujm'[c] ? -4 : 'ik'[c] ? -3 : 'ol'[c] ? -2 : 'p'[c] ? -1 : raise('invalid key')}
f = -> str{(str[/\A[adfghjkls]/] ? 4 : 5) + str.each_char.map{|c| h[c]}.each_cons(2).map{|a, b| a * b < 0 ? 1 : a != b ? 2 : 3}.sum}

%w[aiueo odai pppp asdfjkl fjdksla].each{|s| puts '%s => %d' % [s, f[s]]}
# => aiueo => 9
odai => 9
pppp => 14
asdfjkl => 15
fjdksla => 10
0701デフォルトの名無しさん
垢版 |
2018/11/25(日) 13:38:17.14ID:k7/W79Is
>>698
そういうインタラクティブなやつか。
じゃあまた暇があったら作ろう。
0702デフォルトの名無しさん
垢版 |
2018/11/25(日) 16:23:23.79ID:rkqtyTFb
お題:Brainfuckのインタプリタを実装せよ
仕様 https://ja.wikipedia.org/wiki/Brainfuck

>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.
⇒ Hello World!

++++++++[>++++++++<-]>++.<++++++[>++++++++<-]>.<----[>++++<-]>-.++++++++.+++++.--------.+++++++++++++++.<----[>++++<-]>--.++++++++.
⇒ ?
0703デフォルトの名無しさん
垢版 |
2018/11/25(日) 16:52:01.92ID:1Q36MCdG
>>702 Ruby やっつけ
def parse_bra(code)
  Hash.new.tap{|h|
    while i = (code.index(/\[[^\[\]]*\]/))
      h[i] = i + $&.size - 1; h[h[i]] = i; code = code.sub($&, ' ' * $&.size)
    end
  end
end

def step(stat)
  case stat[:code][stat[:pos]]
  when ?> then stat[:mar] = stat[:mar] == 9999 ? 0 : stat[:mar] + 1
  when ?< then stat[:mar] = stat[:mar] == 0 ? 9999 : stat[:mar] - 1
  when ?+ then stat[:mem][stat[:mar]] = stat[:mem][stat[:mar]] == 255 ? 0 : stat[:mem][stat[:mar]] + 1
  when ?- then stat[:mem][stat[:mar]] = stat[:mem][stat[:mar]] == 0 ? 255 : stat[:mem][stat[:mar]] - 1
  when ?. then putc stat[:mem][stat[:mar]]
  when ?, then stat[:mem][stat[:mar]] = $stdin.getc&.ord.to_i
  when ?[ then stat[:pos] = stat[:bra][stat[:pos]] if stat[:mem][stat[:mar]] == 0
  when ?] then stat[:pos] = stat[:bra][stat[:pos]] if stat[:mem][stat[:mar]] != 0
  end
end

def bf(code)
  stat = {pos: 0, mar: 0, code: code, mem: Array.new(10000, 0), bra: parse_bra(code)}
  (step(stat); stat[:pos] += 1) while stat[:pos] < code.size
end

bf('>+++++++++[<++++++++>-]/ 中略 /++++[<++++>-]<+.[-]++++++++++.')
# => Hello World!

bf('++++++++[>++++++++<-]>+/ 中略 /++++.<----[>++++<-]>--.++++++++.')
# => Brainfuck
0707デフォルトの名無しさん
垢版 |
2018/11/25(日) 23:28:07.03ID:DgoPPid/
>>660 Perl5 普通のloop版
use feature qw{current_sub say};
for (qw{321 910 909 0 11111 123456789}) {
$a = $_;
$s = 1;
@d= ();
do {
$d = int $a / 10*$s;
$m = $a % (10*$s);
unshift @d, $m*$s;
$s *= -1;
$a = ($a - $m)/10;
} while $a;
say "$_ $d => ", @d;
}

>>660 Perl5 無名関数の末尾再帰版
use feature qw{say};
for (qw{321 910 909 0 11111 123456789}) {
$s = 1;
say "$_ $d => ", sub {
$a = shift;
$d = int $a / 10*$s;
$m = $a % (10*$s);
my $ms = $m*$s;
$s *= -1;
$a = ($a - $m)/10;
(($a ? __SUB__->($a) : ()), $ms);
}->($_);
}
0708デフォルトの名無しさん
垢版 |
2018/11/25(日) 23:30:57.42ID:DgoPPid/
>>707
ゴメン、普通のloop版の
say "$_ $d => ", @d;
は不要なdebug writeも出力するので
say "$_ => ", @d;
に訂正

結果はいずれも
$ perl 12_660.pl
321 => 481
910 => 19090
909 => 909
0 => 0
11111 => 29291
123456789 => 284664829
0710697
垢版 |
2018/11/26(月) 02:29:30.61ID:jdmxn8AZ
>>679>>698
HTML + JavaScript
https://codepen.io/anon/pen/OaERvj
即実行できた方がいいかなと思ってブラウザで動く JavaScript にしてみた。
PC側は10台まで台数入力する。
表示は「グー」、「チョキ」、「パー」になっている。
判定は方法ほ Kotlin のやつとほとんど同じ。

但し勝敗や相子に関係なく再挑戦ボタンが出る。
0712711
垢版 |
2018/11/28(水) 23:15:07.63ID:he8qnrZH
>>702 c
https://ideone.com/Plh1vx
・mandelbrotが4.24s
・セル配列をコンパクト化
・一部のforとswitchをgotoで置き換え
・データポインタの範囲チェックは廃止
・']'のとき無条件に'['へ戻ってたのを廃止
0713デフォルトの名無しさん
垢版 |
2018/11/28(水) 23:53:16.47ID:fj/EN88U
これで。以前からやろうとしてできてない。AI簡単そうだが。


3x3盤タイルゲーム for Windows ver2.00 14/7/5 更新
対戦するたびに学習して次第に強くなる「最善手探索+対戦学習型知能ゲーム」 <入門版>


4x4盤タイルゲーム for Windows ver2.00 14/7/5 更新
対戦するたびに学習して次第に強くなる「最善手探索+対戦学習型知能ゲーム」 <本格版>

http://www2u.biglobe.ne.jp/~shunbook/omocha/index.htm
0714デフォルトの名無しさん
垢版 |
2018/11/29(木) 11:20:14.11ID:jwCbT4Qs
盤の状態は4×4のやつで3^16=43046721通りだから後退解析で全状態の最善手が簡単に解ける
0717711
垢版 |
2018/11/29(木) 23:18:59.74ID:dyCCyrAH
>>702 c
https://ideone.com/ddpLYQ
・ mandelbrotが4.24s→3.42s
・いくつかの単純なループを自前の命令に置き換え

>>715-716
まさかこれ使う日が来るとはね( ^ω^)
0720デフォルトの名無しさん
垢版 |
2018/11/30(金) 19:56:50.93ID:vThfWoZE
お題: C言語のコメント/*〜*/, //〜 を除去するプログラムを実装せよ
0721711
垢版 |
2018/11/30(金) 22:52:06.95ID:j+r1UJtS
>>702
https://ideone.com/d0oDj0
・ mandelbrotが4.24s→3.42s→3.24s
・ループの置き換えを若干増やす
・初期8命令を6命令へ、なんとなく整理
0722デフォルトの名無しさん
垢版 |
2018/11/30(金) 22:53:31.37ID:cIO0a97u
>>720
命令すんなカス
0723デフォルトの名無しさん
垢版 |
2018/11/30(金) 23:05:45.19ID:iwzbC/nf
>>721
ここまで最適化するとはすごいな
今VCに移植してやってみてる
VCはラベルのアドレスは取れないのでcase文内で処理してる
でも文字がダラダラと表示されるのが嫌なので、putchar()の所を
一度バッファに溜めておいて最後にputs()で一気に出力するようにした
0724 ◆QZaw55cn4c
垢版 |
2018/11/30(金) 23:09:14.20ID:MkfLpznc
>>720
やったことがある気がしたのですが、もうすっかり忘れてしまいました…
0726デフォルトの名無しさん
垢版 |
2018/11/30(金) 23:16:05.51ID:TjeK6E2T
お題: 入力にこのスレのhtmlが与えられるので数字だけ,区切りで出力しなさい。

出力例
2018,11,30,...
0728デフォルトの名無しさん
垢版 |
2018/12/01(土) 00:17:45.63ID:XKE5KJf3
>>722
誰もお前になんか言ってねーよ
自意識過剰なんじゃボケカス
0729デフォルトの名無しさん
垢版 |
2018/12/01(土) 01:26:07.16ID:3EVAE812
>>720
Perl
https://paiza.io/projects/Q_MF7JmVJMMjF1aqffgfaw

Perl だと簡単だ。

但し /* /* */ */ みたいな二重のやつには対応していない。最初の /* から次に出た */ を削除して */ が残る。
(この辺は本物のCプリプロセッサでも同じかな?)
0733デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:00:24.20ID:3EVAE812
>>731
あー。文字列リテラルについては何も考えてなかった。
明日考えよう。

>>732
やはりそうでしたか。わざわざどうも。
0734デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:09:09.09ID:3EVAE812
>>731
今閃いたので修正した。(URLは同じ)
0735デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:22:24.06ID:Zs5zJNI/
>>720 Ruby
src = $<.read
i = 0
loop do
  break if i >= src.size
  case src[i]
  when ?" then i += src[i..-1][/(?:".*[^\\]|")(?:\\\\)*"/].size
  when ?' then i += src[i..-1][/(?:'.*[^\\]|')(?:\\\\)*'/].size
  when ?/ then src.sub!(/(?<=.{#{i}})(?:\/\/[^\n]*|\/\*.*?\*\/)/m, ''); i += 1
  else i += 1
  end
end

-*- input -*-
hoge(); // fuga
hoge('"'); // fuga ");
hoge("// \"fuga\"\\");
hoge("/* fuga */"); /* fuga
fuga /* "fuga" // */; hoge

-*- output -*-
hoge();
hoge('"');
hoge("// "fuga"\\");
hoge("/* fuga */"); ; hoge
0736デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:24:23.46ID:3EVAE812
>>720
Cでも作った。
https://paiza.io/projects/2RgQrlBLrzJe9MQp9weQmQ

これは1文字づつ読んでモード切り替えて出力したりしなかったりする方式。
文字列リテラルにも対応。
0741デフォルトの名無しさん
垢版 |
2018/12/01(土) 05:34:42.40ID:qLkjgui5
>>735 訂正
src = $<.read
i = 0
loop do
  break if i >= src.size
  case src[i]
  when ?" then i += src[i..-1][/\A"(?:.*?[^\\])?(?:\\\\)*"/].size; next
  when ?' then i += src[i..-1][/\A'(?:.*?[^\\])?(?:\\\\)*'/].size; next
  when ?/ then src.sub!(/(?<=\A.{#{i}})(?:\/\/[^\n]*|\/\*.*?\*\/)/m, '')
  end
  i += 1
end
puts src

-*- input -*-
hoge(); // fuga
hoge('"'); // fuga ");
hoge("// \"fuga\"\\", /* fuga */ *"fuga");
hoge("/* fuga */"); /* fuga
fuga /* "fuga" // */; hoge

-*- output -*-
hoge();
hoge('"');
hoge("// \"fuga\"\\", *"fuga");
hoge("/* fuga */"); ; hoge
0742デフォルトの名無しさん
垢版 |
2018/12/01(土) 07:52:53.53ID:U3mK8vlP
>>728
誰も俺に言われてると思ってねーよ
自意識過剰なんじゃボケカス
0743デフォルトの名無しさん
垢版 |
2018/12/01(土) 11:03:33.46ID:XKE5KJf3
>>742
生きづらそう
0745デフォルトの名無しさん
垢版 |
2018/12/01(土) 11:16:56.49ID:50ygxsN0
>>744
ゴメン再帰マッチは(?R)や(?1)だた
時間あればnest対応版書いてみたいけど
多分ないや…

こういうのは再帰降下パーサParse::RecDescentやPerl6のRule使うと楽に書ける
0746デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:39:50.92ID:U3mK8vlP
>>743
おまえやわw
いちいち素っ頓狂なレスすんなカスw
0747デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:41:56.31ID:1eGLRG7/
いつもの単芝君やないか
この板に粘着して荒らしまわってる奴やで
意思疎通は不可能なのでNGするなりスルーするなりしてくれ
0748デフォルトの名無しさん
垢版 |
2018/12/01(土) 15:19:58.00ID:3EVAE812
>>729の改造終了(URLは同じ)
長い呪文になってしまった。

>>744>>745
なるほど。その内暇な時にでも考えよう。
0749デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:02:07.43ID:3EVAE812
>>736も改造終了(URLは同じ)。
0751デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:37:04.95ID:XO3Kyvz4
>>750 はインタプリタでないので無視してください
0753711
垢版 |
2018/12/02(日) 16:02:26.97ID:aFBnTuDv
>>702 c
https://ideone.com/6sLfPH
・ mandelbrotが4.24s→3.42s→3.24s→2.13s
・G: while (*dp) dp += ip->d; ip++; goto TOP; を追加

>>723
caseで分岐するほうが移植性あっていいよね( ^ω^)
0755デフォルトの名無しさん
垢版 |
2018/12/03(月) 22:04:03.50ID:cV13JBu4
[お題]
整数A,B(1<=A<B<=50万)と P(1<=P<=10)が順に与えられる。
A以上B以下の10進数の整数から異なる2つの整数を選ぶ。
その2つの整数を表現するのに使われている(各桁の)数字の種類が
ちょうどP種類である選び方は何通りできるか。

※ 先頭ゼロ詰禁止、実行時間一問1.5秒以内(ideone等で)

1) 8 11 2 --> 4
2) 10 1000 5 --> 207480
3) 44 44444 4 --> 33808313
4) 56785 113452 1 --> ?
5) 102345 480713 6 --> ?
6) 1 500000 7 --> 47440713600

 例題1) の補足 "8 11 2" のとき
  {8,9,10,11}から2整数を選ぶ。NCR(4,2)=6通りあるなかから
  (8,9)(8,11)(9,11)(10,11) の4通りが答え。[]内を使用数字とすると、
  例として、(8,11)は[8,1]の2種類, (10,11)は[1,0]の2種類からなる。
  対象外は (8,10)は[8,1,0] (9,10)は[9,1,0]で ともに2種類ではない。

 ※解き方をパックて単純化した問題。
0758デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:11:47.75ID:vhrUEqnQ
>>720 正規表現だけで書いてみた

regexp = /((?:([^"']*?)(?:\/\/[^\n]*|\/\*.*?\*\/))*)(("|').*?(?<!\\)(?:\\\\)*\4)?/m

puts <<~EOT.gsub(regexp, '\2\3')
  hoge(); // fuga
  hoge('"'); // fuga ");
  hoge("// \\"fuga\\"\\\\", /* fuga */ *"fuga");
  hoge("/* fuga */"); /* fuga
  fuga /* "fuga" // */; hoge
EOT
# =>
hoge();
hoge('"');
hoge("// \"fuga\"\\", *"fuga");
hoge("/* fuga */"); ; hoge
0759デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:34:55.49ID:fo8RIf+e
>>758 無駄な括弧があったので修正

regexp = /([^"']*?)(?:\/\/[^\n]*|\/\*.*?\*\/)?(("|').*?(?<!\\)(?:\\\\)*\3)?/m

puts src.gsub(regexp, '\1\2')
0761デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:20:50.80ID:tkE9zz4k
お題: テキストが入力されるのでそれがお題であれば1,お題でなければ0を出力せよ
0762デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:37:59.07ID:HMynH27O
>>761

#!/bin/sh

if grep お題 >/dev/null 2>&1
then
 echo 1
else
 echo 0
fi
0763デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:43:36.31ID:evmq38l5
お題

C/C++言語のソースをHTMLに変換

・色分け(外部スタイルシートで色分け以外にも
サイズや種類など色々と細かく指定可能)表示
・コメント・クォート・マクロ定義部分・マクロ等に対応
・ローカル変数・グローバル変数・static関数・非static関数
ライブラリ変数/関数/マクロ(ヘッダ記載)・
ローカル型・グローバル型名の区別

入力:コマンドラインからファイル名(.c/.cpp)
出力:出力htm(l)ファイルとそれが参照するスタイルシート(.css)を
新規作成
0764デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:47:43.27ID:evmq38l5
あと、コードブロックや式の括弧のネストレベルに応じて
背景色を変えてほしい(要望)
コマンドラインからタブ=4,8とか指定できるようにもして欲しい
0766デフォルトの名無しさん
垢版 |
2018/12/04(火) 18:05:08.94ID:HMynH27O
1. 好きなIDEのエディタで画面に表示。
2. PrtSc キーを押す。
3. ペイントを起動してペースト。
4. PNGファイルとして保存。
5. メモ帳を起動。
6. HTML を書き、imgで先の画像を表示するようにする。
7. 拡張子をhtmlにして保存。
8. ブラウザで表示。
9. 終了。
0767デフォルトの名無しさん
垢版 |
2018/12/04(火) 18:14:10.74ID:evmq38l5
型に応じて変数の色分け(スタイル変更)に対応できたら最高
忘れてたけど予約語の色分けは当然
ソースコードの構文エラー箇所以降は単色赤文字で表示
0770デフォルトの名無しさん
垢版 |
2018/12/05(水) 19:36:38.80ID:W3jESzak
お題:ビュフォンの針をシミュレートして円周率の近似値を求めよ
0771デフォルトの名無しさん
垢版 |
2018/12/05(水) 20:02:35.88ID:W3jESzak
自分でやってみた
Python3
https://ideone.com/A2FnPP
1000万本投げた場合
3.14219665312
0774 ◆QZaw55cn4c
垢版 |
2018/12/05(水) 23:30:56.16ID:qUBA/FDJ
>>772
そんなツッコミは初めてみました、うまいですね…
0775デフォルトの名無しさん
垢版 |
2018/12/05(水) 23:42:52.79ID:W3jESzak
>>772
書いてて思ったけどめんどくさくなってそれ以上考えなかった
0776デフォルトの名無しさん
垢版 |
2018/12/06(木) 01:36:29.15ID:Yn5Hc93r
>>770 Squeak/Pharo Smalltalk

| length N rand needle nCrossed |
length := 10000.
N := 1e7.
rand := Random new.
needle := LineMorph from: length / -2 @ 0 to: length / 2 @ 0 color: Color black width: 1.
nCrossed := 0.
N timesRepeat: [
| crossed |
needle rotationDegrees: 90 * rand next; center: 0 @ (length * rand next).
crossed := length negated @ 0 to: length @ 0 intersects: needle firstVertex to: needle lastVertex.
crossed ifTrue: [nCrossed := nCrossed + 1]
].
N / nCrossed asFloat "=> 3.142226273599298 "
0778デフォルトの名無しさん
垢版 |
2018/12/06(木) 02:09:23.51ID:7UXgAx11
>>771 Ruby
# length = 2; gap = 2
buffon_s = -> n {n.fdiv((1..n).count{rand < sin(rand(1e10))})}
p buffon_s[10**6]
# => 3.1421245789553063
0779755
垢版 |
2018/12/06(木) 20:58:20.17ID:fqSvUjwD
>>755
需要はほぼなかったみたいだが、出題者コメントを

 答えだすのに必要なものだけに前処理で集計。今回必要なのは
 0-9数字使用の有無だけなので2^10に集約・集計できる( 50万→1024)
 この数になればあとは、二重ループで集計をすればいい。
 後半は集約にビットを使えば、popcountを使って簡潔に書けるパターン。

 想定解(python by pypy) https://ideone.com/bujm1x

 回答者さんとほぼ同じ。
 あえて相違点は、pythonのpopcount相当が意外と重かったので、
 前処理でテーブル化している。(高速に出れば、いらないはず?)


 ※制約の50万と1.5秒は、素の(標準だけの)pythonに合わせている。
  (このコードも素のpythonだと、例題6)だけで0.8秒くらい)
0782デフォルトの名無しさん
垢版 |
2018/12/07(金) 22:19:34.17ID:x8xNXHP3
お題
1,3,4,6,7,9,10,12,…
のように1から始まり奇数, 奇数,偶数,偶数,
奇数,奇数,偶数,偶数…と続く場合2019番目はいくつになるか
0791デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:20:01.90ID:vpfNpx82
プログラミング初心者なんですがJavaを覚えるのに良い課題下さい
言語の本は一冊読みました
0792デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:29:35.75ID:5PBkTMHJ
Winならtypeコマンド(LinuxとかUnix系だとcat)と同じ機能を自作してみるとか、行番号も表示するようにするとかから始めては?
0793デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:53:44.58ID:Mku3deOK
>>782
f=:+/@$&1 2

f 2019
3028
0794デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:59:51.42ID:Mku3deOK
>>793
言語はJ
0796デフォルトの名無しさん
垢版 |
2018/12/08(土) 15:30:02.59ID:dsjig1JQ
お題:N×Nの盤面に石を置いていく。
どの4つの石も同一円周上に乗らないようにする場合、最大何個配置できるか?
ただし、一直線上に並ぶ配置は半径∞の円周上と考える。

N=3 => 5
N=4 => 7
5 => 9
6 => 11
9 => 18
0797デフォルトの名無しさん
垢版 |
2018/12/08(土) 17:29:13.00ID:xmV4OmOO
>>796
問題の意味がわからない。図とか描いてくれ。
0800デフォルトの名無しさん
垢版 |
2018/12/08(土) 19:05:02.19ID:xmV4OmOO
共円でググってようやっとわかった。
0803デフォルトの名無しさん
垢版 |
2018/12/12(水) 02:35:41.59ID:84v7sPOJ
お題
2次元平面上で点(x,y)が点列(X1,Y1), (X2,Y2), ..., (Xn,Yn), (X1,Y1)を順に結んでできる多角形の内部にあるかどうか判定せよ
0804デフォルトの名無しさん
垢版 |
2018/12/12(水) 07:13:05.92ID:SVnAXs6w
どのような多角形をなすかの
仮定で方法も違ってくるだろうけど、
一般的な場合を視野に入れる限り
複数の数学ライブラリを組み合わせて
扱うソリューションパッケージ的なものに
なりそうでお題としてはなんだかなって感じ
0805デフォルトの名無しさん
垢版 |
2018/12/12(水) 08:10:30.84ID:3f3X1OW4
>>803
多角形の定義がひどい。
重なる事はあるのか、と、重なったときに内部はどうするのかとか。(抜けるのはめんどくさい)
重なってはいけないけど辺は突き抜けても良いのかとか。
描いた絵みたいな状態を許すかどうかでけっこう判定が変わる。
0806デフォルトの名無しさん
垢版 |
2018/12/12(水) 08:27:43.91ID:3f3X1OW4
多角形を三角形に分割して、
(x1,y1)→(x2,y2)のベクトルと
(x2,y2)→(x3,y3)のベクトルと
(x3,y3)→(x1,y1)のベクトルを
それぞれ、
(x2,y2)→(x,y)
(x3,y3)→(x,y)
(x1,y1)→(x,y)
と外積をとって、正負が一致したらその点は多角形内部にある。
重ならないなら三角形に分割、は、
1,2,3、2,3,4、3,4,5…と使う頂点をスライドさせていくだけで良いんじゃないかな?どっかで裏返るかな。
0809デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:12:59.34ID:3f3X1OW4
数学になるの?
俺CAD関連と3DCG関連でこういうの書くけどな。
コード書こうと思って出題者に問うたつもりだけど。。
証明出来てないコード書いても無意味なんだから先にロジック書いたつもり。

ってかどうして数学?っぼい問題が嫌われるの?
脳筋コードが良いってこと?
0810デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:17:02.00ID:rSdIoMBA
>>803 Ruby 与えられるのは凸多角形のみとし、頂点は反時計・時計回りのいずれかで与えられるものとする

def diff(a, b); a.zip(b).map{|i, j| i - j}; end
def in_triangle?(p, a, b, c)
  ap, ab, ac = [p, b, c].map{|v| diff(v, a)}
  det = ab[0] * ac[1] - ab[1] * ac[0]
  s = (ac[1] * ap[0] - ac[0] * ap[1]) / det
  t = -(ab[1] * ap[0] - ab[0] * ap[1]) / det
  [s, t].all?{|e| (0..1).include?(e)} && s + t <= 1
end
def in_con_polygon?(p, *vers)
  vers[1..-1].each_cons(2).any?{|v1, v2| in_triangle?(p, vers[0], v1, v2)}
end

# 原点を左下の頂点とする長さ1の正方形の内部に(0.5, 0.5)は含まれるか
p in_con_polygon?([0.5, 0.5], [0, 0], [1, 0], [1, 1], [0, 1])
# => true
p in_con_polygon?([1.76, 1.75], [0, 0], [3, 0], [2, 1.5], [1, 2.5], [0, 3])
# => false
0811デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:40:32.38ID:rSdIoMBA
問題を勘違いしてたので一部修正
凸多角形でなくてもOK 順番も結ぶ順でOK
ただし>>805の星型の内部は多角形には含まれないとする

def in_con_polygon?(p, *vers)
  vers[1..-1].each_cons(2).count{|v1, v2| in_triangle?(p, vers[0], v1, v2)}.odd?
end
0814デフォルトの名無しさん
垢版 |
2018/12/12(水) 12:14:30.79ID:ygJIxGmd
>>809
このスレには解答者側に数学ができない人がいて、そういう人が文句を言ってる
かく言う俺も数学できないが文句は言わない
0815デフォルトの名無しさん
垢版 |
2018/12/12(水) 14:03:01.24ID:FdJbiO2G
数学の問題集から拾ってきただけみたいな雑な出題が叩かれてるんじゃなかったのか
問題文自体に不備があってそこを詰めるのが主になってしまうパターンもあるけど
0816デフォルトの名無しさん
垢版 |
2018/12/12(水) 14:49:36.03ID:GETLERsG
純粋に数学だけで解けて解法の式を作ったら、あとはコードにベタ書きしてただ解を出力するだけ、という問題だったら、わざわざプログラム板でやる面白味はないなあと思う。
数学的に解いても、その後コードに起こす際にプログラミング固有の工夫とか言語による違いが見られるような物だと興味深い。
個人的な感想です。
0817デフォルトの名無しさん
垢版 |
2018/12/12(水) 15:01:41.06ID:LIx8RHBs
集合論的なのをリスト使うのと配列使うのだったら違いもあるだろうけど、
そういう問題出ないね。

A∪B := {x | x ∈ A ∨ x ∈ B}

はHaskellだと仮にx が{1,2,3,4,5,6,7,8,9,10}の要素で、Aが{3,4,5,6}、Bが{5,6,7,8}なら

setX = [1..10]
setA = [3..6]
setB = [5..8]

[x | x <- setX, x `elem` setA || x `elem` setB]
(Haskellは変数名の初めに大文字使えない)

これがCで配列縛りだとreallocでも使いながらなんじゃろか。。。
0818 ◆QZaw55cn4c
垢版 |
2018/12/12(水) 20:48:43.83ID:5ElL+qNp
>>816
>純粋に数学だけで解けて解法の式を作ったら、あとはコードにベタ書きしてただ解を出力するだけ、
それは甘い、大甘だと私の経験は私の心に語ってくれています
0819 ◆QZaw55cn4c
垢版 |
2018/12/12(水) 20:49:58.51ID:5ElL+qNp
>>817
そういう問題はある種の順序関係を仮定してインプリメントしたいところです
0821デフォルトの名無しさん
垢版 |
2018/12/13(木) 00:26:45.67ID:ilwXN+sT
>>817 Squeak/Pharo Smalltalk

| X A B |

X := 1 to: 10.
A := 3 to: 6.
B := 5 to: 8.

X intersection: (A union: B) "=> #(3 4 5 6 7 8) "
0826デフォルトの名無しさん
垢版 |
2018/12/15(土) 20:46:54.11ID:Du8iBFv1
>>824 Common Lisp
https://ideone.com/QQzEQh

read-lineの第三引数にnil以外を使ったの初めてだ
0830デフォルトの名無しさん
垢版 |
2018/12/16(日) 13:54:15.20ID:ob8ozoeg
[お題] 来年と素数
今年も残りわずか、来年は2019年で平成31年。

1)"2019"の省略形の"19"について。
 素数の和で19を作る、すべての素数配列を列挙せよ(できれば辞書順で)。
 同じ素数を何個使ってもよいが、同じ素数同士は区別しない。
 ・例えば対象が"11"だと以下の6つ
 {2, 2, 2, 2, 3}
 {2, 2, 2, 5}
 {2, 2, 7}
 {2, 3, 3, 3}
 {3, 3, 5}
 {11}


 以下 2)3)4)は種類計のみ答える(明細は多いので略)。
2)来年の初まりは平成31年で、"31"について。
 素数の和で31を作る、その種類はいくつか。条件は1)と同様。

3)素数の和で2019を作る、その種類はいくつか。条件は1)と同様。

4)2019と31を続けた数 201931(=2019*100+31)について。
 素数の和で201931を作る、その種類はいくつか。
 但し、使用していい素数は31以下の素数かつ、
 同じ素数は最大2019個までしか使えない。同じ素数は区別しない。

 ※ 3)4)は64bit整数を超えるので、下10桁だけの回答も可。
0831 ◆QZaw55cn4c
垢版 |
2018/12/16(日) 14:12:11.90ID:IjCemHtZ
>>830
年忘れ課題の時期になったんですね…
0833830
垢版 |
2018/12/16(日) 19:54:33.15ID:GrZg6kve
>>832

2)の31からして自分のと違う。
自分のでは111だった。

javaのやついじって、112個の明細を出してみたら、[2,2,27] があった。
27は素数じゃないよね。いじり方が悪い?
0835デフォルトの名無しさん
垢版 |
2018/12/16(日) 20:37:34.86ID:VvrWecHB
>>830 Ruby 1)は省略

require 'prime'

def fuge(n, cand = Prime.to_a(n), h = {}, succ = 0)
c0 = cand[0]
return h[[n, c0]] if h[[n, c0]]
return 0 if n == 0 || !c0 || n < c0
return 1 if n == c0
x = succ == 2019 ? 0 : fuge(n - c0, cand, h, succ + 1)
h[[n, c0]] = fuge(n, cand[1..-1], h) + x
end

p fuge(19) # => 23
p fuge(31) # => 111
p fuge(2019) # => 576202207044176168646563
p fuge(201931, Prime.to_a(31)) # => 4021686887140718864271667825968903
0837830
垢版 |
2018/12/17(月) 20:45:38.05ID:4p2KDXiR
>>832 836
 当方の回答と一致しました。

>>835
4) 201931 だけ異なる(自分のがあっているとは限らないが……)。
※再帰の動きがよくわからない
0838830
垢版 |
2018/12/20(木) 20:26:37.78ID:W0v1JICZ
>>830 python https://ideone.com/OFR7bn

 間が空いたので、出題者コメント

 1)問題文説明用に書いてみて、問題にもできると思った。

 2)3)は"オイラー 31 DP"でググってください。
 違いはコインの額面が素数に変わったくらいと、おおきさ。
 なかには一つ一つ数えて、本問の2)しか溶けない回答があるので見分けて。

 4)については、ソース上三種類書いて考察しています。
  ("201931"という変な数値は、3重ループ解を落とすのが目的だった)
0839デフォルトの名無しさん
垢版 |
2018/12/21(金) 08:20:43.27ID:hMEdBbLv
お題:
真理値表から2入力NANDで最小ゲート数回路を作れ。実用上最も重要な問題群
0842 ◆QZaw55cn4c
垢版 |
2018/12/22(土) 16:28:53.58ID:vmp1HvU+
>>841
昔カルノー図がかける範囲(3入力?4入力くらいだったかな?)で簡約化ツールを作ったことがあります
当時は書き捨て上等、でやっていたのですが、今は困ってしまっています、当時のプログラム記述能力は当時は今後もずっと保存されるものと当時は考えていたのですが、それは完全な誤りでした…
0843デフォルトの名無しさん
垢版 |
2018/12/23(日) 16:48:28.85ID:V9Fp8lZV
>>841
俺全然わかってない人なんだけど、
そのURLの一番下の、入力部分のNOTゲートを無視しない場合、
9個のNANDゲートで構成できるって書いてあるけど、
NOTゲートの部分を2個減らして7個で作るとかはあかんのん?
0844デフォルトの名無しさん
垢版 |
2018/12/23(日) 16:56:13.54ID:jMuRFGAa
半導体製造のコストがある
NANDゲートは作り易い、というか造りが簡素で単純
NOTゲートも作り易い

なので厳密には製造コストも考えないといけない
0848デフォルトの名無しさん
垢版 |
2018/12/23(日) 23:39:28.74ID:DR7zt9Cz
>>847
うむ

最終形は
Z=~ABC+A~C+~B~C
ですね

2入力NAND回路は
Step 9, Solution 1

0 : -1, -1: 0, 0, 0, 0, 1, 1, 1, 1

1 : -1, -1: 0, 0, 1, 1, 0, 0, 1, 1

2 : -1, -1: 0, 1, 0, 1, 0, 1, 0, 1

3 : 0, 0: 1, 1, 1, 1, 0, 0, 0, 0

4 : 3, 1: 1, 1, 0, 0, 1, 1, 1, 1

5 : 4, 2: 1, 0, 1, 1, 1, 0, 1, 0

6 : 5, 2: 1, 1, 1, 0, 1, 1, 1, 1

7 : 5, 4: 0, 1, 1, 1, 0, 1, 0, 1

8 : 7, 6: 1, 0, 0, 1, 1, 0, 1, 0

ともう一つでした。
0852デフォルトの名無しさん
垢版 |
2018/12/26(水) 16:33:56.35ID:GYS6kcBm
>>848
wxMaximaでお絵描きした。
/* [wxMaxima: input start ] */
load (graphs)$
gg() := draw_graph(
net,
show_weight=true,
vertex_size=3,
show_id=true,
show_vertices=[0,1,2,8],
show_vertex_type=filled_square,
head_length=0.2,
head_angle=5,
edge_color="dark-green",
text_color=blue
);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
Solution[1]:[[[ 0, 3],2],[[ 3, 4],1],[[ 1, 4],1],
[[ 4, 5],1],[[ 2, 5],1],[[ 5, 6],1],[[ 2, 6],1],
[[ 5, 7],1],[[ 4, 7],1],[[ 7, 8],1],[[ 6, 8],1]]$
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
aa:1$ for g:aa thru 1 do (
net : create_graph(9,Solution[g],directed=true),
print("Solution",aa,Solution[g]),aa:aa+1,
gg());
/* [wxMaxima: input end ] */
0853デフォルトの名無しさん
垢版 |
2019/01/06(日) 20:37:20.68ID:uX30aAuK
エモい歌うまバーチャルユーチューバー
https://script.google.com/macros/s/AKfycbxuAt1ejx43_zMRfK7Xplwgwn7cXDQAdZTJkDdLrVCLo8SIdhI/exec

今、見られている話題のVtuberを知りたいなら、ハルカス式Vtuberランキングを見ましょう
【ハルカス式Vtuberランキング】※毎週・毎月自動更新
https://script.google.com/macros/s/AKfycbzZO93mJcZ5M_dPmIZOzuVQNr4mcGwQQdiT7GiLld_1Uews7uE/exec

年末年始の一週間12/27〜01/02までのハルカス式Vtuberランキング
https://docs.google.com/spreadsheets/d/1jdVQ2r5yTrAykMRF1nuX6_5DXpK0167D4JcVCQZTJdM/edit#gid=157464142

年末の一ヶ月12/1〜12/31までのハルカス式Vtuberランキング
https://docs.google.com/spreadsheets/d/1Yc6HD_h4lfurme9b3T0ZXBf2-iBpFSmMGg-1bdgSe0E/edit#gid=1971024984

第4回バーチャルYouTuber人気投票募集中(全304名、2018年11月23日〜)

あなたの好きなVtuberは?5問(配信内容、トーク、歌うま、ゲーム実況、キャラデザ)
https://script.google.com/macros/s/AKfycbwSwNBm8qYD4_kZN2uJLeqRIP8Mwpbo3YDTUEpaSMU02BDAR3jh/exec

・Googleフォームは標準仕様では不正投票が可能な為、改造して対策を行いました。
・2018/11/23時点でチャンネル登録数10,000人以上のuserlocalに登録されたVtuberを対象としています。
・一つのチャンネルでVtuberが複数人いる場合は、それぞれ分けています。
・このフォームに投票するにはグーグルアカウントでログインする必要はありません。
・並び順は前回の得票数の高い順と新人は登録者数の多い順に並んでいます。
・今回も1,000人の方が投票するまで継続します。

なお投票結果はスプレッドシートにリアルタイムで表示されるようにしました。
また【概要】と【詳細】でシートを分けております。
https://docs.google.com/spreadsheets/d/1udB81Vnia9CoIgPaan3a5XFeaCfcnBXkRoPTuxvRpAc/

grげrげ
0854デフォルトの名無しさん
垢版 |
2019/01/18(金) 22:48:43.15ID:sD1souQd
あげ
0855デフォルトの名無しさん
垢版 |
2019/01/19(土) 05:22:33.88ID:M8Q3zGyy
過疎ってるので別スレのこれをお題にする。
なお、クラスではなく関数でもサブルーチンでも良い。

https://mevius.5ch.net/test/read.cgi/tech/1544839627/332

332 デフォルトの名無しさん (ワッチョイ f11f-t+p0) sage 2019/01/18(金) 22:57:58.37 ID:1ZiD/8V00
文字列から数字をtmpWとtmpHに抜き出すクラスを作りたいのですがどうしたらいいですか?
演算子記号は+−もある、数字の桁数は不明で小数点もあり、数字が入るときは小文字一字始まり、引数はw or hで抜き出す戻り値を示す。


対象文字
@w900×HH
AWW×h1000
BWW×HH
Cw900/h100
結果 引数がwなら左  hなら右
@tmpW=900 tmpH=WW
AtmpW=WW tmpH=1000
BtmpW=WW tmpH=WW
CtmpW=900 tmpH=1000
0857デフォルトの名無しさん
垢版 |
2019/01/19(土) 09:54:02.71ID:9IabhBF0
>>855 Ruby
f = -> str {str.scan(/([A-Z]{2}|[a-z])((?:\d+\.)?\d+)?/).each_with_object({}){|(m, num), h| h["tmp#{m[0].upcase}"] = !num ? ' ' : num.match?(/\./) ? num.to_f : num.to_i}}

%w[
  w900×HH WW×h1000 WW×HH w900/h100 w3.14/h2.72
].each{|e| h = f[e]; puts "#{e} -> " + h.map{|v| '%s = %p' % v}.join(', ')}
# =>
w900×HH -> tmpW = 900, tmpH = " "
WW×h1000 -> tmpW = " ", tmpH = 1000
WW×HH -> tmpW = " ", tmpH = " "
w900/h100 -> tmpW = 900, tmpH = 100
w3.14/h2.72 -> tmpW = 3.14, tmpH = 2.72
0859デフォルトの名無しさん
垢版 |
2019/01/19(土) 15:20:58.20ID:M8Q3zGyy
>>856
お題をやるかどうかは自由だし使う言語も自由なのでここは宿題向きスレではない。それに宿題用のスレは別にある。
0860デフォルトの名無しさん
垢版 |
2019/01/20(日) 17:00:10.01ID:XepLmY3z
お題
チェス盤をかく

□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
0862デフォルトの名無しさん
垢版 |
2019/01/20(日) 18:45:01.40ID:vla32kuj
console.log(`
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
`);
0863デフォルトの名無しさん
垢版 |
2019/01/20(日) 19:21:05.18ID:QLQt0ffh
>>860
85kg 170cmの俺がJavascriptで回答。
[85, 170]
.map(d => [...d.toString(2).padStart(8,0)]
.map(b => +b ? '□' : '■')
.join`` + '\n')
.join``
.repeat(4)
0864デフォルトの名無しさん
垢版 |
2019/01/20(日) 19:39:43.28ID:CUY2SNg1
>>860 Ruby

puts 72.times.map{|i| i % 9 / 8 * 10 + 15 / (i % 9 + 8) * (i & 1 ^ 9633)}.pack('U*')
# =>
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
0866デフォルトの名無しさん
垢版 |
2019/01/20(日) 19:58:44.02ID:vla32kuj
>>865
ヒマ人どもの公開オナニーに騙されるな。
ベンチ取ってみれば分かるけど
>>863より>>862のほうが処理速度も速く、CPU、メモリ消費も勝ってる。
0869デフォルトの名無しさん
垢版 |
2019/01/21(月) 00:16:11.01ID:evkqklOK
前々からつくろうとしていまだ決定版ができてないのがある。
コマンド fileA fileBで、重複行を除いて連結と、
A-Bで重複行を除くやつ。入力が数百Mだときつい。
0870デフォルトの名無しさん
垢版 |
2019/01/21(月) 00:20:48.31ID:q5TMCwho
きついのは口臭だけにしとけよ
0871デフォルトの名無しさん
垢版 |
2019/01/21(月) 04:33:49.89ID:ZCrWhalc
>>869
Linux とかでよく使われるシェル(bash とか)ならこんな感じだろうな。

( uniq fileA ; uniq fileB ) > fileC

シェルスクリプトにするならこんな内容のファイルを作ってそれの実行パーミッション立てておくだけ。

#!/bin/sh
uniq $1
uniq $2

ようするに uniq コマンド使ってるだけ。

Windows でも似たようなものはあるかも知れないが WSL 入れて Ubuntu とか動かしちゃった方が何も考えずに Linux 風にできるので楽かも知れない。
/mnt/c/ にCドライブマウントされてるからファイルのやり取りを考える必要もない。
改行が LF なのとデフォルトのエンコーディングが UTF-8 なのは考慮する必要があるが。
0872デフォルトの名無しさん
垢版 |
2019/01/21(月) 07:09:30.84ID:evkqklOK
そんな機能あったっけ、と確認したみたけど意図する動作しない、連続しない重複も対象



Linuxコマンド集 【 uniq 】 ソート済みのファイルから重複した行を削除する
ファイルで重複している行を削除する。ただし,ファイルはソートしてある必要がある
https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230918/


連続していない離れた重複行も削除したければ、sortコマンドコマンドで予めソートする必要がある。その代わり順番は保存されない。
https://hydrocul.github.io/wiki/commands/uniq.html
0874デフォルトの名無しさん
垢版 |
2019/01/21(月) 08:19:59.40ID:evkqklOK
2つあって。
一つは連結した単一ファイルで、後方にある重複行を取り除く。
もう一つはBに存在する行を取り除いたAの重複行を取り除く。
それぞれuniq拡張(A+B) 、uniq拡張(A-B)のような。
0875デフォルトの名無しさん
垢版 |
2019/01/21(月) 09:47:36.96ID:evkqklOK
スクリプトやめてC++でやってみたら
ロードと書き込みの速度とほぼ同程度でできるようだ。
0876デフォルトの名無しさん
垢版 |
2019/01/21(月) 11:56:42.83ID:ub5sAEWO
>>860 J
}:("1) 8 9 $ '_#'

_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_
0878デフォルトの名無しさん
垢版 |
2019/01/21(月) 13:14:23.06ID:ub5sAEWO
使えるんだけど私の方が勉強不足で。
0880デフォルトの名無しさん
垢版 |
2019/01/21(月) 14:14:22.79ID:P73TaUU+
>>874
A-Bの部分は
grep -x -v -f B A
でできるけど順序を保存したuniqはコマンドだけではできないのかな
0881デフォルトの名無しさん
垢版 |
2019/01/21(月) 18:14:39.49ID:chW+Guj1
そういうコマンドを別途作るか、全部作っちゃうかかな。
0882デフォルトの名無しさん
垢版 |
2019/01/21(月) 21:03:38.83ID:mEBdwP2z
Ruby なら、ハッシュで重複行を排除できる。
ARGF は、a.txt b.txt (ARGV)を連結した、仮想ファイル

ruby script.rb a.txt b.txt

以下は、script.rb の内容

hash = { }

ARGF.each_line { |line| hash[ line ] = true } # true には、特に意味がない

puts hash.keys

-- a.txt

a

b

-- b.txt
x

a


-- 出力

a
b
x
0883デフォルトの名無しさん
垢版 |
2019/01/21(月) 21:49:42.62ID:QH90tNLy
速度出るのできた。CRCと文字列長のハッシュしかみてなく重複らしいのはduplicate.txtへ。


標準出力
deldup.exe fileA fileB ・・・ はマージして重複削除
deldup.exe /D fileA fileB ・・・ はA -B -・・・の重複削除
https://ideone.com/ABJNAy
0886デフォルトの名無しさん
垢版 |
2019/01/22(火) 02:53:38.24ID:t1xtxA/a
>>874
後方にある重複業削除なら awk で連想配列(要するにハッシュ)使ってこんな風にすればできるな。

awk '{if(!n[$0]){n[$0]=1;print}}' fileA fileB

ただし全行をメモリ上に置くことになるのでファイルがでかいとまともに動かない環境があるかも。

超大きいファイルの場合は行ごとに MD5 や SHA1 等のハッシュ値計算してそれだけ保管しておいて比較した方が良いかもね。
0887デフォルトの名無しさん
垢版 |
2019/01/22(火) 10:22:28.48ID:f5q/almD
>>860 Lua
for i=1,72 do
if i%9==0 then
print("")
else
io.write(({"■","□"})[i%2+1])
end
end
0890デフォルトの名無しさん
垢版 |
2019/01/22(火) 12:48:37.38ID:J1mDHp9Y
>>888
順序変えなくないんだって。
0891デフォルトの名無しさん
垢版 |
2019/01/22(火) 18:32:37.01ID:f5q/almD
>>860 Ruby

puts (["□■"*4,"■□"*4]*4)
0894デフォルトの名無しさん
垢版 |
2019/01/24(木) 21:04:14.42ID:HE3o+0uB
>>860 Lua
print (((("_#"):rep(36)):gsub("(........).","%1\n")))
0895デフォルトの名無しさん
垢版 |
2019/01/24(木) 22:20:43.56ID:HLNzgCZV
>>860 javascript
Array(72).fill().map((v, i)=>i%9?'■□'[i%2]:'\n').join``

>>889はボード横幅が7になってる間違いでしたごめんなさい。
0896デフォルトの名無しさん
垢版 |
2019/01/25(金) 20:09:30.47ID:s1700d1K
お題
n個からr個選ぶ組み合わせの個数を求める
0897デフォルトの名無しさん
垢版 |
2019/01/25(金) 22:06:56.43ID:7NAKvkXa
数学の問題が叩かれるのはここのアホどもには難しいからなんだ!
決してスレ違いだからじゃないんだ!
だから高校1年の教科書の定義引き写すだけの簡単な問題なら叩かれないんだ!
0898デフォルトの名無しさん
垢版 |
2019/01/25(金) 22:30:26.19ID:oIz/D2lY
教科書捨てたから定義ググりました。
const p = (n, r) => (n < 2 || r < 1) ? 1 : n * p(n - 1, r - 1);
const c = (n, r) => p(n, r) / p(r);
c(1200, 100);
//=> 1.2734481790871909e+148

chromeでBigInt実装されてるのでせっかくだからと思ってpを
const p = (n, r) => (n < 2n || r < 1n) ? 1n : n * p(n - 1n, r - 1n);
に改良しようとしたらエラーでる…
なんでか分かる方いたら教えてください。
0899デフォルトの名無しさん
垢版 |
2019/01/26(土) 03:39:53.55ID:mo79YSSI
>>896 Ruby

c = -> (n, k, m = []) {
  m[n] = [1] unless m[n]
  k = n - k if n < k * 2
  return m[n][k] if m[n][k]
  m[n][k] = c[n - 1, k - 1, m] + c[n - 1, k, m]
}

p c[5, 2] # => 10
p c[100, 50] # => 100891344545564193334812497256

>>898
undefined - 1n でエラーが起きているので
const c = (n, r) => p(n, r) / p(r, r);
0900デフォルトの名無しさん
垢版 |
2019/01/26(土) 03:52:04.18ID:NFcmjJe3
>>896
効率はともかく、関数プログラミングって本でこれ見た時は感動したな。(言語は数学とSMLを合わせた仮想言語だったが)

Haskell

c n 0 = 1
c n m |n == m = 1
c n m = c (n - 1) m + c (n - 1) (m - 1)

実行結果
5 `c` 3
>10
0901デフォルトの名無しさん
垢版 |
2019/01/26(土) 04:12:24.35ID:NFcmjJe3
高校の教科書版

Haskell

c' n r = product [1..n] `div` (product [1..(n - r)] * product [1..r])

解説
n C r
= n P r / r!
= n! / ((n - r) ! * r!) (n P r = n ! / (n - r)!に分解)
0903デフォルトの名無しさん
垢版 |
2019/01/26(土) 05:11:41.67ID:iYrqGgfh
>>896 C++
inline uint64_t gcd(uint64_t a, uint64_t b) {
uint64_t r;
while ((r = a % b) != 0) {
a = b; b = r;
}
return b;
}

uint64_t binomial(uint64_t n, uint64_t m) {
if (n < m)
return 0;
m = (m > n / 2) ? n - m : m;
uint64_t result = 1;
for (uint64_t i = 1; i <= m; i++, n--) {
uint64_t d = gcd(result, i);
result /= d;
result *= n / (i / d);
}
return result;
}
0904デフォルトの名無しさん
垢版 |
2019/01/26(土) 10:34:54.19ID:ls0y1m5K
>>896 Lua
function cc(n,r)
local a = 1
for i = 1, r do
a=a*(n-i+1)/i
end
return a
end
print(cc(20,10))

184756.0
0907デフォルトの名無しさん
垢版 |
2019/01/26(土) 13:54:20.56ID:+oP10x+/
>>905
適当に連立方程式とくだけじゃなかったです?
数学出来ないんですけど。
0908デフォルトの名無しさん
垢版 |
2019/01/26(土) 14:10:31.09ID:t2YAFdPa
人狼AI と 人狼ゲーム
0909デフォルトの名無しさん
垢版 |
2019/01/26(土) 14:39:24.25ID:YRte2Dpq
>>860 Perl5
print ((qw{□■}x4, "\n", qw{■□}x4, "\n")x4);

実行結果
$ perl 12_860.pl
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
0910デフォルトの名無しさん
垢版 |
2019/01/26(土) 15:04:32.49ID:vn81VQ6e
>>860
Pharo Smalltalk
String cr join: ((1 to: 4) collect: [:i | {'□■' repeat: 4 . '■□' repeat: 4} ]) flattened
実行結果

□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
□■□■□■□■
■□■□■□■□
0912デフォルトの名無しさん
垢版 |
2019/01/26(土) 18:50:28.91ID:OZN9QunV
>>860
rfo-basic

For i=1 To 44
m$=m$+Chr$((9622+Mod(i,2))*(Mod(i,9)<>0)+10)
Next
Print m$

End

プロは奇をてらわない。
bai 砂坊主
0915デフォルトの名無しさん
垢版 |
2019/01/27(日) 00:46:03.01ID:EZ97VlcS
>>860
@Mathematica

セルオートマトン(ルール32)を使って、、

CellularAutomaton[32, {0, 1, 0, 1, 0, 1, 0, 1}, 8] //
 ArrayPlot[#, Mesh -> True] &
0917デフォルトの名無しさん
垢版 |
2019/01/27(日) 04:52:31.63ID:rwuNPA7J
>>860 C
for (int r = 0; r < 8; r++) {
  for (int c = 0; c < 8; c++) {
    printf((r + c) % 2 ? "■" : "□");
  }
  printf("\n");
}
0918デフォルトの名無しさん
垢版 |
2019/01/27(日) 06:36:29.52ID:rwuNPA7J
>>905 C
double abac = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);
double abad = (bx - ax) * (dy - ay) - (by - ay) * (dx - ax);
double cdca = (dx - cx) * (ay - cy) - (dy - cy) * (ax - cx);
double cdcb = (dx - cx) * (by - cy) - (dy - cy) * (bx - cx);
return (abac * abad < 0 && cdca * cdcb < 0);
0920デフォルトの名無しさん
垢版 |
2019/01/27(日) 06:46:02.03ID:z0hosMYm
>>911 javascript(es2018 regexネームドグループのため)
const atxMatcher = line => line.trim().match(/^(?<directive>\S*)[ \t]+(?<contents>.*)/)
const atxRules = [{
name: 'HnTag',
regex: /^#{1,6}/,
process: (hnDirective, hnContents) => {
const hnEl = document.createElement('h'+ hnDirective.length)
hnEl.textContent = hnContents
return hnEl.outerHTML
}
}]
const makeHtml = line => {
const atxMatch = atxMatcher(line)
if (!atxMatch) return line
const {directive, contents} = atxMatch.groups
let tag
for (const rule of atxRules) {
const directiveMatch = directive.match(rule.regex)
if (directiveMatch) {
tag = rule.process(directiveMatch[0], contents)
break
}
}
return tag ? tag : line
}
`# aaa
##\tbbb
###### \t ccc
################ ddd
`.trim().split`\n`.map(makeHtml).join``
結果:
<h1>aaa</h1><h2>bbb</h2><h6>ccc</h6><h6>ddd</h6>
0922デフォルトの名無しさん
垢版 |
2019/01/27(日) 11:17:31.03ID:/cT7Kgd3
>>918
> return (abac * abad < 0 && cdca * cdcb < 0);
return (abac * abad <= 0 && cdca * cdcb <= 0);
端点も含まんとあかんのとちゃう?
0925デフォルトの名無しさん
垢版 |
2019/01/27(日) 13:15:46.24ID:4tSdie01
お題
半径が整数の3つの円ある。
どの円も他の2つの円に外接している。
3つの円の中心点を結んでできる
三角形がピタゴラスの三角形に
なる場合の3つの円の半径を
100未満についてすべて求める。
例えば3つの円の半径が1,2,3の時
辺の長さが3,4,5のピタゴラスの
三角形ができる。
0930デフォルトの名無しさん
垢版 |
2019/01/27(日) 17:44:27.67ID:rwuNPA7J
>>922
=の追加で要件をクリアしたと思ってましたが、対象が線分から直線に変わってました
端点については、以下のコードの呼び出しが4つ必要になります

int abap = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
if (abap == 0 &&
    (p.x >= min(a.x, b.x) && p.x <= max(a.x, b.x)) &&
    (p.y >= min(a.y, b.y) && p.y <= max(a.y, b.y))) {
  return 1;
}
return 0;
0931デフォルトの名無しさん
垢版 |
2019/01/27(日) 18:36:00.36ID:rE8NR22a
>>925 Ruby 2.5.0

def kotae(max)
  (1..max).each_with_object([]) do |ra, ary|
    x, y = max - ra, 2 * ra**2
    1.step(Integer.sqrt(x), 2) do |n|
      next if x * n**2 < y
      rx = ra + n**2
      m, r = (ra + rx).divmod(n)
      ry = ra * m / n
      next if m.even? || r != 0 || m.gcd(n) != 1
      pcpy = [ra, rx, ry].sort
      ary.push(*(1..max / pcpy[2]).map{|i| pcpy.map{|e| e * i}})
    end
  end
end

pys = kotae(100 - 1)
p pys.size # => 82
p pys # => [[1, 2, 3],
 [2, 3, 10],
 [2, 4, 6],
 # 中略 #
 [33, 66, 99],
 [35, 84, 85],
 [36, 84, 90]]
0933デフォルトの名無しさん
垢版 |
2019/01/27(日) 21:02:27.16ID:u288xi28
>>905
python3
ax+by=c (d<x<e)
px+qy=r (s<x<t)
とする

import numpy as np
co = np.array([[a,b],[p,q]])
in = np.array([c,r])
ans = np.linalg.solve(co,in)
print(d<ans[0]<e and s<ans[0]<t)

本当は直線が平行なときも調べないといけないが略
0934デフォルトの名無しさん
垢版 |
2019/01/28(月) 02:42:20.01ID:Ht+H3Zdt
こちらで検証したパターンです
line ab = {{0, 0}, {100, 0}};
line cd1 = {{0, 0}, {100, 0}};    // 重なりあり
line cd2 = {{1, 0}, {100, 0}};    // 重なりあり
line cd3 = {{0, 0}, {99, 0}};    // 重なりあり
line cd4 = {{-1, 0}, {100, 0}};    // 重なりあり
line cd5 = {{0, 0}, {101, 0}};    // 重なりあり
line cd6 = {{-1, 0}, {99, 0}};    // 重なりあり
line cd7 = {{1, 0}, {101, 0}};    // 重なりあり
line cd8 = {{-100, 0}, {0, 0}};    // 重なりあり
line cd9 = {{100, 0}, {200, 0}};    // 重なりあり
line cd10 = {{-100, 0}, {-1, 0}};    // 重なりなし
line cd11 = {{101, 0}, {200, 0}};    // 重なりなし
line cd12 = {{0, -100}, {0, -1}};    // 重なりなし
line cd13 = {{0, -100}, {0, 0}};    // 重なりあり
line cd14 = {{0, -100}, {0, 1}};    // 重なりあり
0935デフォルトの名無しさん
垢版 |
2019/01/28(月) 19:06:17.59ID:ZiBPaW1B
>>905
2直線を
(x,y)=(x1,y1)+t(x2*x1,y2*y1)
(x,y)=(x3,y3)+s(x4*x3,y4*y3)
としたときt、sが0以上1以下の条件で解を持つことであろう。
0936デフォルトの名無しさん
垢版 |
2019/01/28(月) 20:30:57.09ID:BBM43iQf
>>896
>>901の改良版。
product [(n - (r - 1))..n]はそのままn P rにもなる。

p n r = product [(n - (r - 1))..n]

Haskell

c'' n r = product [(n - (r - 1))..n] `div` product [1..r]

Python

def fact(n):
a = 1
i = 1
while i <= n:
a *= i
i += 1
return a

def p(n,r):
a = 1
i = n - (r - 1)
while i <= n:
a *= i
i += 1
return a

def c(n,r):
return (p(n,r) // fact(r))
0938デフォルトの名無しさん
垢版 |
2019/01/30(水) 16:19:17.11ID:gOIe9eSU
>>937
そのゲームがどんなものだったのか詳細が書いてある所はある?
昔々 Apple ][ でテキストのやつを人がやってる所は見たことあるのだが細かいルールがどんなんだったか忘れた。
確かワープして移動してってクリンゴンが撃ってくるとかクリンゴンに向けて撃つだとかそんなのを繰り返すんだよな?
0939デフォルトの名無しさん
垢版 |
2019/01/30(水) 19:13:41.13ID:32wJF+eS
>>860
RFOーBASIC

TEXT.INPUT S$,"","チェス番を入力してください。"
PRINT S$
END
0941デフォルトの名無しさん
垢版 |
2019/01/31(木) 17:40:00.64ID:uIyAv6WO
>>860 Lua
print("░")
横から見た
0942デフォルトの名無しさん
垢版 |
2019/01/31(木) 17:57:03.10ID:6YZEfuaO
>>936 python の場合、これじゃいかんのか? まだ全くpythonを知らん人間だが。

scipy.special.comb(n, k, exact = False)

python はライブラリを使ってなんぼでしょ。 生の言語で比較するのは時代遅れ。 なんで膨大な処理が必要なAI でpython が主流になったか。
0943デフォルトの名無しさん
垢版 |
2019/01/31(木) 18:21:11.67ID:JEItRzDd
ライブラリを紹介するスレじゃないんだが。
mathjs
math.combinations(7, 5)

こういうの延々と続けるの?
バカじゃないのwww
0944デフォルトの名無しさん
垢版 |
2019/01/31(木) 18:41:17.06ID:6YZEfuaO
>>943 別に構わんだろ。 そもそも言語なんてやりたいことを解決するのに便利かどうかだけの話なんだから。

そういう意味では、普通のことをやるにはどの言語でも大差はない。

FORTRAN なんて大昔の言語だがいまだに科学技術計算で使われ続けてきているのは、言語仕様ではなく高速なライブラリが整ってるからに他ならない。

なんでAI や科学技術計算にスクリプト言語のpython がもてはやされてるのかもう一度考えてみる必要があるのでは?
0945デフォルトの名無しさん
垢版 |
2019/01/31(木) 18:50:20.38ID:6YZEfuaO
いくら言語が優れていても、ある特定の環境だけでしか実用性がない言語と言うのは、別環境用のライブラリが整っていないからに他ならない。

例えばSwift これは、Mac環境下ではObjective-C の全てが使えるが、
言語的にはWindows などでコンパイルできても、ライブラリがないから実用として使うにはまだ程遠い。
API が整っていることが重要。

python がもてはやされてるのは、ライブラリが整ってるからだろ。 言語の良さがどうかなんてあまり関係ない。
ま、個人的な好き嫌いが出てくるのは仕方ないが、実用性があるかどうかはまた別の問題。
0946デフォルトの名無しさん
垢版 |
2019/01/31(木) 18:58:10.77ID:6YZEfuaO
そもそも、言語なんてアセンブラの時代からマクロで自分好みの文をかけるようになってたんだから、今更何を議論してるのかという気もする。

標準化された文法というのは評価はするが、それはどっちかと言うと頭でっかちな学者が考えること。
現場はいかにバグが少なく早く問題を解決できるかにかかってる。 つまり総合環境だろ。
0948デフォルトの名無しさん
垢版 |
2019/01/31(木) 19:46:27.30ID:REgWEVPY
うむ。これからの時代はファミリーBASICだな。
0949デフォルトの名無しさん
垢版 |
2019/01/31(木) 19:59:18.32ID:6YZEfuaO
>>948 最初の頃のBASICは、10数個位しか命令は無かった。
ま、電卓がわりみたいなものでは有るが、基本的なプログラミング言語としては成り立ってた。
0950デフォルトの名無しさん
垢版 |
2019/01/31(木) 20:11:31.45ID:4JULsXj7
>>942
たまたま、ライブラリで解決出来る問題だからってマウント取られてもね。。。
それに、C/C++みたいに多倍長整数サポートしてない言語と、サポートしてる言語でのアルゴリズムの違いや、
式変形して引き算を足し算に変えられる所は変えた方が速度出るとか、色々勉強にはなってるよ。
>>936の例じゃ(n - (r - 1))を(n - r + 1)にした方が速い。
(Haskellでは速いだけでなく、2の補数表現を(元の数値と別に)生成してるらしく、メモリ効率も上がる)
0951デフォルトの名無しさん
垢版 |
2019/01/31(木) 21:19:24.42ID:Te48fFDx
>(n - (r - 1))を(n - r + 1)にした方が速い。

>>950 あのさ、そんなのはコンパイラの最適化次第だろ。 勿論ど素人のプログラマじゃ無ければそれなりの工夫はするはずだが、そんな事は些細な事。 くだらんことを言うな。 むしろそんなコンパイラがクソ。 言語なんてのは言語道断。
0952デフォルトの名無しさん
垢版 |
2019/01/31(木) 22:25:01.31ID:xJsSt9Re
Python では、機械学習などの周辺ライブラリ一式が揃っているから、使われる

Ruby では、ベクトル演算のNArray があって、
処理速度はOctave にも匹敵するけど、一式揃っていない

北大の湊教授が作った、ZDD はあるけど
0953デフォルトの名無しさん
垢版 |
2019/01/31(木) 22:46:32.84ID:2IY59Hh/
scipy/scipy/special/cephes at master ・ scipy/scipy
ttps://github.com/scipy/scipy/tree/master/scipy/special/cephes

この辺り見てみるとフォートランとCがそのまま使われてる

scipy/_comb.pyx at master ・ scipy/scipy
ttps://github.com/scipy/scipy/blob/master/scipy/special/_comb.pyx

このあたりをそのまま書ければいい
0954デフォルトの名無しさん
垢版 |
2019/02/01(金) 04:58:43.05ID:IMBPiIxm
お題
平方数かどうか判定する
0955デフォルトの名無しさん
垢版 |
2019/02/01(金) 10:08:25.26ID:VdCPb4pG
C++

#include <iostream>
#include <limits>

template <typename T>
bool is_safely_multiplicable(T a, T b) {
if (b == 0) return true;
return a <= (std::numeric_limits<T>::max() / b);
}

uint64_t sqrt_int(uint64_t x) {
if (x == 0) return 0;
uint64_t a = 1, b = x, c;
while (b - a > 1) {
c = (b - a) / 2 + a;
if (is_safely_multiplicable(c, c) && x >= c * c) a = c;
else b = c;
}
return a;
}

bool is_square_number(uint64_t x) {
uint64_t rt_x = sqrt_int(x);
return rt_x * rt_x == x;
}
0956デフォルトの名無しさん
垢版 |
2019/02/01(金) 18:32:58.66ID:iYm26gLc
>>954
Haskell

isSqr a = isSqr' a [n * n | n <- [0..a]]
where
isSqr' x (l:_) |(x == l) = True
isSqr' x (l:_) |(x < l) = False
isSqr' x (_:ls) = isSqr' x ls
0957デフォルトの名無しさん
垢版 |
2019/02/01(金) 20:32:42.61ID:iYm26gLc
Python

def isSqr(x):
n = 0
a = 0
while x <= a:
if x == a:
return True
n += 1
a = n * n
return False

リスト内包表記だとすぐ落ちた。。。
Haskellより持たない。。。
0958デフォルトの名無しさん
垢版 |
2019/02/01(金) 21:10:55.66ID:qFuZrTt3
これはいかに巨大数を高速判定するかだろ
0961デフォルトの名無しさん
垢版 |
2019/02/01(金) 23:10:20.49ID:iYm26gLc
>>958
m = ?
n = m * m

m=10の時nの1/10で、m=100だとnの1/100

探すべきmが高速で小さくなって行く。
大きな数になる程、0<=mなループの始まり求めるの無理ゲー。。。
0962デフォルトの名無しさん
垢版 |
2019/02/01(金) 23:12:44.04ID:VdCPb4pG
ttps://ideone.com/xr1vcE

Newton-Raphson法ほど速くはないがせめてO(log(N))くらいで実装せにゃお題として出てくる意味がなかろう
0963デフォルトの名無しさん
垢版 |
2019/02/02(土) 00:09:40.70ID:/6KX0oFw
>>954 Lua
function isSquare(n)
local a = 0
local i = 1
while a < n do
a = a + i
i = i + 2
end
return a == n
end
print(isSquare(100000))
print(isSquare(10000))
0964デフォルトの名無しさん
垢版 |
2019/02/02(土) 03:47:32.54ID:i2SNxKFt
いっそsqrt 関数実装。
頭悪いんで数学的じゃない。
256以上入れるとフリーズするけど、その範囲なら精度抜群。
精度を1つ落とすと(range(15)の値を1つ減らすと)2桁くらい大きな数を入れてもフリーズしなくなる。

def sqrt(x):
i = 1
if x == 0:
return 0
while x >= (i * i):
if x / i == i:
return i
i += 1
i -= 1
a = 0.1
for j in range(15):
while x >= (i * i):
i += a
i -= a
a *= 0.1
return (i - a)
0965デフォルトの名無しさん
垢版 |
2019/02/02(土) 09:51:18.58ID:/6KX0oFw
>>954 J
f =: = *: @ <. @ %:
0966デフォルトの名無しさん
垢版 |
2019/02/02(土) 13:18:27.64ID:CwD+xRo8
平方数かどうかを高速に判定する方法 - hnwの日記
https://hnw.hatenablog.com/entry/20140503


GNU MPのmpz_perfect_square_p関数の実装
GNU MPのソースコードを確認してみたところ、次のような処理だとわかります。

引数nのmod 256を計算し、平方数ではない数を判定する
平方数のmod 256は44種類の値しか出現しないので、入力の82.8%は平方数でないと判定できる
同様に入力nのmod 9, 5, 7, 13, 17(64-bitシステムではmod 97も)を計算し、平方数ではない数を判定する
これにより入力の99.25%(64-bitシステムでは99.62%)について平方数でないと判定できる
最後に、平方根を計算して平方数かどうか確認する

平方数ではない数の多くを事前にふるい落とし、判定できなかった数だけ真面目に平方根を求める、という方針だとわかります。

もちろん、GNU MPの場合のmod pの選び方は多倍長整数演算ならではだと言えます。
mod 256はサイズNにかかわらずO(1)で計算できるので、最初に行うことで全体の高速化に貢献できます。

また、2ステップ目の計算も2^24-1 = 9 * 5 * 7 * 13 * 17 * ...であることを利用し、多倍長整数であっても比較的高速に計算できるような実装になっています。
10進整数でmod 9を求める場合に全部の桁を足し合わせてからmod 9しても同じ結果になるのと同様、
下位から24bit区切りの数を足し合わせてからmod 2^24-1を計算することで、元の数のmod 2^24-1が計算できるのです。
0970デフォルトの名無しさん
垢版 |
2019/02/02(土) 17:31:46.69ID:rEiZ26fd
本質的に高度な数学的知識が要求され
る問題は板違いかと

言語によっては、問題にジャストフィット
するライブラリが標準で添付されているとか
ライブラリ管理コミュニティを通じて
容易に入手できるとかあるかもしれないが
その場合は紹介程度に。

言語処理系の言語処理の為の機能提供
である場合を除いて多くは本質的に多言
語に対応しており〜言語用のライブラリと
いう表現は兎も角〜言語のライブラリと表
現すると曖昧で誤解を招きやすい表現
として嫌われる場合もありえることに注意。
(別言語で記述される場合もある)
0972デフォルトの名無しさん
垢版 |
2019/02/02(土) 17:57:26.00ID:rEiZ26fd
セルフホスティング対応な言語でライブラリを
自前で構成しているもので、他言語に移植されて
いない独自の機能を持つものもあるかもしれない
し、もっと極端に言えば独自性の高いライブラリに
最適化された言語を自前で作ってそれで記述され
ているものもあるかもしれないけど一般的には入手
は容易ではないかも
0974デフォルトの名無しさん
垢版 |
2019/02/02(土) 23:25:24.42ID:g8xy/J6N
辺に沿って動くとき、AからBまでの最短経路はいくつあるか
         ┏┳┳┳┓B
         ┣╋╋╋┫
      ┏┳╋╋╋╋┫
┏┳┳┳╋╋╋╋╋┻┛
┣╋╋╋╋╋╋╋┫
┣╋╋╋╋╋╋╋┫
┣╋╋╋╋╋╋╋┛
┗┻┻┻┻┻┻┛
A
0976デフォルトの名無しさん
垢版 |
2019/02/03(日) 00:55:19.58ID:UTpNqxd4
中学受験の算数の問題に経路を数える問題があるよな
つまり小学生でも手計算で解ける
0977デフォルトの名無しさん
垢版 |
2019/02/03(日) 00:57:22.00ID:72eosYJ+
>>970 アホちゃうの?
プログラムというのは、問題解決のための言語であって、問題が解決できなければどんなに美しい言語でも存在価値はない。
最速で美しく問題解決にたどり着ける言語が一番。 言語そのものの美しさなんて二の次。

英語でも日本語でも何でも良い。 利用できるものは何でも利用すれば良い。 好き嫌い言ってる奴はアホ。
どんなに綺麗な国の言葉でも高等教育が自国語でできない国がほとんど、それは利用できる教材が自国語で書いたものがないから。
日本語だったら英語を知らなくてもノーベル賞が取れるだけの教材(ライブラリ)が揃ってる。
0978デフォルトの名無しさん
垢版 |
2019/02/03(日) 01:53:34.29ID:wxxHWwaf
別に高度な数学が必要になることは構わないけど、数学だけで話が閉じちゃうような問題はつまらないとは思う。数学的に解を求める解法自体が主題で、コーディングはただその解法を(日本語、英語などの自然言語と同様に)とあるプログラミング言語で記述しただけのような。
もちろん数学に価値がないといっているのではなく、話のウェイトとしてプログラムである部分がほぼないのなら、その話、ここじゃなくてもいいじゃんと思うよ。
0979デフォルトの名無しさん
垢版 |
2019/02/03(日) 04:02:35.76ID:JyP+XfGy
つまらない問題だと思ったら無視すればいいだけじゃないかな
その問題に対して回答する人がいるなら、回答者(と出題者)にとっては
つまらない問題ではないってことなんだろうし
0980デフォルトの名無しさん
垢版 |
2019/02/03(日) 04:46:34.72ID:1lu6X4vo
>>977
OS記述の言語は言語じゃないのか?
コンパイラなどの言語処理系記述の言語
も言語じゃないってわけだな
問題解決手段の一つではあるかもしれないが
通信系ソフトウェアの存在はどう説明?

既存の資産を維持しより効率的に活用する研究が
新しいプログラミング言語が次々と生成されてくる原
動力じゃないかと
0981デフォルトの名無しさん
垢版 |
2019/02/03(日) 05:08:39.33ID:l3Qt7IvN
>>977
>日本語だったら英語を知らなくてもノーベル賞が取れるだけの教材(ライブラリ)が揃ってる。

ダウト。ノーベル賞を受賞した研究者はみんな英語で論文書いている。
あと、今の日本語での教育教材の蓄積があるのは、大雑把に言って、
ここ10年でノーベル賞受賞した面々の世代の研究者や技術者が書いた。
もちろん彼らは英語の文献を読み、勉強し、日本語の文献を書いた。
だから、英語の文献なんて要らないみたいな話はアホ。
ソファでポテチ食いながら「ジャガイモなんて買えばいいんだから、育ててる奴はアホ」と言ってるようなもの。
0982981
垢版 |
2019/02/03(日) 05:15:20.75ID:l3Qt7IvN
プログラミング言語も一緒。
Cは泥臭い実用言語で、その前にはAlgolなど「綺麗な」言語が下敷きとしてあった。
Cは現在でも多くの問題を解決するための道具として活用されているが、
現在では使われていないAlgolなどの「綺麗な」言語なしにCは生まれなかった。
0983デフォルトの名無しさん
垢版 |
2019/02/03(日) 05:39:02.55ID:1lu6X4vo
個々の言語の歴史観の講釈はスレ違い

確かに問題解決の道具であることが
中心かもしれないが、扱ってきた問
題の種類によって文法やライブラリ・
その取り扱い方に差異が生じている
が、同じ問題を別言語で「解く」と
優劣の違いがわかって面白いかもし
れない。
が、あんまし長くやってると不毛な
言語比較論、文化比較論になったり
して色々ヤバいからそろそろ一旦
お開きにしたら?
続きはそれぞれの言語別スレッドで
ということで
0984デフォルトの名無しさん
垢版 |
2019/02/03(日) 07:04:30.87ID:LaZtKDWq
お題:プログラムの実行時刻が午前なら「おはようございます、ご主人様!」、午後なら「お疲れ様です、ご主人様!」と表示させる
0985デフォルトの名無しさん
垢版 |
2019/02/03(日) 07:48:34.73ID:AEg+fU/i
>>984 C
time_t now = time(NULL);
struct tm *p = localtime(&now);
if (p->tm_hour * 60 + p->tm_min < 12 * 60) {
  printf("おはようございます、ご主人様!\n");
} else if (p->tm_hour * 60 + p->tm_min > 12 * 60) {
  printf("お疲れ様です、ご主人様!\n");
}
0986デフォルトの名無しさん
垢版 |
2019/02/03(日) 08:56:17.85ID:l3Qt7IvN
>>984
Pharo Smalltalk

Smalltalk ui inform: (Time now meridianAbbreviation = 'AM' ifTrue: [ 'おはようございます、ご主人様!' ] ifFalse: [ 'お疲れ様です、ご主人様!' ])
0987デフォルトの名無しさん
垢版 |
2019/02/03(日) 09:19:47.58ID:72eosYJ+
python

from datetime import datetime
if datetime.now().hour < 12:
print('おはようございますご主人様')
else:
print('お疲れ様です、ご主人様')
0988デフォルトの名無しさん
垢版 |
2019/02/03(日) 09:23:27.86ID:1lu6X4vo
午前12時=00:00
午後12時=12:00
23:59の後は00:00

午前12時=12:00
午後12時=24:00
24:00の後は00:01
0990デフォルトの名無しさん
垢版 |
2019/02/03(日) 09:58:12.21ID:I0qputsI
>>964 のHaskell版。
負の数の場合の処理、負の数含め、絶対値が256以上だった場合エラー吐く様に処理を追加。
※Haskellは整数と少数を明確に分ける為、渡す数に小数点が無いとエラーになる。

mysqrt x = mysqrt' x 0
where
mysqrt' x m |x < 0 = - mysqrt (abs x)
mysqrt' x m |x == m * m = m
mysqrt' x m |x < m * m = fsqrt x (m - 1) 0.1 15
mysqrt' x m = mysqrt' x (m + 1)

fsqrt _ a _ 0 = a
fsqrt v _ _ _ | v > 256 = error "\"fsqr\":out of range 0..256"
fsqrt v a f n | v <= a * a = fsqrt v (a - f) (f * 0.1) (n - 1)
fsqrt v a f n = fsqrt v (a + f) f n

使用例

main = print (mysqrt x) >> print (mysqrt x * mysqrt x)

結果

1.41421356237309
2.0
0991デフォルトの名無しさん
垢版 |
2019/02/03(日) 10:00:13.11ID:I0qputsI
fsqrt v _ _ _ | v > 256 = error "\"fsqr\":out of range 0..256"
fsqrt v a f n | v <= a * a = fsqrt v (a - f) (f * 0.1) (n - 1)
fsqrt v a f n = fsqrt v (a + f) f n
0993 ◆QZaw55cn4c
垢版 |
2019/02/03(日) 10:31:38.09ID:t4xt++Qj
>>977
>日本語だったら英語を知らなくてもノーベル賞が取れるだけの教材(ライブラリ)が揃ってる。
最近はそうでもないようですよ…ペーパーは英語だし、教科書=テキストレベルでも英語でしか発刊されない状況といいます
haskell をやろうとして圏論の教科書を探しましたが、欧米の本の和訳ばかりで日本人が書いた圏論の教科書はありませんでした
0995デフォルトの名無しさん
垢版 |
2019/02/03(日) 11:07:15.54ID:72eosYJ+
お題1: 現在地の緯度、経度を出せ
緯度:、、、、
経度:、、、、
お題2: 東京都新宿区西新宿2丁目8-1 の緯度、経度を出せ
緯度:、、、
経度:、、、
お題3: お題2で求めた緯度経度から住所を出せ
郵便番号:、、、
住所:東京都、、、、
0999デフォルトの名無しさん
垢版 |
2019/02/03(日) 17:37:50.59ID:oUppVF8S
>>964
今までの苦労は一体。。。

数学的な平方根の近似値は√x = x ^ (1/2)だった。。。

Haskell だとこんだけ。

mysqrt x = x ** 0.5
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 128日 7時間 29分 24秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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