配列内の最大数と最小数を見つける


29

タスク

タスクは非常に簡単です。整数文字列のみを含む配列を指定すると、最大数と最小数を出力します。

テストケース

Input: [1, 2, 3, 4, 5, 6, 7, 8]
Output: 1, 8

Input: [5, 4, 2, 9, 1, 10, 5]
Output: 1, 10

Input: [7, 8, 10, "Hello", 5, 5]
Output: 5, 10

文字列内の数値は整数と見なされません。

Input: [1, 2, 3, 4, "5"]
Output: 1, 4

整数が1つだけの場合、最大整数と最小整数の両方になります。

Input: [1]
Output: 1, 1

Input: ["1", "2", "3", "4", 5]
Output: 5, 5

ルール

  • 配列には常に少なくとも1つの整数が含まれると想定できます。
  • すべての整数は正(0より大きい)
  • 出力の順序は関係ありません。
  • これはであるため、バイト数が最小の提出が勝ちです!
  • 文字列には、印刷可能なすべてのASCII文字(32 - 126)を含めることができ、空ではありません。

入力で引用符を含む文字列はどのように表されますか?
feersum

@feersumそれはあなたの言語に依存しませんか?
マーティンエンダー

@feersumおそらくエスケープ文字を使用しますが、言語がそれを処理しない場合、それは大丈夫です。
アドナン

@MartinBüttner入力がstdinから取得される場合、使用される言語に依存するべきではありません。
feersum

3
@feersumそれは私にとって新しいです。でもSTDINから[1, 2, 3] 1 2 3{1; 2; 3}、それはSTDINから受け取った文字列リテラルのための任意の異なる必要があり、なぜ私は表示されませんので、すべての有効な入力フォーマットです。
マーティンエンダー

回答:


9

真剣に、9 6バイト

,ì;M@m

オンラインで試す

使い方

,                              Read list input
 ì                             Remove everything but numbers from it
  ;                            Make a copy
   m                           Extract its min value
    @M                         Extract the other one's max value
                               Implicit output (max then min)

ああ、はい、私はそのようなコマンドを探していました。しかし、ドキュメントの検索は簡単ではありません。
キントピア

同意する。ドキュメントは私の次の大きな目標です。
メゴ

11

JavaScript(ES6)、54 56

2バイト保存されたthx @Neilを編集

注:x===+x場合はtrueであり、唯一の場合は、x数あります

a=>[Math.max(...a=a.filter(x=>x===+x)),Math.min(...a)]

3
なぜアウターな()のですか?
ニール

@ニール何アウター()?なぜ地球上に()が必要なのですか?
edc65

これは関数を返しますが、それを呼び出す必要があります。(または単にa =>を削除)
マイケルセリオット

2
はい、それは匿名関数です。JavaScript @MichaelTheriot
edc65

@MichaelTheriot デフォルトでは、提出は常に完全なプログラムを必要とするのではなく、スタンドアロン機能にすることができます。
アレックスA.

8

Pyth、14 11 10バイト

hM_BS^I#1Q

オンラインでお試しください。 テストスイート。

説明

  • Q:評価された入力
  • #:上のフィルター:
    • I:後と同じ値:
      • ^…1 累乗1
  • S:それを並べ替える
  • _B:配列を作成 [previous, reversed(previous)]
  • hM:その各項目の最初の項目を取る

最も難しいのは、現在4バイトかかるストリングの除去をゴルフすることです。現在のアプローチ^<str>1は、シーケンスの最初のデカルトの力(基本的に、文字列の文字のリスト)を取得するために^<int>1機能しますが、単なる恒等関数です。


Hrm、*#_1Q文字列を削除するために使用することもできます。変数が負の値に初期化された場合、文字列は短くなります
...-FryAmTheEggman

7

Python 2、42バイト

Python 2では、比較中、整数は常に文字列よりもmin(s)小さいため、単純なものは最小の整数を見つけます。ただし、最大値を見つけるときは、最初に文字列を除外する必要があります。無名関数はシーケンスを受け入れ、最小値と最大値を持つタプルを返します。

