max()は十分ではありません


18

イントロ

友人が今日、この質問をわずかに異なる方法で提起しました-「1つの[Python]コマンドで整数の最大値を決定し、それらが等しくないことはできますか?」

「単一のコマンド」の合理的な定義内でこれを行う方法を見つけることができませんでしたが、私はそれがゴルフにとって楽しい問題であると思いました。

 チャレンジ

" 整数のリストの中で最大のものを返しますif-and-only-ifがすべて等しくない場合。 "

すなわち:

整数のコンマ区切りリストのみを含む文字列が与えられた場合:

  • それらがすべて等しい場合、何も返さない/出力する
  • そうでない場合は、最大値を返す/出力する

ルール

  • 入力は整数の唯一のカンマ区切りリストを含む文字列でなければなりません
  • 出力は、入力であるとして表さ、どちらか何も(いかなる種類の出力)、または他の入力から最大の要素である必要があります

エントリは、完全なプログラムでも機能でもかまいませんが、テストする方法を提供します。

仮定

  • 入力リスト要素は1桁以上で、(2 32 − 1)以下であると仮定します
  • 入力リストに含まれる要素が100万を超えないと仮定する
  • 入力に負の値が含まれないと仮定する
  • 入力が空になることはないと仮定する

疑念を避けるために、「より具体的に」の直後に与えられる課題の説明は、その上の課題の記述に優先します(「最大値を返す...」)。

 例

(1)すべて等しい:

Input: 1,1
Output:

(2)異なる:

Input: 1,2
Output: 2

(3)ゼロ!:

Input: 0,0,0,0,0,0,0,1,0,0
Output: 1

(4)ランダム:

Input: 7,3,8,4,8,3,9,4,6,1,3,7,5
Output: 9

(5)大きい番号、大きいリスト:

Input: 627,3894,863,5195,7789,5269,8887,3262,1448,3192
Output: 8887

追加の例:

(6)すべて等しい、より大きなリスト:

Input: 7,7,7,7,7,7,7,7,7
Output:

(7)すべて等しい、より大きなリスト、より大きな数:

Input: 61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976,61976
Output:

(8)等しくない、より大きなリスト、より大きな数:

Input: 96185,482754,96185,96185,96185,96185,96185,96185,7,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,96185,961185,96185,96185,96185
Output: 961185

得点

これはcode-golfですので、バイト数が最も短いコードが勝ちです!


3
リストにすべての等しい値が含まれているときにエラーをスローしても大丈夫ですか?また、None何も出力せずにnull値(Python など)を出力できますか?また、なぜ入力はリストではなく文字列でなければならないのですか?そして、あなたは何を意味するか、入力から最大の要素、それが入力であるとして表さ
DJMcMayhem

15
入力要件を緩和して、整数の配列/リストも許可することをお勧めします。リストに少なくとも2つの要素が含まれることが保証されていますか?すべての整数が等しい場合、何の代わりに一貫した非数値を出力できますか?
シャギー

15
のように、最大​​値が複数回発生するテストケースを追加してください7,3,7,2
nimi

3
要素が1つだけのテストケースを作成できますか?また、,入力に末尾を含めることはできますか?
ジョーキング

2
情報:この課題はサンドボックス化されました。/// OPの場合:サンドボックスはかなり非アクティブですが、(私は思う)それは小さな問題にすぎません。問題は、チャレンジの一部の問題は、チャレンジを読み取るだけでは明らかではなく、実際に解決したときにのみ発見できることです。
user202729

回答:


8

R50 37バイト

digEmAllのおかげで-33バイト!rturnbullのおかげで-13バイト!

x=scan(se=",");if(any(diff(x)))max(x)

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


残念ながら、入力(現在)文字列にする必要があります。
シャギー


以前のリンクが間違っていたと思います!これは正しいはずです。digEmAllのアイデアと、投稿するつもりだったアイデアを組み合わせて...-
ジュゼッペ

3
配列の等価性をテストする方法を改善することにより、37バイト
rturnbull

5

MathGolf、5バイト

è▀s╞╙

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

説明

