質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

7回答

2206閲覧

一ヶ月を分割する様な計算

enigumalu

総合スコア192

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

2クリップ

投稿2017/07/25 10:44

編集2017/07/25 10:44

1月を複数分割する様な計算をしたいのですが簡潔に記載できる様な気がするのですがいかんせん思いつかずこまっています
特にif文のto_dateを分割した日として処理で使う必要があるのですが、ここが自分で書いてて気持ち悪いです
書いたコードはjavaで3分割していますがshや別言語で記述するかもしれないため日付を文字列にしています

int MAX_LIMIT = 3; String taget_ymd="20170731"; String taget_day = taget_ymd.substring(6, 8); int date_term = Integer.parseInt(taget_day) / MAX_LIMIT; String to_date=""; for(int i=0;i<= MAX_LIMIT-1;i++){ if(i==MAX_LIMIT-1){ to_date = taget_day; } else { to_date = String.valueOf(i * date_term + date_term); } //1回ごとの処理処理 System.out.println(to_date); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takito

2017/07/26 03:06

分割で出た余りの処置はどのようにする方針ですか?最後を多くするのか、なるべく等分になるよう配分したいのか
think49

2017/07/26 10:27 編集

私もそれは気になります。私の回答では、あげられている「31」の事例を元に改善し、余剰分は後方から等しく配分する方針と仮定しました。29を3等分すると「9 -> 19 -> 29」になります。「10 -> 20 -> 29」の方が見た目はいいですが、そうすると「31」が「10 -> 20 -> 31」として扱う要件と合致しなくなります。個人的には余剰分は前方に等しく配分して「11 -> 21 -> 31」「10 -> 20 -> 29」とする方が好みです。
takito

2017/07/27 00:33

「1月を複数分割する様な計算をしたい」ことの目的を教えてほしいですね。
enigumalu

2017/07/27 09:32

1ヶ月の処理を複数分割して分割回毎に分割した期間の日(dd)を利用して処理を行いたいのです。内容的に3回程度がちょうどいいので3回としています。 余剰分に関しては3等分されていて月末がきちんとデータに適宜できればそれでいいとしています。 綺麗な状態にするには回答にあるように年月日の区分けを持つ必要がありますがそこまでを求めていないのです。
guest

回答7

0

自分ならこうすると思います。

int day = Integer.parseInt(taget_day); double date_term = (double)day / MAX_LIMIT; for(int i = MAX_LIMIT - 1; i >= 0; i--){ //1回ごとの処理処理 System.out.println(String.valueOf(day - Math.floor(date_term * i))); }

あと、割とどうでもいいことですが、

for(int i = 0; i <= MAX_LIMIT - 1; i++){

マイナス1して<=で比べるなら、

for(int i = 0; i < MAX_LIMIT; i++){

マイナスせずに<で比べたほうが見やすいです。
doubleとの比較等では上も有用ですが、int同士なら下の方がいいと思います。
個人的な意見なので、そういうこと考える人もいるんだなーくらいに思っていただければ。

投稿2017/07/26 00:18

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

java

1int date = Integer.parseInt(taget_day); 2for (int i = 1; i <= MAX_LIMIT; i++) { 3 to_date = String.valueOf(date * i / MAX_LIMIT); 4}

これでどう?

投稿2017/07/25 14:09

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JavaScript タグがあるので、JavaScript で回答します。

元のコードの問題点

質問文のコードには、29 の三等分を試みた場合に三等分にならない問題があります。
[9, 9, 11] の配分となりますが、[9, 10, 10] もしくは [10, 10, 9] になるべき状況です。

JavaScript

1'use strict'; 2var MAX_LIMIT = 3; 3var taget_ymd = "20120229"; 4var taget_day = taget_ymd.substring(6, 8); 5var date_term = Math.floor(taget_day / MAX_LIMIT); 6var to_date=""; 7 8for (var i = 0; i <= MAX_LIMIT - 1; i++){ 9 if (i === MAX_LIMIT - 1){ 10 to_date = taget_day; 11 } else { 12 to_date = i * date_term + date_term; 13 } 14 //1回ごとの処理処理 15 console.log(to_date); // 9 -> 18 -> 29 16}

修正版コード

余剰分の数値は質問文のコードに合わせて、後方に持ってくるようにしました。
すなわち、29 を与えた場合は [9, 10, 10] の配分となります。

JavaScript

1'use strict'; 2function toDividedInteger (number, divisor) { 3 var floor = Math.floor, 4 integers = [], 5 divided, remainder; 6 7 number = floor(number); 8 divisor = floor(divisor); 9 remainder = number % divisor; 10 divided = (number - remainder) / divisor; 11 12 for (var i = 0, j = divisor - remainder - 1, temp = 0; i < divisor; ++i) { 13 temp += divided + Number(j < i); 14 integers.push(temp); 15 } 16 17 return integers; 18} 19 20var integers = toDividedInteger('20120229'.slice(-2), 3); 21console.log(JSON.stringify(integers)); // [9, 19, 29]

Re: eugenio さん

投稿2017/07/25 13:21

編集2017/07/25 13:28
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku__ra__ge

2017/07/26 07:08

質問文のコードは型宣言がありSystem.out.printlnを使っていることからjavaだと思いますが……。javaの場合、int型とint型の除算の結果は端数切り捨てなので問題ないと思います。
think49

2017/07/26 07:49 編集

Javaに詳しくないので外していたら申し訳ないのですが、端数の問題ではないと考えています。 String taget_ymd="20120229"; と仮定すると、date_term は 9 になります。 すると、出力される値が「9 -> 18 -> 29」となり、index 0, index 1 の範囲が「9」であるのに対して、index 2 だけ「11」の範囲を取るように読めました。 最終インデックスだけ最終値をとる帳尻合わせをした場合、三等分にはなりません。 私のコードの読み方が間違っているのでしょうか。
ku__ra__ge

2017/07/26 08:34

失礼しました。回答の意図を読み違えていました。 確かに3つには分かれても、等分にはならない問題がありますね。
guest

0

ループの変数をわざわざ1小さい数で回して、ループ内でそれの分を足してるような感じがします。
以下のようなコードでいいのでは?

java

1for(int i=1; i<=MAX_LIMIT; i++){ 2 String to_date = String.valueOf(i * date_term); 3 if (i == MAX_LIMIT) { to_date = taget_day; } 4 5 System.out.println(to_date); 6}

投稿2017/07/25 13:04

編集2017/07/25 13:05
ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

date_termがいらないんじゃないかな

to_date = (double)target_day / MAX_LIMIT * (i+1);

となるようにすれば、if文もいらない

投稿2017/07/26 01:34

編集2017/07/27 08:32
hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんなんどうでしょ?

Java

1int MAX_LIMIT = 3; 2String taget_ymd = "20170731"; 3String taget_day = taget_ymd.substring(6, 8); 4int date_term = Integer.parseInt(taget_day) / MAX_LIMIT; 5for (int i=1; i<=(MAX_LIMIT - 1); i++) { 6 to_date = String.valueOf(i * date_term); 7 System.out.println(to_date); 8} 9System.out.println(taget_day);

投稿2017/07/25 13:29

編集2017/07/25 13:36
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おっしゃりたいことがよくわからないのですが、こういう感じでしょうか?

Java

1public class MonthSeparater { 2 private final int[] dayTable = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 3 private int divisionNum; 4 5 public MonthSeparater( int divisionNum ) { 6 this.divisionNum = divisionNum; 7 } 8 public int computePeriod( String ymd ) { 9 int month = computeMonthByYmd( ymd ); 10 int day = computeDayByYmd( ymd ); 11 return day * divisionNum / ( dayTable[ month ] + 1 ) + 1; 12 } 13 14 // 15 // private methods 16 private int computeMonthByYmd( String ymd ) { 17 return Integer.parseInt( ymd.substring( 4, 6 ) ); 18 } 19 private int computeDayByYmd( String ymd ) { 20 return Integer.parseInt( ymd.substring( 6, 8 ) ); 21 } 22}

微妙なネーミング、漂うマジックナンバー感、改善の余地は大いにあるコードですが。

投稿2017/07/25 12:56

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問