X



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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2020/03/13(金) 01:42:47.06ID:0rEhys36
プログラミングのお題スレです。

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

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

※前スレ
プログラミングのお題スレ Part16
https://mevius.5ch.net/test/read.cgi/tech/1573948822/
0197デフォルトの名無しさん
垢版 |
2020/04/17(金) 17:12:31.49ID:tQG0pn8t
>>196
内角の和が180°かで判定すると二番目のデータのような
星のひしゃげたような形も星型扱いされてしまう
交線計算が要るんじゃないかな
0202デフォルトの名無しさん
垢版 |
2020/04/18(土) 06:43:51.86ID:YnXQesFn
「五角形P0-P1-P2-P3-P4が星形である」と「五角形P0-P2-P4-P1-P3が凸五角形である」は同値でいいのかな
0204デフォルトの名無しさん
垢版 |
2020/04/18(土) 14:12:42.90ID:IwpZ9OtG
atan2とか要りそう
知らんけど
0207デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:34:26.54ID:N4WXNODD
>>206
3番目のデータに関して
「五角形P0-P1-P2-P3-P4が星形である」 => false
「五角形P0-P2-P4-P1-P3が凸五角形である」 => false

反例にはなっていないはずだが?
0208デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:47:06.00ID:30AxPVCB
「五角形P0-P1-P2-P3-P4が凸五角形である」 => true
「五角形P0-P2-P4-P1-P3が星形である」 => true

多分言いたいのはこっちでしょ
いずれにしろ反例になってないけど
0214デフォルトの名無しさん
垢版 |
2020/04/18(土) 18:04:17.09ID:U3Va20gw
いつものキチガイでしょ。
0216デフォルトの名無しさん
垢版 |
2020/04/18(土) 22:46:42.32ID:N4WXNODD
>>215
「五角形P0-P1-P2-P3-P4が星形である」 => true
「五角形P0-P2-P4-P1-P3が凸五角形である」 => true

だから反例じゃねえだろ
つーか凸角形の定義と対角線の定義から同値性は自明だろ
何が分からないのかが素でわからん
というか日本語通じてんのかこれ
0217デフォルトの名無しさん
垢版 |
2020/04/18(土) 22:48:13.84ID:n1sMw7/h
またキチガイが暴れてるのか…
0220デフォルトの名無しさん
垢版 |
2020/04/18(土) 22:52:15.69ID:n1sMw7/h
ID真っ赤やん
0224デフォルトの名無しさん
垢版 |
2020/04/18(土) 22:59:19.73ID:GFBeMLbL
>>221
ホントだすまんおれの手元の描画ミス

検算プログラム書いたが4番目のデータ、0-2-4-1-3で一周回ってきたときの方向かえる角度の和が2piにならんのよね
ANG: -0.785398163397448 -1.03037682652431 -1.14103404769821 -0.896055384571344 -1.5707963267949
和: -5.42366074898621

なーにかが間違ってるのか…
0225デフォルトの名無しさん
垢版 |
2020/04/18(土) 23:19:38.75ID:3QrrEgXO
五角形の内角の和は540度だぞw
0226デフォルトの名無しさん
垢版 |
2020/04/18(土) 23:23:05.51ID:N4WXNODD
内角じゃなくてどれだけ曲がったかの和を計算してるんだから2PIで良いだろ
数値があってんのかは知らんが
0227デフォルトの名無しさん
垢版 |
2020/04/18(土) 23:50:57.37ID:tXl890QR
ニチャァ…
0230デフォルトの名無しさん
垢版 |
2020/04/19(日) 00:25:50.90ID:suK8nNv5
>>229
検算とヒントありがと、2.00055860589158 - (-1.14103404769821) = 3.14159265358979
プログラの間違い直せたら書き込むわ
0232デフォルトの名無しさん
垢版 |
2020/04/19(日) 00:35:52.14ID:suK8nNv5
>>231
1)内積⇒arccos
2)外積⇒arcsin
凸判定には角度0や符号反転も要検出なので
2)でやってるがどっかに間違い入っちゃったかもしれなす
0233デフォルトの名無しさん
垢版 |
2020/04/19(日) 00:56:56.21ID:tNtEbJNg
自演と思わないと精神保てないの草
0234デフォルトの名無しさん
垢版 |
2020/04/19(日) 01:15:18.71ID:kCjisW+o
お題:マップの縮尺から画面の縮尺バーの長さを求めろ。