lambda s:(min(s),max(x for x in s if''>x))

例:

[1,'77', 6, '', 4] -> (1, 6)

3
lambda a:その前に立ち往生する必要があります。
ドアノブ

if x>0またはif''>x1バイトを保存します。
-grc

@Doorknob、現在提案されているラムダ。
ロジックナイト

1
@デニス、私はこれを知りませんでした。ソリューションを編集して、比較がPython 2でのみ機能することを明確にしました。
Logic Knight

1
積み上げ:lambda s:(min(s),-min(-1*_ for _ in s))(39バイト)
フランボルチ

7

ゼリー、8バイト

|f¹Ṣ0,1ị

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

バックグラウンド

完全な世界では、リストをそれ自体のフラット化されたバージョンと交差させるだけで十分です。文字列はJellyの文字のリストにすぎないため、元のリストには整数と文字列が含まれますが、平坦化されたバージョンには整数と文字が含まれ、交差部分には整数のみが残ります。

現実の世界では、両方の入力と文字列リテラルのパーサの両方が得られた文字を代わりに長さ1の文字列の関数にシングルトン文字列を渡すための唯一の方法は、例えば、として「手動」、それをコード化するだろう、[”a]であり、これは配列にラップされた文字。

これにより、合計で7バイトのバイトが節約されますオンラインで試してみてください!)。

fFṢ0,1ị

これはおそらく受け入れられないので、文字と整数を区別する方法も必要です。

Jellyのビット単位の原子は、必然的に引数を整数に変換しようとします。それらは、深さ0のタイプ(数字または文字)に遭遇するまでベクトル化することから始め、それらを整数に変換しようとします。整数を表す文字の場合、これは成功します。その他の場合、二項ビット単位のアトムは単にあきらめて0を返します

たとえば、リスト[1, "2", "34", "-5", "a", "bc"]をそれ自体とビット単位で論理和すると、

[1, 2, [3, 4], [0, 5], 0, [0, 0]]

結果を元のリストと交差させることにより、元のリストに存在しなかった配列と整数を取り除きます。

使い方

|f¹Ṣ0,1ị  Main link. Input: A (list)

|         Bitwise OR the list A with itself.
 f¹       Filter the result by presence in A.
   Ṣ      Sort the resulting list of integers.
    0,1ị  Retrieve the elements at those indexes.
          Indices are 1-based and modular in Jelly, so 0 is the last (maximum),
          and 1 is the first (minimum).

6

Mathematica、20バイト

