中間の分数


13

中間の分数

チャレンジ:

少なくとも3つの入力を受け取るコードを作成する必要があります。2つの整数と「分数表現」-分数の増分を表す言語に適したタイプ)。文字列を選択した場合、入力は「1/4」になるか、2つの追加整数入力またはタプルまたはw / eを選択できます。

入力はどこでも合理的(STDIN、関数の引数、ファイルからなど)である可能性があり、出力(STDOUT、関数の戻り値、ファイルへなど)も可能です

ルール:

  1. 入力「分数」は常に1未満の有効な分数です。例「1/4」
  2. 2番目の入力整数は、常に最初の整数よりも高い値になります。つまり、最初の入力整数は常に2番目の入力整数よりも低い値になります。
  3. 入力整数は負の値にすることができます。
  4. 出力される端数は可能な限り減らす必要があります(簡略化)

コードは、入力分数の増分で2つの数値の間のすべての「分数ステップ」を出力する必要があります。

コードは、ここに記載されているプログラムまたは関数でなければなりません

例1:

入力: -2,3,"1/2"

出力:

 -2
 -3/2 
 -1 
 -1/2 
  0 
  1/2 
  1 
  3/2  
  2 
  5/2 
  3

例2:

入力: 1,2,"2/3"

出力:

1
5/3
2

または

1
4/3
2

注:カウントはどちらの方向からでも開始できます(@Megoに感謝)

これはであるため、バイト単位の最短回答が優先されます。


分数を2つの整数入力とみなして、合計4つの入力を作成できますか?
メゴ

最大3つの入力の制限を維持できないと思います-4つの入力のコードも見たいです
アレックスカールセン

その場合、3番目の入力に2つの整数を含むリスト/タプル/配列/その他の反復可能な型があるとどうなりますか?これは、4つの整数入力と基本的に違いはありません。また、分数が0に等しくないことを明確にする必要があります
。– Mego

それは「3つの入力少なくともかかるコード」に変更許されるべきではない理由@Megoはそれを通じ考えた後、私は見ることができない
アレックス・カールセン

1
私は別の答えを見て、かなりopenended入力部を守ってきた-長い出力が正しく、入力が2つの整数少なくともから来て、残りはあなた次第です:)として@beaker
アレックス・カールセン

回答:


5

オクターブ、34 30バイト

@(a,b,c)rats(union([a:c:b],b))

分子と分母を分離するのではなく、分数を数値式として使用するようになりました。

イデオンのサンプル


1
では、なぜ使用できないのです@(a,b,c)rats(union([a:c:b],b))か?
ルイスメンドー

@LuisMendo数式が入力として受け入れられる場合(1/2文字列入力ではなく数値としての有効な結果)は可能ですが、それは「分数表現」を解釈する方法ではありません。OPが同意すれば、4バイトを削減できてうれしいです。
ビーカー

ああなるほど。まあ、私はMatlabの回答でそれを使用しています。「有理数」は、特定のデータ型でない限り、Mathematicaの答えは、どうやらない
ルイスMendo

@ビーカー私は実際に応答しました
アレックスカールセン

@VisualBeanコードは既に更新されています。
ビーカー

11

Mathematica、16バイト

Range@##⋃{#2}&

2つの整数と有理数を取り、数のリストを返す名前のない関数。例:

Range@##⋃{#2}&[-2, 3, 1/2]
(* {-2, -(3/2), -1, -(1/2), 0, 1/2, 1, 3/2, 2, 5/2, 3} *)

Mathematica Rangeはチャレンジの要求通りに動作しますが、下限と上限の差がステップサイズの正確な倍数でない場合は上限を省略します。したがって、上限のみを含むリストでUnion(を使用して)取得します。これにより、リストが1回だけ表示されることが保証されます。Union結果は並べ替えられますが、ステップサイズは常に正であるため、とにかく並べ替えたいことに注意してください。また、有理数を扱っているため、それらは可能な限り自動的に削減されます。


10

T-SQL 2012+、831 535 477 270 246の 240 219バイト

これは1つのライナーであることに注意してください。SQLには、端数を減らすための組み込み機能がありません。このタイプの質問に最適な言語ではない場合があります。人間が読める形式です(他の言語の一部と比較して-の種類)。