縮尺は、現実:画面 = 1:s
バーの長さは100以上で出来るだけ短くする。
バーの現実での長さの数値は 1, 2, 5 が頭にきて以降は0のみが続くもののみ許される。(1桁なら0がなくても良い)

例:
s = 0.003 → 150
0.01 → 100
0.4 → 200
0.96 → 192
0235デフォルトの名無しさん
垢版 |
2020/04/19(日) 06:41:17.34ID:J81tNU7x
>>234
問題がよくわからない。
0236デフォルトの名無しさん
垢版 |
2020/04/19(日) 07:17:30.86ID:kCjisW+o
説明が下手ですみません。

縮尺バーはGoogleマップの右下にあるようなバーで、画面上のバーの長さが現実では何キロメートルかを示しています。
その現実で何キロメートルかというのがバーの左に表示されています。
バーの長さはズームインしていくと連続的に伸びていき、伸びるすぎるガクッと縮んで、また連続的に伸びていきます。

そしてそのバーの左に表示される距離は2kmや50km、100kmなどの数値のみで中途半端な値は取りません。
この条件下で、縮尺とバーの長さの最小値を定めたときに、どんな長さでバーを画面に表示するかを求める問題です。
バーの長さは取りうるものの中で最小のものでお願いします。
0240デフォルトの名無しさん
垢版 |
2020/04/19(日) 12:05:15.55ID:bDqlqATM
単発IDワラワラ
0244デフォルトの名無しさん
垢版 |
2020/04/19(日) 14:11:18.59ID:J81tNU7x
>>236
現実:画面 = 1:s
という式の意味は?
0245デフォルトの名無しさん
垢版 |
2020/04/19(日) 15:33:55.52ID:xgV79Bs/
>>186 Perl5、P0-P2-P4-P1-P3が凸五角形であるか、で判定

@t = ([[0,0], [1,2], [2,0], [0,1], [2,1]],
   [[0,0], [1,2], [2,0], [0,2], [2,2]],
   [[0,0], [0,1], [1,2], [2,1], [2,0]],
   [[0,0], [5,5], [0,5], [1,0], [1,6]],
   [[0,1], [0,0], [1,0],[-1,-2],[-2,-1]]
   );
@s = qw{0 2 4 1 3 0 2};
use PDL;
use PDL::Math;
use PDL::Constants qw(PI);
use feature 'signatures';
sub f($v1, $v2) {
 my $sp = sum $v1 * $v2;
 $v2 = -$v2 if $sp < 0.0;
 my $ang = asin det pdl $v1 , $v2;
 $ang = $ang >= 0.0 ? -PI + $ang : PI + $ang if $sp < 0.0;
 $ang
}
for $ps (@t) {
 @vs = map{pdl $ps->[$s[$_]]} 0..6;
 @es = map{norm($vs[$_+1] - $vs[$_])} 0..5;
 $angs = pdl map{f $es[$_], $es[$_+1]} 0..4;
 $ans = 'true';
 $ans = 'false' if (grep{abs $angs->at($_) < 0.0001} 0..4)
            or $angs->min * $angs->max < 0.0;
 $ttl = sum $angs;
 $ans = 'false' if abs $ttl < 6.28 or abs $ttl > 6.29;
 print "$ttl = Σ$angs: $ans\n";
}
0246デフォルトの名無しさん
垢版 |
2020/04/19(日) 15:35:04.69ID:dE29U5t1
>>245 の実行結果

~ $ perl 17_186_convx_pent.pl
The signatures feature is experimental at 17_186_convx_pent.pl line 12, <DATA> line 207.
6.28318528610616 = Σ[ 1.5707963 0.78539816 1.5707963 0.78539816 1.5707963]: true
6.28318530717959 = Σ[ 1.5707963 1.5707963 0 1.5707963 1.5707963]: false
-12.5663706143592 = Σ[-2.2142974 -2.4980915 -2.677945 -2.677945 -2.4980915]: false
-6.28318530717959 = Σ[-0.78539816 -1.0303768 -2.0005586 -0.89605538 -1.5707963]: true
-12.5663706143592 = Σ[-2.0344439 -2.9996956 -2.4980915 -2.9996956 -2.0344439]: false
0249デフォルトの名無しさん
垢版 |
2020/04/19(日) 16:14:07.05ID:o4nQ3+S9
>>244
具体的には、地球上で1mの長さの直線の道路があった時、それを画面の地図上で 1m × s の長さで表示するということです。
s=0.01ならその道路は画面に1cmで表示されます。
0250デフォルトの名無しさん
垢版 |
2020/04/19(日) 18:05:16.51ID:3h7RKaJW
>>234 Perl5 (問題の意図をくみ取り違えていなければ、下記で良い筈…ただし実の距離が一桁以下の場合はNGかも…)