MinMax@*Select[#>0&]

テストケース

MinMax@*Select[#>0&]@{1,2,3,4,"5"}
(* {1,4} *)

1
なぜそこに*あるのですか?カットするだけで19に到達できるようです。
シモンズ

1
@ASimmons必要です。MinMax@Select[#>0&]有効な純関数ではありません。
njpipeorgan

1
@ASimmons @*は関数合成であり、@関数アプリケーションです。
マーティンエンダー

1
MinMax@Select[# > 0 &][{1, 2, 3, 4, "Hello", 5}]正しい応答が得られる
シモンズ

1
@ASimmons MinMax@Select[# > 0 &]シンボルに割り当てるか、単に評価してください。
njpipeorgan

6

ルビー、57 36 29バイト

ここの初心者、使用されているバイトを計算するための標準または普遍的に受け入れられた場所/方法があるかどうかはわかりませんが、助けていただければ幸いです!

マナトワークとドアノブのコメントに従って編集されました!

->n{(n.map(&:to_i)&n).minmax}

テスト

2.3.0 :076 > f=->n{[(n.map(&:to_i) & n).min, (n.map(&:to_i) & n).max]}
 => #<Proc:0x007ff7650ee868@(irb):76 (lambda)>
2.3.0 :077 > f[[7, 8, 10, "Hello", 5, 5]]
 => [5, 10]

1
36文字:->n{[(x=n.map(&:to_i)&n).min,x.max]}
マナトワーク

2
29バイト、minmaxを使用:->a{(a.map(&:to_i)&a).minmax}
ドアノブ

5

CJam、15 13バイト

{_:z&$2*_,(%}

スタック上の入力配列を期待し、その場所に出力配列を残す名前のないブロック(関数)。

すべてのテストケースを実行します。

説明

_     e# Duplicate.
:z    e# Map over list: a) take abs() of integer elements (a no-op) or b) wrap strings
      e# in an array.
&     e# Set intersection: only the integers will appear in both arrays.
$     e# Sort.
2*    e# Repeat array twice (to make the code work with single-integer input).
_,    e# Duplicate, get length N.
(%    e# Decrement, get every (N-1)th element, i.e. the first and the last.

私はe)とe(aditsuを拒否しました。彼はそれを受け入れませんでした
username.ak

@ username.akこれらは本当に役立つとは思いません。現在のソリューションで1バイトしか保存しない2文字の演算子を追加することは、aditsuが実装する可能性が高いものではなく、それらを使用するためのより便利な機能も必要だと思います。
マーティンエンダー

3バイト節約されます。 q~_e(ae)a+
username.ak

@ username.akまあ、それはそれを仮定してe(おり、e)文字列または何かを無視するでしょう。それは、文字列との比較を含むなかった場合、それはおそらくことを同じように失敗するだろう$e>、文字列と整数を比較することはできませんが。
マーティンエンダー

5

Haskell、41 39バイト

f x=[minimum,maximum]<*>[[i|Left i<-x]]

私は混在させることはできませんので、Haskellでは、リストのすべての要素は、同じ型でなければならないIntegerString。ただし、Either2つのタイプを1つのタイプに結合するタイプがあります。したがって、入力リストのタイプはEither Integer String1です。f整数をフィルタリングし、Eitherラッパーを削除し、リストを単一の要素として新しいリスト(例えば[[1,2,3]])に入れ<*>ます。これにより、最初の引数で指定された関数を適用できます。

使用例:f [Left 1, Left 3, Right "Hello", Left 2]-> [1,3]

編集:@xnorを使用<*>して2バイトを節約しました。ありがとう!


1実際にStringは、プロパティは使用されないため、2番目のタイプでは完全にポリモーフィックです。


パターンマッチを使用した素晴らしいアイデア。逆のマップで2つの文字を保存できますf x=[minimum,maximum]<*>[[i|Left i<-x]]
。– xnor

@xnor:とてもいい。どうもありがとう!
-nimi


4

Mathematica、28バイト

MinMax[#/._String->Nothing]&

私はまだあなたの強迫観念を理解してNothingいません...それは特別なことを意味するものではありません...また、23バイトの場合:MinMax@*Select[NumberQ]
LegionMammal978

@ LegionMammal978「すべての整数は正」を利用してください!私の答えをご覧ください。
-njpipeorgan

1
素敵なソリューションの皆さん、私はそれをそのようにすることを考えるべきでした!@ LegionMammal978にNothingは特別な意味があります。Mathematica 10.2以降、リストから自動的に削除されます。
シモンズ

@ LegionMammal978 Nothingは、最新バージョンで文書化された関数です。
Mr.Wizard


4

網膜、71

ゴルフの手助けをしてくれた@MartinBüttnerに(いつものように)感謝します。

ゴルフの面では競争力はありませんが、Retinaで整数バブルソートを実装するのは興味深いことです。

入力内のすべての文字列が"二重引用符で囲まれており、エスケープされた二重引用符が含まれていないことを前提としています\"

A`"
¶

\d+
$&$*a $&$*a
+`\b(a+) +\1(a+)\b
$1$2 $1
 +[a ]+ +

(a)+
$#1

入力は改行で区切られます。

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


<space>.*<space>欲のせいで最後から2番目の段階で使えると思います。
FryAmTheEggman

4

Mathematica、14

#&@@@MinMax@#&

例:

tests = {
   {1, 2, 3, 4, 5, 6, 7, 8},
   {5, 4, 2, 9, 1, 10, 5},
   {7, 8, 10, "Hello", 5, 5},
   {1, 2, 3, 4, "5"},
   {1},
   {"1", "2", "3", "4", 5}
 };

# & @@@ MinMax@# & /@ tests
{{1, 8}, {1, 10}, {5, 10}, {1, 4}, {1, 1}, {5, 5}}

説明:

ときにMinMax非数値の入力を取得し、それは、はるかにそれができるようにとの問題を軽減、その後に包まれた用語を残しMinMax

MinMax @ {7, 8, 10, "Hello", 5, 5}
{Min[5, "Hello"], Max[10, "Hello"]}

自動的に順序付けが行われるため、文字列は整数に従います。

Applylevelspec {1}、速記@@@、次いで非アトミック要素の最初の引数を引っ張るために使用されます。ここで5は触れていないことに注意してください:

foo @@@ {5, Max[10, "Hello"]}
{5, foo[10, "Hello"]}

3

Oracle SQL 11.2、189バイト

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i))FROM(SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i FROM DUAL CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2)WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

ゴルフをしていない

SELECT MIN(TO_NUMBER(i)),MAX(TO_NUMBER(i)) 
FROM  (
        SELECT REGEXP_SUBSTR(:1,'[^,]+',1,LEVEL)i 
        FROM   DUAL 
        CONNECT BY LEVEL<REGEXP_COUNT(:1,',')+2
      )
WHERE TRIM(TRANSLATE(i,' 0123456789',' '))IS NULL;

サブクエリは配列を解析して分割し、行ごとに1つの要素を持つビューを作成します。次に、非数値要素が除外されます。

LEASTとGREATESTでそれを行う方法を見つけられたらよかったのに、配列をパラメーターとして処理する方法がうまくいかないことを願っています。


[]配列の最初または最後の要素である場合、maxまたはminを選択しないように、配列に残します。また、WHERE句も必要ありません。すでに集計を選択しているので、フィルタリングする必要はありません。正規表現で数字を検索し、数値変換をサブクエリにプッシュすると(プッシュされた述語の危険性はほとんどありません)、126バイトになりますselect min(i),max(i)from(select to_number(regexp_substr(&1,'\d+',1,level))i from dual connect by level<=regexp_count(&1,'\d'))
ベン

+ここで2番目の正規表現にa は必要ありません。いくつかの余分な行を生成する(バイトを保存する)かどうかは関係ありません。ただし、数字だけで構成された文字列がある場合は、ここで無視しないことに注意してください。同じパッケージにオーバーロードされた関数が必要なため、まったくきれいではありません。
ベン

3

vimscript、25バイト

g/"/d
sort n
t.
t.
2,$-1d

はい、そうです、vimscript。

フォームへの入力を期待します

1
2
3
4
"5"

そして、フォームの出力

1
4

説明:

g/"/d    delete all lines that contain quotes
sort n   sort numerically
t.       duplicate the first line
t.       duplicate it again
2,$-1d   delete from line 2 to line (END-1)

単一の数値の入力のエッジケースを処理するには、最初の行を2回複製する必要があります。これは、最後のコマンドが到達したときに2行しかない場合に文句を言うためです。これは、最後のコマンドが2,1d後方範囲であるためです。


3

Perl 44 39 + 3 = 41バイト

@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"

-paフラグが必要です:

$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 5 4'
1 5
$ perl -pae'@a=sort{$a-$b}grep!/"/,@F;$_="@a[0,-1]"' <<< '1 2 3 4 "5"'
1 4

数バイトを削ってくれた@manatworkに感謝


どのPerlバージョンですか?:あなたの第二の例のために私は別の結果を得るpastebin.com/judJys5g
manatwork

@manatworkあなたは正しいです、図Iは削除できませんsort{$a-$b}grep...
-andlrc

要件は、出力が例のように正確にフォーマットされなければならないことを述べておらず、このタスクでは明らかにフォーマットがポイントではありません。私たちの多くは、選択した言語でより便利なものを使用しました。Perlでは、次のようにします$_="@a[0,-1]"
マナトワーク

1文字の短いフィルタリング:grep!/"/
マナトワーク

配列は数字と文字列になります。質問のすべての例は二重引用符で囲まれた文字列を使用していますが、一重引用符で囲むことができないと言っているものは見当たりません。の!/\D/代わりに!/"/もう1バイト必要です。
msh210

3

ジュリア、35バイト

x->extrema(filter(i->isa(i,Int),x))

これは、配列を受け入れ、整数のタプルを返すラムダ関数です。呼び出すには、変数に割り当てます。

Juliaにはextrema、配列の最小要素と最大要素をタプルとして取得するための組み込み関数があります。ただし、配列には文字列を含めることもできるため、最初にそれらを除外する必要があります。それを行うには、各要素がを使用して整数かどうかをテストしisaます。


3

Japt、23バイト

[V=Uf_bZÃn@X-Y})g Vw g]

オンラインでテストしてください!

使い方

[V=Uf_  bZÃ n@  X-Y})g Vw g]
[V=UfZ{ZbZ} nXY{X-Y})g Vw g]

UfZ{ZbZ}   // Filter out the items Z in U where Z.b(Z) is falsy.
           // For numbers, this the original number, which is always non-0 (non-falsy).
           // For strings, this returns Z.indexOf(Z), which is always 0 (falsy).
nXY{X-Y}   // Sort by subtraction. Small items move to the front, large to the back.
V=         // Set variable V to the resulting array.
)g Vw g    // Take the first item in V, and the first in V.reverse().
[       ]  // Wrap them in an array so both are sent to output.