è      Read whole input as int array
 ▀     Get unique elements
  s    Sort list
   ╞   Discard from left of array
    ╙  Get maximum of list

これは、max演算子と左からの破棄演算子の両方が空のリストに対して何もしないために機能します。まあ、max演算子はリストを削除し、空のリストには何もプッシュしません。

入力をリストとして取得できる場合、4バイトになります。


入力はコンマ区切りの文字列でなければなりません。
シャギー

1
@Shaggy私はそれを見逃した。現在、MathGolfには「文字で分割」演算子がありません。そのため、正しく処理するには多少の手間がかかります。私は何ができるか見ていきます。
maxb

5

Perl 6の26の23 22バイト

nwellnhofのおかげで-1バイト

{.max if .Set>1}o&EVAL

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

すべてが等しい場合、空のスリップを返します。

説明

                o&EVAL  # Eval the string to a list of integers
{              }         # Pass to code block
 .max            # Return the max
      if .Set>1  # If the list converted to a set has more than one element

1
EVALトリックはきちんとしているとあなたもでバイトを保存することができますo&EVAL
nwellnhof

動作しませんif +.Setか?
ヴェン

@Venいいえ、Setに複数の要素があるかどうかを確認する必要があります。
ジョーキング

Mh、およびビット単位の〜は、Perl 6で2バイトです:(
ベン

5

ゼリー、4 バイト

ḟṀE?

必要な出力を出力するコマンドライン引数(引用符なし)として入力を受け入れる完全なプログラム

(それが扱うことに注意してください:のような空の入力、のような単一のアイテムの入力、7そして7,8,7仕様のような複数のアイテムの入力は現在必要と思われる。)

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

どうやって?

ḟṀE? - Full program: if one argument is present it is evaluated using Python
     -                 so 7,8,7 -> [7,8,7], while 7 -> 7
ḟṀE? - Main Link: list or integer OR no argument (in which case an implicit argument of 0)
   ? - if...
  E  - ...condition: all equal? (for any integer E yields 1 since the argument is
     -                           treated as a list like [integer])
ḟ    - ...then: filter discard (since it's undefined the right argument is implicitly 
     -                          equal to the left; both are treated as lists, so this
     -                          yields an empty list)
 Ṁ   - ...else: maximum (again an integer is treated as a list)
     - implicit print (Jelly's representation of an empty list is an empty string
     -                 furthermore no newline is printed in either case)

4

APL(Dyalog Classic)、6バイト

⍪⌈/~⌊/

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

行列()に変換された最小()なしで最大()を計算する列車⌈/~⌊/

入力に個別の要素が1つだけ含まれている場合、⌈/~⌊/空になり、、何もレンダリングしない0×1マトリックスを返します

それ以外の場合、⌈/~⌊/1要素ベクトルになり、最大値を含む1x1行列(スカラーと視覚的に区別できない)になります




3

パイソン242の 41バイト

a=input();print('',max(a))[len(set(a))>1]

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


PPCGへようこそ:) Pythonはわかりませんが、リストとして入力する必要があるようです。残念ながら(そして不必要に、私の意見では)仕様は(現在)入力が文字列でなければならないことを非常に明示しています。
シャギー

@Shaggy、入力がの形式の場合、このプログラムは機能しますelement, element, ...。つまり、角括弧で囲む必要はありません。
アーナブボルボラ18年

1
リスト機能inputしますが、Python 2ではデフォルトでevalsdinから渡される文字列が何であれ、必須ではありません。
アルナフボルボラ18年

1
40バイト。1つの要素のリストの末尾を持つことができるかどうかはわからない,あなたのソリューションエラー以来、けれども入力が1つだけの数の場合
ジョー・キング

2
@JoKing 入力が空になることはないので、!=aに変更できなかった理由はあり>ますか?
nedla2004

3

Haskell77 75 61バイト

f.read.('[':).(++"]")    
f a=[0|any(/=a!!0+0)a]>>show(maximum a)

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

('[':).(++"]")文字列(例"1,2,1,3":)を取り、ブラケット文字("[1,2,1,3]")で囲みます。次にread、文字列を整数のリスト([1,2,1,3])に変換します。