for $s (qw{0.003 0.01 0.4 0.96}) {
 $d = 1;
 while ($s * $d < 10) { $d *= 10 }
 if (50 <= ($s * $d)) {
  $d *= 2;
 } elsif (20 <= ($s * $d)) {
  $d *= 5;
 } else {
  $d *= 10;
 }
 print "$s -> ", $s * $d, "\n";
}

実行結果
~ $ perl 17_234_scale_bar_len.pl
0.003 -> 150
0.01 -> 100
0.4 -> 200
0.96 -> 192
0251デフォルトの名無しさん
垢版 |
2020/04/19(日) 20:22:34.05ID:3rSuzVma
>>250 もっとスンナリ書けるんだった…

for (qw{0.003 0.01 0.4 0.96}) {
 $d = $_;
 while ($d < 10) { $d *= 10 }
 if  (50 <= $d) { $d *= 2 }
 elsif (20 <= $d) { $d *= 5 }
 else       { $d *= 10 }
 print "$_ -> ", $d, "\n";
}
0252デフォルトの名無しさん
垢版 |
2020/04/20(月) 06:02:04.44ID:C+lKY/AM
>>234 Ruby
def scale( s )
i = (100.0 / s).ceil
j = 100 * 10 ** - Math.log10( s ).to_i
s * j * [ 1, 2, 5 ].each{|k| break k if i <= k * j; 10 }
end

[ 0.003, 0.01, 0.4, 0.96 ].each{|x| puts "%-6g → %d" % [ x, scale(x) ] }
0253デフォルトの名無しさん
垢版 |
2020/04/20(月) 16:12:46.13ID:EsvxpnHB
>>181 Perl5 (Javaじゃなくてスマソ、ActivePerlなどのTkxモジュールがインストールされている環境で実行ください)

use Tkx;

$top = Tkx::widget->new('.');
$c = $top->new_canvas(-width => 300, -height => 300);
$c->g_pack(-expand => 1);

($x0, $y0) = (150, 50);
$r = 200;
($v, $theta) = (0, 3.1415 * 40 / 180);
($x, $y);
$dt = 20;

sub show {
 ($x, $y) = ($x0 + $r * sin $theta, $y0 + $r * cos $theta);
 $c->coords($stick, $x0, $y0, $x, $y);
 $c->coords($ball, $x-7, $y-7, $x+7, $y+7);
 Tkx::after($dt, \&show);
 $a = -0.00098 * sin $theta;
 $a *= $a * $v > 0 ? 0.95 : 1/0.95; # dumping
 $dv = $a * $dt;
 $dtheta = ($v + $dv/2) * $dt / $r;
 $theta += $dtheta;
 $v += $dv;
}
show;

$stick = $c->create_line($x0, $y0, $x, $y, -width => 2.0);
$ball = $c->create_oval($x-7, $y-7, $x+7, $y+7, -fill => 'gray');

Tkx::MainLoop();
0254デフォルトの名無しさん
垢版 |
2020/04/20(月) 17:09:22.78ID:CQO/p7b7
最下点付近での近似だな
0255デフォルトの名無しさん
垢版 |
2020/04/20(月) 17:15:47.88ID:CQO/p7b7
いや普通のだったわ、すまん
0256デフォルトの名無しさん
垢版 |
2020/04/20(月) 18:33:21.43ID:SXRlK0qI
>>181 Python3 (Javaじゃなくてスマソ >>253 をインプリ, tkinterのインストールされている環境で実行ください)