3

Bash、40 31 30バイト

sort -n|sed /\"/d|sed '1p;$p;d'

行区切りリストが必要です:

$ echo $'5\n4\n2\n9\n1\n"10"\n5' | sort -n|sed /\"/d|sed '1p;$p;d'
1
9

数バイト削る@manatworkに感謝


sed '1p;$p;d'バイトを保存します。
デニス

3

PowerShell、53 36バイト

@($args[0]|?{$_-is[int]}|sort)[0,-1]

@goricのおかげで17バイト節約

OOOF ...通常、PowerShellはキャスティングで非常に高速でゆるい動きをします。これは通常、ゴルフには適していますが、ここでは痛いものです。

入力$args[0]を取得して、整数のみを選択し、パイプラインに沿って渡すWhere-Objectステートメント(?)にそれをパイプし、他のものはすべて破棄します。動的な再キャストはバックグラウンドでオンザフライで行われるため(たとえば、1+"5"返されるの6は完全に有効なPowerShell)、データ型を区別するために-is演算子を使用する必要があります。

そこから、コレクションをにパイプしSort-Object、整数を最小から最大にソートします。外側には、()我々が最初と最後の要素を参照することができるように必要である[0,-1](つまり、最小と最大)が、我々はまた、外側が必要な注意@の出力キャスト強制的にsort1つのオブジェクトのみが(あるかどうの結果として、配列としての?、または1つのオブジェクトのみ)の入力でした。