結果の1つが空のリストである場合、関数fこのヒントを使用して、より短い条件付けを行います。any(/=a!!0+0)aリストaに最初の要素と等しくない要素が含まれているかどうかをチェックしますa!!0。(数値のリストを探す+0必要があるreadことを知っているために必要です。)すべての要素が等しい場合、このテストは結果としてFalse空の文字列を返します。そうでなければshow(maximum a)、文字列に変換されたリストの最大値であるが返されます。


@nimi指摘してくれてありがとう!
ライコニ

3

赤、81バイト

x: split input","forall x[x/1: load x/1]sort x: unique x if 1 <>length? x[last x]

Rソリューションのように、コードの膨大な部分が入力文字列「1,1,2,44,1」を処理しています。それをブロックとして持つことができる場合、例えば:x: [1 1 2 44 1]、41バイトでそれを行うことができます:

sort x: unique x if 1 <>length? x[last x]

4
PPCGへようこそ!通常、ソリューションを検証するためにインタープリターへのリンクを要求し、MODの1つであるDennisがオンラインで試してみます!まさにそのような目的のために!それはあなたのためにあなたの答えをフォーマットします!ここで過ごした時間をお楽しみください!
ジュゼッペ

sort x: unique load replace/all input","" "if 1 <>length? x[last x]67バイト。残念ながらinputTIOでは機能しません。ファンクにすると、TIOでうまく機能します
ガレンイワノフ

3

APL(Dyalog Unicode)、12バイト

完全なプログラム。stdinからのストリングのプロンプト。

{1≠≢∪⍵:⌈/⍵}⎕

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

 式のプロンプトと評価(コンマを使用して数値をリストに連結します)

{} 次の匿名ラムダを適用します(引数です;数値のリスト):

1≠ [if] 1は…とは異なります

 集計

 の一意の番号…

 リスト

: それから

⌈/ 全体の最大値を返します(点灯、最大削減)

 リスト

 [その他:何もしない]


ここで1≠≢∪は、引数が同じ数の繰り返しではないリストである場合にのみ検出されるため、1 1 1または22ではありません。したがって、1≠≢∪11 2 3 3は、3が一意でなくてもtrueを返し、それがtrueの場合、最大3を返します(出力を返さない場合でも)。私のエラーはどこにありますか?または、可能性のある ':'には別の意味があります
RosLuP

@RosLuP繰り返しがあっても、最大数の繰り返しがあっても、最大値を印刷する必要があります。リストに一意の番号が1つだけある場合にのみ、何も印刷しません。OPの最後の例を見てください。
アダム

はい、問題を間違って理解しました...ありがとう
-RosLuP

これは機能しますか?⌈/~⌊/
ngn

@ngnいいえ、すべての要素が等しい場合、改行を出力します。
アダム

3

JavaScript(Node.js)、49/53バイト

を使用した元のバージョン.every()、53バ​​イト

''を返す関数は出力なしとしてカウントされますか?確かにこれは改善することができます...

s=>(a=s.split`,`).every(e=>a[0]==e)?'':Math.max(...a)

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


使用して改良版Set()シャギー、49のバイト

s=>new Set(a=s.split`,`).size>1?Math.max(...a):``

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



@Shaggyいいね!私はSetを使い始めましたが、それほど短くはできませんでした
Chris M



2

Japt、16バイト

不必要に厳密な入力形式でない場合、これは9になり、エラーをスローすると何も出力しないとカウントされる場合は7

文字列に少なくとも2つの整数が含まれていると仮定します。

q, mn
â ÊÉ?Urw:P

それを試してみてください


2

Common Lisp、102バイト