import math, tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=300)
canvas.pack()
x0, y0 = 150, 50
r = 200
v, theta = 0, 3.1415 * 40 / 180
x, y = x0 + r * math.sin(theta), y0 + r * math.cos(theta)
stick = canvas.create_line(x0, y0, x, y, width=2)
ball = canvas.create_oval(x-7, y-7, x+7, y+7, fill='gray')
dt = 20
def show():
  global v, theta, x, y
  a = -0.00098 * math.sin(theta)
  a *= 0.95 if a * v > 0 else 1/0.95 # dumping
  dv = a * dt;
  dtheta = (v + dv/2) * dt / r
  theta += dtheta;
  v += dv;
  x, y = x0 + r * math.sin(theta), y0 + r * math.cos(theta)
  canvas.coords(stick, x0, y0, x, y)
  canvas.coords(ball, x-7, y-7, x+7, y+7)
  root.after(dt, show)
show()
root.mainloop()
0257デフォルトの名無しさん
垢版 |
2020/04/20(月) 19:55:58.67ID:qCtnBvYT
そろそろオレ二重振り子見たくなってきちゃったなァ
0261デフォルトの名無しさん
垢版 |
2020/04/20(月) 22:36:14.60ID:arq8EuUU
考えたわけじゃなくね?
0265デフォルトの名無しさん
垢版 |
2020/04/21(火) 19:01:08.06ID:Nu/0ktL2
>>258
数値計算にカオスとか関係なくね?
0267デフォルトの名無しさん
垢版 |
2020/04/23(木) 05:19:07.09ID:GeQlI54q
>>265
ウルトラマンカオス。
0268デフォルトの名無しさん
垢版 |
2020/04/23(木) 22:15:50.71ID:CuZLC5Yi
>>181 Common Lisp (SBCL) + CLX。X Window Systemが使える環境で。>>253, >>256を参考に
(require "asdf")
(asdf:load-system "clx")
(defpackage #:pendulum (:use #:common-lisp #:xlib))
(in-package #:pendulum)
(defvar *display* (open-default-display))
(defvar *screen* (display-default-screen *display*))
(defvar *window* (create-window :parent (screen-root *screen*)
         :x 0 :y 0
         :width 300 :height 300
         :background (screen-white-pixel *screen*)))
(defvar *gcontext* (create-gcontext :drawable *window*))
(defparameter *x0* 150)
(defparameter *y0* 50)
(defparameter *r* 200)
(defparameter *theta0* (/ (* pi 40) 180))
(defparameter *dt* 0.03)
(map-window *window*)
(loop for v = 0 then (+ v dv)
  for theta = *theta0* then (+ theta dtheta)
  for x = (+ *x0* (floor (* *r* (sin theta))))
  for y = (+ *y0* (floor (* *r* (cos theta))))
  for a = (let ((a (* -0.00098 (sin theta)))) (funcall (if (> (* a v) 0) #'* #'/) a 0.95))
  for dv = (* a *dt*)
  for dtheta = (/ (* (+ v (/ dv 2)) *dt*) *r*)
  do (progn
    (draw-line *window* *gcontext* *x0* *y0* x y)
    (draw-arc *window* *gcontext* (- x 7) (- y 7) 14 14 0 (* 2 pi) t)
    (clear-area *window*)))
0270デフォルトの名無しさん
垢版 |
2020/04/23(木) 23:53:39.74ID:lusTU/GG
お題: 配列と列数が与えられるので配列を行列に再構築して返せ
例:
in < [1, 2, 3, 4], 2
out > [[1, 2], [3, 4]]
0271デフォルトの名無しさん
垢版 |
2020/04/24(金) 00:06:04.10ID:B1fvRJ4E
>>270 Perl5

$s = [1, 2, 3, 4];
$ncol = 2;
push @b, [splice @$s, 0, $ncol] while @$s;
use Data::Dump 'dump';
print dump(\@b,)."\n";


実行結果
~ $ perl 17_270.pl
[[1, 2], [3, 4]]
0274デフォルトの名無しさん
垢版 |
2020/04/24(金) 02:15:23.92ID:XDANT2WI
>>270 matlab

reshape([1,2,3,4],[],2)
0276デフォルトの名無しさん
垢版 |
2020/04/24(金) 06:56:30.60ID:oaHyD4Kv
>>270 J
f =: 4 : 0
(-x) , \ y
)

  2 f 1 2 3 4
1 2
3 4
0277デフォルトの名無しさん
垢版 |
2020/04/24(金) 13:12:17.03ID:UlmQZP6K
>>275
あんたバカ?
0279デフォルトの名無しさん
垢版 |
2020/04/24(金) 15:04:41.40ID:SqTnlu82
みなのもの戦に備えろ
0280デフォルトの名無しさん
垢版 |
2020/04/24(金) 15:36:47.80ID:fZ+Jqbcm
>>270
Kotlin
https://paiza.io/projects/F6x2m9b-Hs-a2yOZFxLMAw

こういうことをするための chunked() という拡張関数がライブラリに最初からあるので自分ではほとんど何も考えてない。
0281デフォルトの名無しさん
垢版 |
2020/04/24(金) 16:43:36.97ID:QbKPO/NJ
      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ  <  どうすっかな……      ,,、,、,,,
    /三√ ゚Д゚) /   \_______
     /三/| ゚U゚|\      ,,、,、,,,               
 ,,、,、,,, U (:::::::::::)∪  ,,、,、,,,
      //三/|三|\       ,,,,    ,,、,、,,,
      ∪  ∪
  ,,          ,    ,,,,    ,,、,、,,,       ,,、,、,,,
,,,,,    ∧_∧ うまいモナー,,,,,   、 ,,,,,,   ,,,,,,,,    ,,,,,
 ,,,   ( ´∀`)___,,,,___ ,, ∧_∧ ゲンキニ シテルカナ・・・___,,
  / ̄ ( つ日ヽ   ∧_∧    (    )               /
/    (__))   (´∀` )   (    )    ∧_∧∧_∧ / マターリモナー
 ∧_∧∧_∧ドーゾ (日ノ )  | | |    ( ´∀`) ´∀`)
 ( ´∀`) ´∀`)    ((__)  ,(_(_) (○)⊂   ) つ日⊂ ) モーナー
―(つ⊂  ) つ⊂ )―――――――――――ヽ|〃(⌒)(⌒) (⌒)(⌒)
   (⌒)(⌒) (⌒)(⌒)グーグー
0286デフォルトの名無しさん
垢版 |
2020/04/24(金) 20:56:21.49ID:pA5GOauV
お題
XORゲートは4つのNANDゲートで構成できることが知られている
この構成方法をプログラムで探索せよ

i番目のNANDゲートの入力を(ai,bi)、出力をciとする
XORゲートの入力を(X,Y)、出力をZとする

出力例
X->a1
Y->b1
X->a2
c1->b2
Y->a3
c1->b3
c2->a4
c3->b4
c4->Z
0287デフォルトの名無しさん
垢版 |
2020/04/24(金) 23:27:45.63ID:giWR9tWL
>>286
Step 6, Solution 1
0 : -1, -2: 0, 0, 1, 1 : 2
1 : -1, -2: 0, 1, 0, 1 : 2
2 : 1, 0: 1, 1, 1, 0 : 3
3 : 2, 0: 1, 1, 0, 1 : 3
4 : 2, 1: 1, 0, 1, 1 : 3
5 : 4, 3: 0, 1, 1, 0 : 2
0290デフォルトの名無しさん
垢版 |
2020/04/25(土) 09:02:48.23ID:mTthreta
[0,0,0,0] は Array.new(4, 0)
[ nil,nil, nil,nil, nil,nil, nil,nil ] は Array.new(8)
って書いた方が分かりやすいな
あとcase-when はthenを使うのが良し
0293デフォルトの名無しさん
垢版 |
2020/04/27(月) 09:21:19.63ID:Vk+6u7Hb
次は全加算器をやってみよう。
4入力セレクタ辺りで限界でしょう。
0294デフォルトの名無しさん
垢版 |
2020/04/27(月) 18:53:24.75ID:KzmnkBMz0
このスレってアルゴリズムとかデータ構造を解説してくれる人はあまりいなんだな
0295デフォルトの名無しさん
垢版 |
2020/04/27(月) 19:18:51.96ID:XYadQOO0
聞かれなかったから
0296デフォルトの名無しさん
垢版 |
2020/04/27(月) 19:29:48.45ID:9Rl/jVuf
>>294
わからないことあったら聞こうよ
ガキじゃねえんだからさ
■ このスレッドは過去ログ倉庫に格納されています