X



プログラミングのお題スレ Part13
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/02/03(日) 11:21:53.20ID:72eosYJ+
プログラミングのお題スレです。

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

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

※前スレ
https://mevius.2ch.net/test/read.cgi/tech/1538096947/
0257デフォルトの名無しさん
垢版 |
2019/02/20(水) 00:55:56.83ID:SyQ4jkRO
>>255 Perl5
$R = 0.0;
@s = map{($_) x (9-$_)} 1..8; #say "@s";
$t = @s; #say $t;
for (qw{11 13 17 23 31 37 41 43 47 53 61 67 71 73 83}) {
 @o = split'';
 my %h;
 $h{$_}++ for @s;
 my $r = $h{$o[0]}-- / $t;
 $r *= $h{$o[1]}-- / ($t - 1);
 $R += $r;
}
printf "%3.2f\n", $R;

実行結果
~ $ perl 13_255.pl
0.31
0258さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/20(水) 00:58:27.33ID:5PEVWiZL
お題: URLで場所を指定された、インターネット上のテキストファイルをダウンロードするプログラム。
0259デフォルトの名無しさん
垢版 |
2019/02/20(水) 01:16:40.92ID:SyQ4jkRO
>>258 Perl5
require LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)');
use HTTP::Cookies;
$ua->cookie_jar(HTTP::Cookies->new(file => 'lwp-cookies.txt', autosave => 1));
$url = 'http://ftp.iij.ad.jp/pub/linux/centos/7.6.1810/isos/x86_64/0_README.txt';
$file = './0_README.txt';
$res = $ua->mirror($url, $file);
print $res->status_line, "\n";

実行例
~ $ perl 13_258.pl
200 OK


(※こういうのは、別に今急に考えたわけじゃなく、日常的に作って使っているのですぐ投稿できました)
0264デフォルトの名無しさん
垢版 |
2019/02/20(水) 02:51:47.69ID:qYIek1dL
>>255
;; Common Lisp

(let ((prime (list 2)))
 (defun primep (n)
  (loop for i from (1+ (car prime)) upto n
      unless (find-if (lambda (j) (zerop (mod i j))) prime :from-end t)
      do (push i prime))
  (find n prime)))

(defun nearest (i j)
 (/ (floor (+ (* i (expt 10 j)) 0.5)) (expt 10 j)))

(loop with cards = (loop for i from 1 to 8 nconc (make-list (- 9 i) :initial-element i))
    and n = 0 and p = 0
    for one in cards
    do (loop for two in (remove one cards :count 1)
         do (incf n)
         if (primep (+ (* 10 one) two)) do (incf p))
    finally (format t "~,3F~%" (nearest (* (/ p n)) 3)))
0267デフォルトの名無しさん
垢版 |
2019/02/20(水) 03:43:59.14ID:J4bEIWoi
>>265
できるかなあ?どういう制限しているかにもよるぞ。
0268デフォルトの名無しさん
垢版 |
2019/02/20(水) 05:32:07.81ID:B2QSVSiS
PowerShell にも、curl, wget ある

get-alias (gal)

curl -> Invoke-WebRequest
wget -> Invoke-WebRequest

と言うことは、Ruby からも、そのコマンドを呼べる
0269268
垢版 |
2019/02/20(水) 09:30:07.43ID:B2QSVSiS
なんと、コマンドプロンプトで、
where curl と入力すると、
C:\Windows\System32\curl.exe

PowerShell の、curl, wget は、Invoke-WebRequest のエイリアスだけど、
curl.exe は、本物のcurl !
0271デフォルトの名無しさん
垢版 |
2019/02/20(水) 09:52:59.12ID:PF1BNO4k
>>258 >>265 なんだ下心があったのか。

pythonista stash は以下のコマンドが使える。