(lambda(x &aux(c(read-from-string(concatenate'string"#.`("x")"))))(or(apply'= c)(princ(apply'max c))))

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

サイズは主にデータの入力によるものです。入力を通常のリストとして使用すると、長さは46バイトに短縮されます。

(lambda(x)(or(apply'= x)(princ(apply'max x))))

2

XPath 3.1、54バイト

入力文字列をコンテキスト項目として:

let$t:=tokenize(.,',')!xs:int(.)return max($t)[$t!=$t]

コンテキストで「xs」より短いプレフィックスをXMLスキーマネームスペースにバインドできるようにする場合、1文字減らすことができます。

説明:入力文字列を受け取り、「、」セパレータでトークン化し、xs:int()各トークンに適用して整数に変換し、シーケンスの最大値を計算し、述語$t!=$tが真である場合に最大値を出力します。AとBがシーケンスの場合、A!=Bある場合、アイテムのペア(AからB、BからB)がある場合はtruea!=b

入力がコンマ区切りの文字列ではなく整数$ sのシーケンスとして提供できる場合、解は次のようになります。

max($s)[$s!=$s]

(15バイト-簡潔にするために意図的に設計されていない言語では、これが最短のソリューションになる可能性があります)

:これは、「入力にそのまま表示される」という要件を満たしません。入力に先行ゼロまたはプラス記号が付いた整数がある場合、これらは失われます。それは他の多くのソリューションにも当てはまると思います。


2

K438の 35バイト

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}

テストケース:

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"1,2,4,4"
,4
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"4,4,4,4"
q)
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,3,8,4,8,3,9,4,6,1,3,7,5"
,9
q)k){$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}"7,7,7,7,7,7,7,7,7,7,7,7,7"
q)

私はTiOで利用可能なkバリアントのいずれにもあまり流ではないので、利用可能なオンライン例はありませんが、1つを考えてみます

説明

特定の操作が他の操作よりも先に実行される理由を知りたい場合、K4は演算子の優先順位を持たず、代わりに右から左に解釈します(優先順位に括弧を使用できます)。セミコロンで区切られた式。

   $[expr;`True;`False] is the conditional format