1
ここで-is型演算子を見てください。私はあなたが交換することができると思う.GetType().Name-eq"Int32"-is[int]17のバイトを保存する
goric

@goricすごい!大規模なゴルフをありがとう!
AdmBorkBork

3

MATL、23バイト

"@Y:tX%1)2\?x]N$htX<wX>

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

"       % implicitly input cell array. For loop that iterates on each cell
  @     %   push each cell
  Y:    %   cell's contents (either a number or a string)
  tX%   %   duplicate and push class. This will produce 'char'  or 'double'
  1)    %   get first letter: either 'c' or 'd'
  2\    %   is its ASCII code odd?
  ?     %   if so...
    x   %     delete (it's a string)
  ]     %   end if
  N$h   %   concatenate all stack into an array. This array will contain up to
        %   three numbers: minimum up to now, maximum up to now, new value (if any)
  tX<   %   duplicate. Push minimum
  wX>   %   swap. Push maximum.
        % implicitly end for
        % implicitly display stack contents

ああ、私の悪い:p。いい答え:)
アドナン

@Adnanありがとう!少し長すぎる:-)
ルイスメンドー

2

JavaScript(ES5)、105バイト

function a(b){m=Math;b=b.filter(function(c){return c===+c});alert(m.min.apply(m,b)+','+m.max.apply(m,b))}