DECLARE @f INT=-5,@t INT=3,@n INT=3,@ INT=8;

WITH C as(SELECT
top((@t*@-@f*@)/@n+1)ROW_NUMBER()OVER(ORDER BY @)M
FROM sys.messages)SELECT(SELECT
IIF(V%@=0,LEFT(V/@,9),CONCAT(V/MAX(M),'/',ABS(@)/MAX(M)))FROM c
WHERE V%M=0AND @%M=0)FROM(SELECT
@f*@+@n*~-M V FROM c)k

オンラインで試す


言語はT-SQLと呼ばれ、「Sqlserver」ではありませんか?
デビッドコンラッド

1
@DavidConrad言語はTSQLですが、sqlserverには異なるバージョンがあり、このためのTSQLはキーワードIIFによりsqlserver 2012で機能します。古いバージョンではキーワードCASEを使用します。あなたの提案を追加
-t-clausen.dk

よくやった。@nまたは@dをplainに変更することで、いくつかを節約できます@。NのCTEクエリはN AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))またはN AS(SELECT 1N FROM sys.all_views)です。このビューには数百が存在することがほぼ保証されているため、クロス結合も削減できます。 ISNULLより短くCOALESCE、動作するはずです
-MickyT

@MickyTあなたの提案と私自身のいくつかのおかげで、私はなんとか長さを296バイト減らすことができました。
t

素晴らしい仕事
-MickyT


5

Haskell、31 26バイト

f a b c=min[b]$a:f(a+c)b c

遅延評価FTW!デモ:

*Main> import Data.Ratio
*Main Data.Ratio> f (-2) 3 (1%2)
[(-2) % 1,(-3) % 2,(-1) % 1,(-1) % 2,0 % 1,1 % 2,1 % 1,3 % 2,2 % 1,5 % 2,3 % 1]
*Main Data.Ratio> f 1 2 (2%3)
[1 % 1,5 % 3,2 % 1]

(最初はHaskellの[a,a+c..b]表記法に誘惑されましたがf a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]、41バイトまたはf a b c=[x|x<-[a,a+c..],x<b]++[b]33 バイトのような何かを必要とするいくつかの癖があります。)


私はあなたのソリューションが好きです!ただしimport Data.Ratio、バイトカウントにも含める必要があると思いますf。それなしでは使用できないと思います。
-flawr

2
@flawr:素敵なエッジケース:すべての数値型に対して多態性があるためData.Ratiofそれ自体は必要ありません。ただし、typeの値で呼び出すRatio場合は、インポートが必要です。課題は、それを使用するのではなく、「...を作成する」だけです。インポートしなくても大丈夫だと思います。
-nimi

1
より正確には、%オペレータがテストフラクションを作成するためのインポートのみが必要です。1 % 22 % 3。ここではごまかしていません。これらの26バイトを自分で実際にファイルに入れ、そのモジュールでインタープリターを実行し、表示された対話を行うことができます。(あなたも、タイピングを避けることができimport Data.Ratio、あなたが代わりにスペル場合は、デモの相互作用に%Data.Ratio.%。)
アンダースKaseorg

5

MATL16 15バイト

3$:3Gvu9X10ZGZD

これは、非常に大きな分母では失敗する場合があります。出力形式が許容されることを願っています。

オンラインでお試しください!

3$:    % take three inputs and generate range
3G     % push third input again
v      % vertically concatenate. Gives vertical array as output 
u      % get unique elements (i.e. remove the last one if it is repeated)
9X1    % predefined literal 'rat'
0ZG    % set rational format
ZD     % display using that format

5

ルビー32 54 48バイト

->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}

このソリューションはに基づいています MegoのPythonの回答にcおりRational、常にRubyの分数形式であると想定しています。オンラインでお試しください!

編集:整数が整数のように表示されなかったバグを修正しました。Not That CharlesとMegaTomのおかげで-6バイト。

関数は次のように呼び出されます。

> f=->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}
> f[1,4,Rational(2,3)]
1
(5/3)
(7/3)
3
(11/3)
4

(3/1)単純に3であってはいけませんか?
edc65

Ruby の最も単純なRational形式3(3/1)
Sherlock9