help(StaSh) v0.7.1
alias, cat, cd, clear, cowsay, cp, crypt, curl, cut, dropbox_setup, du, easy_config, echo, edit, exit, fg, find, ftpserver, gci, gh, git, grep, head, httpserver,
jobs, kill, latte, ls, mail, man, mc, md5sum, mkdir, monkeylord, more, mount, mv, openin, pbcopy,
pbpaste, ping, Usage, pip, printenv, printhex, ptinstaller, pwd, py-tree, python, python3, quicklook, rm, rmdir, scp, selfupdate, sha1sum, sha256sum,
sort, source, sqlite, ssh, ssh-keygen, stashconf, tail, tar, telnet, totd, touch, umount, uniq, unzip, version,
wc, webviewer, wget, whatis, which, wol, xargs, zip

ftpserver や、httpserverは簡易的なサーバーになる。
ssh やscp 、tar zip などは使い道多そう。
webviewer てpython の下でブラウザが立ち上がってるみたいなんだがどんな使い道があるんだろう?

なお、標準python用のシェルは、xonsh と言うのがあるらしい。 xonsh では、標準的なshellコマンドと並行してpython スクリプトも実行できるから強力。
stash ではそれはできない。
0272268
垢版 |
2019/02/20(水) 10:31:11.68ID:B2QSVSiS
WSH はわからないけど、Ruby では、

require 'nokogiri'

html = `curl http://www.example.com/`
# curl は書き込めないので、全角に変換した

doc = Nokogiri::HTML( html )

elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
0274デフォルトの名無しさん
垢版 |
2019/02/20(水) 13:03:16.05ID:agArr1lp
>>269
なんかね。UNIX系OSで昔からよく使われてたコマンドを移植したようで、tarとか他にも色々あったと思った。
0280デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:06:17.90ID:TUYpSwcQ
>>279 JavaScript
const arr = ['apple', 'banana', 'orange', 'mango'];
const last = ' and ' + arr.pop();
console.log(arr.join`, ` + last);
//=> apple, banana, orange and mango
0282デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:27:21.23ID:2zdYL4u2
>>279
Haskell

main = putStrLn.concat.concat $ [map addCanma (init lst),["and,"],[last lst]]

addCanma s = s ++ ","

lst = ["apple","banana","orange","mango"]



output:
apple,banana,orange,and,mango
0283デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:31:58.30ID:lqQG1Hmj
題意は
list = ["red","green","black","white"]
print(", ".join(list[:-1]),"and",list[-1])
# red, green, black and white
だろ
0285デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:51:21.05ID:2zdYL4u2
>>283
あ、そうか。
不恰好だけどこれで一応対応。

(putStrLn.concat.concat) [init $ map addCanma $ init lst,[last $ init lst],[" and "],[last lst]]

スマートな解答も考えてみるよ。
0287デフォルトの名無しさん
垢版 |
2019/02/21(木) 20:20:50.88ID:2zdYL4u2
スマートかは兎も角、一応マシな形に。
空リストや要素数1にも対応。

Haskell

main = putStrLn $ last2 lst

last2::[String] -> String
last2 [] = []
last2 [x] = x
last2 [x,y] = concat [x," and ", y]
last2 (x:xs) = x ++ "," ++ last2 xs

lst = map show [0..5]


output:
0,1,2,3,4 and 5
0288デフォルトの名無しさん
垢版 |
2019/02/21(木) 20:59:38.40ID:lqQG1Hmj
>>286
list = [str(x) for x in range(1,5)]
とか
map(lambda x : str(x), list)
でもおk

要素数が1個以下の場合はifで分離するだけなので略
0289デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:09:47.73ID:y3+CYNZ6
>>279 Common Lisp
(format t "~{~@{~A~^~#,1^, ~}~^ and ~A~}~%" (list 1 2 3 4))
https://ideone.com/6DcwO9
0290デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:21:18.07ID:lqQG1Hmj
intとstrが混在してる場合でも大丈夫で入力数が1以下ならそのまま返すワンライナー