使用法: a([1,2,3,'4'])

ちょうどしよう:)

「Ungolfed」:

function a(b){
  m=Math;
  b=b.filter(function(c){
    return c===+c
  });
  alert(m.min.apply(m,b) + ',' + m.max.apply(m,b))
}


2

Perl 6、25バイト

明らかな答えは、このWhateverCode lambdaです

*.grep(Int).minmax.bounds

完全なプログラムである必要がある場合

put get.words».&val.grep(Int).minmax.bounds

この完全なプログラムへの入力は、スペースで区切られた値のリストです


使用法

# give it a lexical name
my &code = *.grep(Int).minmax.bounds;

say code [1, 2, 3, 4, 5, 6, 7, 8];  # (1 8)
say code [5, 4, 2, 9, 1, 10, 5];    # (1 10)
say code [7, 8, 10, "Hello", 5, 5]; # (5 10)
say code [1, 2, 3, 4, "5"];         # (1 4)
say code [1];                       # (1 1)
say code ["1", "2", "3", "4", 5];   # (5 5)

say code []; # (Inf -Inf)

2

𝔼𝕊𝕄𝕚𝕟、16文字/ 20バイト

[МƲ(ï⇔⒡≔=+$⸩,МƵï

Try it here (Firefox only).

悪くない、悪くない...

説明

これにより、最大値と最小値の両方を含む配列が出力されます。(ï⇔⒡≔=+$⸩,基本的に、入力内のすべての文字列を除外し、入力МƲ内の最大値を取得し、МƵ取得し、最小値取得します。

ただ、注意:これは私が使用して取得最初の挑戦で基本的になり、ï⇔ï=ï


2

Python 3、56バイト

lambda x:[m(t for t in x if str(t)!=t)for m in(min,max)]

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


2

APL(Dyalog)、13バイト

(⌊/,⌈/)⎕AV~⍨∊

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

 enlist(平坦化-これにより、すべての文字列が大きなリストの文字になります)

⎕AV~⍨AトミックVセクター 内のすべての文字を削除します(文字セット-数字を残します)

() 次の暗黙関数を適用します。

⌊/ 最小最小

, に追加

⌈/ 全体の最大値


2

Java(OpenJDK 8)、124バイト

a->{int s[]={0,0},t;for(Object i:a)try{t=(int)i;s[0]=s[0]<1|t<s[0]?t:s[0];s[1]=s[1]<t?t:s[1];}catch(Exception e){}return s;}

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

Java 8ラムダ関数、配列を入力として受け取り、配列を提供 {min, max}。。入力は整数配列でなければならないため、競合しません。

Kevin Cruijssenのおかげで修正され、-1バイト


オブジェクトのリストを取得し、アイテムが整数または文字列であるかどうかを確認することにより、この競合を行うことができます。
ケビンCruijssen

@KevinCruijssen完了、ありがとう
HyperNeutrino

<i整数キャストなしでエラーが発生するようになりました。また、最初のコード(およびこのコードも)は機能しません。min常に出力さ0れるためminです。修正方法は次のとおりです。EDIT:のtry-catchは、1バイト短くなるように思われるよりもif(i instanceof Integer)
ケビンCruijssen

@KevinCruijssenああ、気づかなかった、ありがとう!
ハイパーニュートリノ

1

Jolf、20バイト

私はおそらくこれをゴルフすることができます...私はタイプチェックの短いソリューションを実装する必要があります。

γ fxd='nF~tH0ͺZkγZKγ
 _fx                 filter the input
    d='nF~tH0        checking for number type
γ                    call that "γ"
             ͺ       pair
              ZkγZKγ  the min and max of the array
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.