.step(b,c).mapここでバイト数を減らす必要があります
チャールズ

(a==a.to_i)a%1==0-4バイトにすることができます。
メガトム

-2,3,1/2r(例1)最後の32回を印刷します。
バリューインク

3

ジュリア、14バイト

f(a,b,c)=a:c:b

これはMathematicaの答えに似ていますが、Juliaの範囲はすでに目的の形式になっているため、さらに短くなっています。数値のコレクションも返します。出力例:

11-element StepRange{Rational{Int64},Rational{Int64}}:
 -3//1,-5//2,-2//1,-3//2,-1//1,-1//2,0//1,1//2,1//1,3//2,2//1

整数は分母に1が表示され、分数には二重スラッシュが使用されることに注意してください。質問で定義されたとおりに出力を取得するには、さらにコードが必要です。

f(a,b,c)=map(x->println(x.num,x.den<2?"":"/$(x.den)"),a:c:b)

3

Symbolic Toolboxを使用したMatlab / SymPyを使用したOctave、27バイト

エラーを指摘してくれた@sanchisesに感謝します。

@(a,b,c)sym(union(a:c:b,b))

これは匿名関数です。呼び出すには、変数に割り当てるか、を使用しますans

例:

>> @(a,b,c)sym(union(a:c:b,b))
ans = 
    @(a,b,c)sym(union(a:c:b,b))
>> ans(-2,3,1/2)
ans =
[ -2, -3/2, -1, -1/2, 0, 1/2, 1, 3/2, 2, 5/2, 3]

上限が常に含まれているわけではないため、これは仕様に準拠していません(例2を試してください)。
-Sanchises

@sanchisesありがとう!今修正
ルイスメンドー

また、私はcあなたが使用できると思う、私は引用、どちらのタイプが小数増分[...]またはw / eを表すためにあなたの言語に合ったもの。それsymbolicが論理的で許可されている(@VisualBeanがこれを確認したいかもしれない)選択であることはかなり明らかだと思います。その後、コロン演算子の結果はsymbolic配列に「アップグレード」されsym()ます。つまり、呼び出しを完全に取り除くことができます。
-Sanchises

@sanchisesありがとう、私は明確化を求めました
ルイスメンドー

2

Javascript、108 90 86   81バイト

(a,b,n,d)=>{var s="";for(a=a*d;a<b*d;a+=n)s+=(a%d?a+"/"+d:a/d)+" ";s+=b;return s}

無名関数。空白を含む名前付き変数に割り当てた後:

var f=(a,b,n,d)=>
{ var s="";
  for(a=a*d; a<b*d; a+=n)
    s+= (a%d ? a + "/" + d : a/d) + " ";
  s+=b;
  return s
}

テスト例:

console.log(f(1,2,1,8)); //writes:
1 9/8 10/8 11/8 12/8 13/8 14/8 15/8 2

console.log(f(-3,3,4,7)); // writes:
-3 -17/7 -13/7 -9/7 -5/7 -1/7 3/7 1 11/7 15/7 19/7 3 

javascriptを使用した、再帰、ライブラリ、または関数型プログラミングなしの命令型アプローチ


1

Smalltalk – 89バイト

かつてSmalltalkはほとんど競争力があります!

Number extend[p:e q:i[|h|self to:e by:i do:[:x|h:=x. x printNl].h=e ifFalse:[e printNl]]]

このように呼び出します:

> 2 p:5 q:1/2
2
5/2
3
7/2
4
9/2
5

> 1 p:2 q:2/3
1
5/3
2

1

R-71バイト

MASSパッケージが既にインストールされていると仮定します

f=function(x,y,z)MASS::fractions(union(seq(x,y,eval(parse(text=z))),y))

> f(1, 2, '1/3')
[1]   1 4/3 5/3   2
> f(2, 5, '1/2')
[1]   2 5/2   3 7/2   4 9/2   5

1

パイレット、56バイト

{(b,e,n,d):link(e,map(_ / d,range(b * d, e * d))).sort()}

開始(b)、終了(e)、分子(n)、および分母(d)を取ります。整数の範囲を作成し、それらを分割し、リストに末尾を追加します(リンクしてから並べ替えます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.