python
print("".join(reversed(" ,".join(reversed([str(x) for x in list])).replace(",","dna ",1))))

JS+正規表現
console.log(list.join(", ").replace(/(.*),(.*?)+/,"$1 and $2"))

冷静に考えるとこの正規表現を使い回せばどの言語でもワンライナーなのでは
0291さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/21(木) 21:21:18.26ID:PQQkN+7n
ラティス、再び。

お題: >>99 の場合分けのラティス構造を使って、複数の入力文字列について、共通部分をまとめ、1つの文字列に凝縮せよ。

(例)
ああい
ああ
あう
→あ{{あ{い/}}/う}
0292デフォルトの名無しさん
垢版 |
2019/02/21(木) 21:30:40.21ID:lqQG1Hmj
よく考えたらreversedなんか使わんでも
print((" ,".join([str(x) for x in list][::-1]).replace(",","dna ",1))[::-1])
でいけるか。join削減できるし
0293さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/21(木) 21:32:52.15ID:3Jj6vI7v
出力文字列の長さは最短でなければならない。
場合分けの順序は問わないが、場合分けの項目について、ソートすることが望ましい。
0297デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:55:49.76ID:2zdYL4u2
>>279
>>292

Haskellでもワンライナー出来たけど、読みやすいとは思えない。(横長だし)
発想としては(要素数2以上なら)最後以外の要素(文字列)の頭に','追加して、全部結合して(大きな文字列にして)最後に頭の','を省く。

main = putStrLn.tail.concat $ if length lst < 2 then lst else [(concat.(map (\x -> ',':x)).init) lst," and ",last lst]

lst = map show [0..5]

個人的に >>287 の方が発想も読みやすさも好みの書き方。
(読み難くなるなら関数分ける派)

pythonのはワンライナーでも比較的読みやすくて、ちょっと羨ましい。
0298デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:59:16.06ID:2zdYL4u2
>>297
弄ってるうちに要素一以下だとバグ出てた。

正しいコードはこっち。

putStrLn.concat $ if length lst < 2 then lst else [(tail.concat.(map (\x -> ',':x)).init) lst," and ",last lst]
0299デフォルトの名無しさん
垢版 |
2019/02/21(木) 23:36:37.11ID:un6uIa3F
>>282 Perl5

sub f {
 my $a = shift;
 @_ ? (@_ > 1 ? "$a, " : "$a and ").f(@_) : $a
}

use feature say;

say f(qw[red green black white]);
say f(qw[apple banana]);
say f(qw[one]);


実行結果
~ $ perl 13_279_and.pl
red, green, black and white
apple and banana
one
0301デフォルトの名無しさん
垢版 |
2019/02/22(金) 00:07:27.55ID:wSgiM5bY
>>299
アンカー間違えた >>279 宛だった…orz


>>279 もう一丁 Perl5

sub g {
 my $z = ' and '.pop @_ if @_ > 1;
 join(', ', @_).$z;
}

use feature say;
say g(qw[red green black white]);
say g(qw[apple banana]);
say g(qw[one]);

実行結果
~ $ perl 13_279_and_2.pl
red, green, black and white
apple and banana
one
0305デフォルトの名無しさん
垢版 |
2019/02/22(金) 06:09:02.19ID:HhIJRo4K
>>279
Smalltalk (Pharo 7)

#('apple' 'banana' 'orange' 'mango') asCommaStringAnd
==> 'apple, banana, orange and mango'

#('apple' 'banana') asCommaStringAnd
==> 'apple and banana'

#('apple') asCommaStringAnd
==> 'apple'
0306デフォルトの名無しさん
垢版 |
2019/02/22(金) 06:36:03.41ID:S1fPIClY
>>279 python

def f(lst): return ('空だ' if not lst else
','.join([str(x) for x in lst[:-1]])
+ (' and ' if len(lst)>1 else'')
+ str(lst[-1])
)