{$[1=#:t:?:(7h$","\:x)-48;;*:t@>t]}
               ","\:x                 //split string on commas
            7h$                       //cast strings to long
                      -48             //they'll be from ascii format, so compensate
         ?:                           //get distinct list      
       t:                             //set list to variable t        
     #:                               //get count of t
   1=                                 //check if count t = 1
                         ;;           //return nothing if true
                             t@>t  //if false, sort t descending
                           *:         //return first value

おそらく、その場しのぎの最大機能を最後に使用しなければならないというファンではなく、もっとゴルフダウンすることができます。

編集:出力のコンマに問題がある場合は、さらに2バイトで修正できます。

q)k){$[1=#:t:?:(7h$","\:x)-48;;*:,/t@>t]}"1,2,4,4"
4
                                 ,/                 //joins the single element lists into one

合計を40 37にしますが、数字の前のカンマは、アトムではなく単一の要素リストであることを意味します。


2

PHP(<= 5.6)64 74バイト

 echo array_count_values($a=split(',',$argn))[$m=max($a)]==count($a)?'':$m;

パイプとして実行-nRまたはテストするオンラインでます

splitPHP7で削除されましたが、いくつかの問題を修正するために10を追加する必要があったため、代わりに使用する価値がexplodeありました。


Also this doesn't work when there are more than one element with the max value 私はmissread If they are all equal, return/output nothingされるようにIf they are equal, return/output nothingもっとして一つの出力に空があるかどうかを意味しています。==count($a)修正を追加します。array_count_values配列に出現する回数をカウントするため、それが配列内の要素の合計量に等しい場合は、出力 ''それ以外の場合は最大値を出力します
ArtisticPhoenix

1
@JoKing-事前に宣言された変数を介して入力を受け取るべきではありません-stdinから取得することで修正$argnされました(これは複数のゴルフの回答で使用されています)私だけでなく他のユーザーの例を挙げることができます。
ArtisticPhoenix


2

05AB1E9 8 バイト

',¡ZsËiõ

@Cowabungholeのおかげで-1バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

',¡        '# Split the (implicit) input by ","
   Z        # Push the maximum (without popping the list)
    s       # Swap so the list is at the top of the stack again
     Ëi     # If all elements are equal:
       õ    #  Push an empty string ""
            # (Implicitly output the top of the stack to STDOUT as result)

1
プリティ同様のソリューションがありますが、実行して他のを避けることができる',¡ZsËiõ1バイトの保存、
Cowabunghole

@Cowabungholeスマート、ありがとう!
ケビンCruijssen

1

Python 2、44バイト

k=eval(input())
if~-len(set(k)):print max(k)

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


私は推測しているevalPythonでリストにカンマ区切りの文字列に変換?
シャギー

1
はい; より正確にはタプル(不変リスト)。入力が文字列でない場合(つまり、TIO入力セクションで引用符を省略した場合)、k=input()同じ結果を使用して取得できます。
チャスブラウン


1

、15バイト

≔I⪪S,θ¿›⌈θ⌊θI⌈θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔I⪪S,θ

入力をコンマで分割し、各値を整数にキャストします。

¿›⌈θ⌊θ

最大値が最小値より大きいかどうかをテストします。

I⌈θ

その場合、最大値を文字列にキャストして印刷します。


1

Mathematica、43バイト

If[!Equal@@#,Max@#]&@@#~ImportString~"CSV"&

純粋な機能。カンマ区切りの文字列を入力として受け取り、数値またはを返しますNullNullグラフィカルに表示されないため、これは有効だと思います。


1

C(gcc)、91バイト

M(s)char*s;{long m=atol(s),o,l=0;for(;s=strchr(s,44);o<0?m-=o:0)l|=o=m-atol(++s);s=l?m:-1;}

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

デゴルフ

M(s)char*s;{
    long m=atol(s),o,l=0; // Read the first integer from string
    for(;s=strchr(s,44); // Advance pointer to next ','
           o<0?m-=o:0) // End of loop: if difference <0, deduct from max, increasing it to new max.
        l|=o=m-atol(++s); // Read next number, and subtract it from current max. 
                          // Bitwise-OR the difference into the l-variable
    s=l?m:-1; // End of function: if l is non-zero, there were at least two different values.
              // Return -1 if l is zero, otherwise the max value.
}

提案M(char*s)の代わりM(s)char*s;index()代わりにstrchr()
ceilingcat

1

Pyth、7バイト

Itl{QeS

オンラインでお試しください!
すべてのテストケース(出力フォーマットを改善するためのわずかに異なるコード)

PythはPythonに基づいているため、ユーザー入力は常に文字列として解釈され、次に文字列が渡されます eval()ます。すべてのPythプログラムが自動的に実行されますQ=eval(input())は、最初の命令としてれます。

説明:
Itl{QeS  | Full code
Itl{QeSQ | with implicit variables filled
---------+-------------------------------
I        | If
 t       | one less than
  l      | the length of
   {Q    | the deduplicated input
         | is truthy (!=0),
         | print
     e   | the last element of
      SQ | the sorted input

1

Java(JDK)、101バイト

d->{long m=0,c=-1,b;for(var s:d.split(",")){b=new Long(s);c=c<0|c==b?b:0;m=b>m?b:m;}return c>0?"":m;}

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

説明した

d->{                            // Function taking a String input
    long m=0,c=-1,b;            // Initialise variables
    for(var s:d.split(",")){    // Split by comma and loop over elements
        b=new Long(s);          // Parse String to Long
        c=c<0                   // If c<0 (i.e. this is the first element)
            |c==b               // ...or c is equal to the current element
            ?b                  // Set c to the current element (all elements are the same so far
            :0;                 // Otherwise set c to zero to denote that list is not all same element  
        m=b>m?b:m;              // Set m to max of b and m
    }
    return c>0?""               // If c is not zero then all elements are the same, return nothing
                 :m;            // Else return max element
}

ボーナスソリューション!

最善の努力にもかかわらず、正規表現とストリームを使用してこのソリューションを105バイト未満にすることはできませんでしたが、その優雅さが本当に気に入ったので、名誉の言及をしなければなりませんでした。

d->d.matches("(.+?)(,\\1)+")?"":java.util.Arrays.stream(d.split(",")).map(Long::new).reduce(0L,Long::max)

正規表現(マイナス記号?)と通常のループとリターン(ストリームの代わり)の組み合わせを使用した100バイト
ケビンCruijssen


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