print(f( [ 1,'二',3,4,'五'] )) # 1,二,3,4 and 五
print(f( [1,'二'] )) # 1 and 二
print(f( [1] )) # 1
print(f([])) # 空だ
0307305
垢版 |
2019/02/22(金) 07:07:04.28ID:HhIJRo4K
しまった既出だったorz
0308デフォルトの名無しさん
垢版 |
2019/02/22(金) 07:58:55.12ID:6TNKk8ap
>>279 Ruby

f = -> a {a[0..-2].join(', ').sub(/.\K\z/, ' and ') << a[-1].to_s}

(-1..3).each{|r| puts f[[*0..r]]} # =>

0
0 and 1
0, 1 and 2
0, 1, 2 and 3
0316デフォルトの名無しさん
垢版 |
2019/02/22(金) 21:42:16.23ID:THqrb0iU
お題:
長方形のフィールドが与えられる。フィールド上では上下左右に移動することができる。
各マスの数字はそのマスに入るためのコストを表す。
SからGに向かうときの最小コストを求めよ。(SとGのコストは0とする)

S5111
1115G
=> 6

S1111
98642
G1111
=> 9

13457689768914512071934123457
G4578901258901212890361125312
37890423076834712378998725463
16890102569615902061456259893
34582934765923812893461515232
57896123896741378915691551697
89013897456123457162501835479
21389046013845610034623405686
8902346203948612341356362342S
=> ?
0322デフォルトの名無しさん
垢版 |
2019/02/23(土) 00:27:48.65ID:khwKgkQE
>>313 python
#階乗1
import math
print('階乗1',math.factorial(21))

#階乗2
def f(n): return f(n - 1)*n if n > 1 else n
print('階乗2',f(21))

#階乗3
print('階乗3',(lambda x:f(21))( globals().update({"f": lambda n: n*f(n - 1) if n > 2 else n })))
0323デフォルトの名無しさん
垢版 |
2019/02/23(土) 01:14:20.46ID:9pS68leH
>>279
Kotlin script
最後のカンマを正規表現の文字列置換で and にしただけ。

println(listOf("abc", "def", "xyz").joinToString(", ").replace(",([^,]*)$".toRegex(), " and$1"))

出力

abc, def and xyz
0324デフォルトの名無しさん
垢版 |
2019/02/23(土) 01:19:01.99ID:CTQXI+x5
lispって組み込みで素数かどうか判定するやつ提供されてるのか、、、面白い!
0325デフォルトの名無しさん
垢版 |
2019/02/23(土) 02:10:15.51ID:9pS68leH
>>313
bc

n = 2; for (i = 3; i <= 21; i++) n*=i; n

出力
51090942171709440000
0327デフォルトの名無しさん
垢版 |
2019/02/23(土) 03:32:49.90ID:R2s6jSV3
bcのってjsでもそのまま動くんだな。どっちもc由来文法だからか…
for(i=s=1;i<22;)s*=i++;s
0328デフォルトの名無しさん
垢版 |
2019/02/23(土) 04:30:09.37ID:R2s6jSV3
>>326
恥ずかしながらdcコマンド知らなかった…いいねこれ。
~$ echo "$(seq -s' ' 1 21)$(printf '* %.0s' {1..20})p" | dc
51090942171709440000
0329デフォルトの名無しさん
垢版 |
2019/02/23(土) 08:05:10.28ID:xK8/Ze+A
>>313 Maxima
print(21!);
0331デフォルトの名無しさん
垢版 |
2019/02/23(土) 08:45:55.53ID:DQY5g4De
>>316
これは、本格的だな

ダイクストラ・A* みたいな、順位キュー(priority queue)を使わないと、いけないかも
0335デフォルトの名無しさん
垢版 |
2019/02/23(土) 12:44:52.28ID:W0y17tlk
python3
標準ライブラリ内の数学関数の例
import math
print(math.factorial(21))
そうじゃない例
from functools import reduce
print(reduce(lambda x,y:x*y,range(1,22)))

ちょっと高度化したお題
素数階乗n#を実装せよ
ただし素数階乗とは与えられた整数n以下のすべての素数の積である

1#=1
3#=4#=6
5#=30
0336デフォルトの名無しさん
垢版 |
2019/02/23(土) 13:22:30.58ID:R2s6jSV3
例がちょっと意味分からない
1#=1
1以下の素数の積なのに1?
3#=4#=6
何これ?
5#=30
これだけ分かる
0339デフォルトの名無しさん
垢版 |
2019/02/23(土) 13:34:54.53ID:vMXU7Bcc
>>337
掛けるもののがないときは1として扱うのが普通だよ
0!とかΠの項数が0の時とか

ただこの出題者はそのへん理解してないだろうから解く気がしない
0342デフォルトの名無しさん
垢版 |
2019/02/23(土) 13:53:12.99ID:W0y17tlk
というか数学でも0!=1!=1と定義されているのが普通だと思うし
高校でも大学でもそうじゃない問題を見たことがないのだが
0344デフォルトの名無しさん
垢版 |
2019/02/23(土) 14:28:11.89ID:DQY5g4De
単位元(初期値)だろ。
足し算は0、掛け算は1 が、単位元

Ruby で、
( 1..21 ).inject( 1, :* )

1 が初期値で、:* で掛け算メソッドを渡している
0345デフォルトの名無しさん
垢版 |
2019/02/23(土) 15:02:20.95ID:R2s6jSV3
>>342
> ただし素数階乗とは与えられた整数n以下のすべての素数の積である

と書いてあるので、

「与えられた整数n」が1
のとき、
「与えられた整数n以下のすべての素数の積」
は、
「1以下のすべての素数の積」
となり、
1以下に素数はないのになんで例で答がが1になってるんだろう、と思った次第です。
お騒がせしました。
0346デフォルトの名無しさん
垢版 |
2019/02/23(土) 15:15:16.07ID:R2s6jSV3
できた
JavaScript
const prodPrimes = n => {
const primes = [1];
for (let m = n; m > 1; m--) {
let prime = 0;
for (let i = 2; i <= m - 1; i++) {
if (m % i === 0) prime = i;
}
primes.push(prime || m);
}
return [...new Set(primes)].reduce((acc, p) => acc * p);
}
console.log(prodPrimes(1)); //=> 1
console.log(prodPrimes(3)); //=> 6
console.log(prodPrimes(4)); //=> 6
console.log(prodPrimes(5)); //=> 30

今夜はPythonで>>316に挑戦したい
0347デフォルトの名無しさん
垢版 |
2019/02/23(土) 15:45:56.58ID:xK8/Ze+A
>>335 J
f =: 3 : 0
*/ 1 , I. 1 p: i. >:y
)

f@> 1 3 4 5 21
1 6 6 30 9699690
0349デフォルトの名無しさん
垢版 |
2019/02/23(土) 16:01:13.49ID:BD+5EZ0V
>>313 Common Lisp
(defun ! (n)
  (apply #'* (loop for i from 1 upto n collect i)))

CL-USER> (! 21)
51090942171709440000
CL-USER> (! 0)
1
CL-USER>
0354デフォルトの名無しさん
垢版 |
2019/02/23(土) 20:22:19.99ID:ejRNWGjN
>>316
python(pypy) https://ideone.com/DV1w4s

本線: キュー使用したダイクストラ (+ 経路復元)。

サンプル程度なら、ワーシャルフロイド(頂点^3)でも回る、と同方も追加。
さすがにpythonには少々きつく、pypyに逃げた。
0355デフォルトの名無しさん
垢版 |
2019/02/24(日) 00:49:59.19ID:ROsmA06r
>>354 pypy に逃げたという話は、その方がかなりスピードが早いからという事? どの位のスピード差になるんだろう?
■ このスレッドは過去ログ倉庫に格納されています

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