最も高い一意の数字を見つける


33

驚くべきことに、私たちは単純な「最高位の数字を見つける」チャレンジをまだしていませんでしたが、それは少し簡単すぎると思います。

負でない整数の入力が与えられた場合、整数で見つかった最も高い一意の(つまり、繰り返されない)数字を返します。一意の数字がない場合、プログラムは何でもできます(未定義の動作)。

入力は、単一の整数、文字列、または数字のリストとして取得できます。

テストケース

12         -> 2
0          -> 0
485902     -> 9
495902     -> 5
999999     -> Anything
999099     -> 0
1948710498 -> 7

これはので、各言語で最少のバイト勝ちます!


2
代わりに文字列として入力を取得できますか?
クリチキシリソス

3
最後のテストケースを考えると、私たちは...(先行ゼロは整数で表現できない)文字列として入力を取ることを余儀なくされていると思います
レオ

@Leoは実際には私の悪いことで、基本的にキーボードの数字をマッシュアップし、先頭のゼロに気付かなかった。しかし、はい、入力は文字列として取ることができます
-Skidsdev

25
@Adám "undefined behaviour"は、一般に、バイトを節約できる場合はvoidから名前のないホラーを呼び出すなど、何でもできることを意味します。
マーティンエンダー

22
@MartinEnder実際、コードが一意の数字がないときにcthulhuを正常に呼び出した場合、バイトの50%を喜んでノックします;)
Skidsdev

回答:


16

05AB1E4 3バイト

数字リストが有効な入力であることを通知するMr. Xcoderのおかげで1バイト保存されました。

¢ÏM

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

説明

¢     # count occurrences of each digit in input
 Ï    # keep only the digits whose occurrences are true (1)
  M   # push the highest

05AB1Eで待ってください、それは真実で2はありません。だけ1?:o
HyperNeutrino

@HyperNeutrino:正しい!
エミグナ

2
それは非常に便利で非常に面倒です...それは興味深いです:o:D
HyperNeutrino

@HyperNeutrino:それはしばしば便利ですが、多くの言語が正の整数または空でない文字列を返すことができる場合、チャレンジが真実の値を返すと言う場合、それは不利になる可能性があります。
エミグナ

以下のため数に取り消し線があるではない見やすいです!
-MrZander

15

Python 3、40バイト

movaticaのおかげで2バイト節約されました

lambda i:max(x*(i.count(x)<2)for x in i)

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

42バイト

文字列と数字のリストのパラメータタイプの両方で機能します。固有の数字がない場合にエラーをスローし、その仕様の不正使用の種類:

lambda i:max(x for x in i if i.count(x)<2)

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


説明

  • lambda i: -文字列または数字のリストパラメータiでラムダ関数を宣言します。
  • max(...) -ジェネレーターの最大値を見つけます。
  • x for x in i-の文字/数字を反復処理しiます。
  • if i.count(x)<2 -数字が一意かどうかを確認します。

40バイト:lambda i:max(x*(i.count(x)<2)for x in i)
movatica

1
@movaticaありがとう!
Mr Xcoder

8

アリス、15バイト

/&.sDo
\i-.tN@/

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

説明

/...
\.../

これは、完全に順序モードで動作する線形コードのシンプルなフレームワークです(つまり、このプログラムは文字列処理によって完全に機能します)。展開された線形コードは次のようになります。

i..DN&-sto@

それが何をする:

i    Read all input as a string.
..   Make two copies.
D    Deduplicate the characters in the top copy.
N    Get the multiset complement of this deduplicated string in the input.
     This gives us a string that only contains repeated digits (with one
     copy less than the original, but the number of them doesn't matter).
&-   Fold string subtraction over this string, which means that each of
     the repeated digits is removed from the input.
s    Sort the remaining digits.
t    Split off the last digit.
o    Print it.
@    Terminate the program.

-1 は、一意の数字がない場合voidから名前のない恐怖を呼び出しません」。;)(読む:+1、いつものように素晴らしい答え。)
ケビンクルーッセン

1
@KevinCruijssen試しましたが、バイトを節約できませんでした。たぶんダーク ...もっと適切な言語であるかもしれない
マーティン・エンダー


7

18 12バイト

Fχ¿⁼№θIι¹PIι

オンラインでお試しください!(詳細バージョンへのリンク)

解決策が見つからない場合は何も出力しません。秘Theは、forループが入力文字列内のすべての一意の番号を印刷することですが、カーソルを移動せずに、最終的な解決策が見つかるまで値が再印刷し続けることです。

前のバージョンでは、解決策が見つからなかったときに文字A〜Zが出力されたため、コメントが次のようになりました。

AααFχA⎇⁼№θIι¹Iιααα

オンラインでお試しください!(詳細バージョンへのリンク)


3
それは興味深い未定義の動作です:)
エミナ

これはフィンランド語のように聞こえます:D
fedorqui

2
@fedorquiよろしくお願いします!ええ、しかし、チャコールはゼリーやO5AB1Eよりも学習しやすく、ASCIIアートゲームで使用する方が面白いです。:-)
チャーリー

7

、7バイト

→fo¬hgO

オンラインでお試しください!(テストスイート、一意の数字がないため、最後のテストケースでクラッシュします)

これは、ポイントフリースタイルの関数の組み合わせです(引数はどこにも明示的に言及されていません)。入力を受け取り、出力を文字列として返します。これは、Huskでは文字のリストに相当します。

説明

Test case: "1948710498"

      O    Sort:                             "0114478899"
     g     Group consecutive equal elements: ["0","11","44","7","88","99"]
 fo¬h      Keep only those with length 1*:   ["0","7"]
→          Take the last element:            "7"

*長さ1のチェックは、リストの先頭(最後の要素を除くすべての要素)を取り、それを無効にします(空のリストは偽であり、空でないリストは真実です)。


7

Haskell、37バイト

f s=maximum[x|x<-s,[x]==filter(==x)s]

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

使い方:

  [  |x<-s   ]          -- loop x through the input string s
    x                   -- and keep the x where
     [x]==filter(==x)s  -- all x extracted from s equal a singleton list [x]
maximum                 -- take the maximum of all the x

7

R、41バイト

function(x,y=table(x))max(names(y[y==1]))

整数または単一の文字列として数字のリストを受け取る匿名関数。y関数の本体に中括弧を使用しないように、オプションの引数として事前計算します。数字を文字列として返します。これは、他のRの回答とは少し異なるアプローチを取り、最小の短いものになります!私のコメントは結局間違っていたようです...

table(文字列として)のnames(table(x))一意の値で、リスト内の各要素の出現を計算xします。数字は幸運にも数字と同じように辞書式に順序付けられているため、まだ使用できますmax

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


いいね!何かをtableすることが短くなるとは思っていませんでした(そしてnames、仕事を始める方法を思い出せません)。
aPaulT

1
<2別のバイト用。カウントにゼロがあってはなりません。
-MickyT

1
y=table(scan());max(names(y[y<2]))数バイト短くなります。
-JAD

6

JavaScript(ES6)、46 41 40バイト

入力を文字列として受け取ります。一意の数字がない場合、RangeErrorを返します。

s=>f=(i=9)=>s.split(i).length-2?f(--i):i

リック・ヒッチコックのおかげで-7バイト

シャギーのおかげで-1バイト

テストケース


39バイトのアラートを削除します (s,i=9)=>s.split(i).length-2?f(s,--i):i。42バイトのスタックオーバーフローを回避できます (s,i=9)=>s.split(i).length-2?i&&f(s,--i):i
リックヒッチコック

カリー化でバイトを保存し、s=>g=(i=9)=>s.split(i).length-2?g(--i):i次のように呼び出しますf("12")()
シャギー



4

9 8バイト

同じバイトカウントで少しすっきりしたソリューションを提案してくれたLeoに感謝します。

▲‡ȯf=1`#

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

説明

  ȯ       Compose the following thre functions into one binary function.
      `#  Count the occurrences of the right argument in the left.
    =1    Check equality with 1. This gives 1 (truthy) for values that 
          appear uniquely in the right-hand argument.
   f      Select the elements from the right argument, where the function
          in the left argument is truthy.
          Due to the composition and partial function application this
          means that the first argument of the resulting function actually
          curries `# and the second argument is passed as the second
          argument to f. So what we end up with is a function which selects
          the elements from the right argument that appear uniquely in
          the left argument.
 ‡        We call this function by giving it the input for both arguments.
          So we end up selecting unique digits from the input.
▲         Find the maximum.  

1
¬←もっと単純に=1、同じバイト数である可能性があります:)
レオ

1
@Leo Ahそう、カレーがカッコなしで機能するかどうかをテストするのが面倒だった。型推論をもっと信頼する必要があります。;)
マーティン・エンダー

4

Mathematica、41バイト

(t=9;While[DigitCount[#][[t]]!=1,t--];t)&

ありがとう@Martin Ender

ここに私の答えに対するマーティンのアプローチがあります

Mathematica、35バイト

9//.d_/;DigitCount[#][[d]]!=1:>d-1&

4

R、45 43バイト

function(x)max(setdiff(x,x[duplicated(x)]))

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

入力を整数のベクトルとして受け取ります。重複した要素を見つけて削除し、最大値を取得します。(-Inf一意の最大値がない場合、警告を返します。)

コメントごとに匿名関数に編集されました


max(x[!duplicated(x)])かなり短いですが、これは素晴らしい答えです。自分のやり方がこれほど良くないことは知っていました。またf=、匿名関数は完全に有効な答えなので、最初から削除することもできます。また、この形式を使用する場合は、TIOを使用して機能をテストできます。オンラインで試してください!
ジュゼッペ

ありがとう!「重複」機能は重複要素の最初の出現をカウントしないため、バージョンは機能しません
-aPaulT

ああ、良い点。私はほとんど使用しませんduplicatedが、実際には別の短い答えを考えました!
ジュゼッペ


3

APL(Dyalog Unicode)、10文字= 19バイト

方法:複数回出現する要素にゼロを掛けてから、最も高い要素を細かくします。

⌈/×∘(1=≢)⌸

 引数内の各一意の要素とそのインデックスに対して:

× 一意の要素を乗算します

∘() と:

  1= 等しいかどうかのブール値

   インデックスの集計(一意の要素が発生する回数)

⌈/ その最大

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

APL(Dyalog Classic)、15バイト

⌈/×∘(1=≢)⎕U2338

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

上記と同じですが、の⎕U2338代わりに使用します


3

Bash + coreutils、30 28バイト

- デジタル外傷のおかげで2バイト

fold -1|sort|uniq -u|tail -1

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


Bash + coreutils、20バイト

sort|uniq -u|tail -1

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

入力が1行に1桁の数字のリストとして与えられている場合、フォールドステージをスキップできます。それは不正行為のように感じます。


置換grep -o .fold -1て2バイトを節約します。数字のリストとして与えられた入力整数がルールを広げすぎていることに同意します。
デジタル外傷

bashであるという理由だけで+1
Anush


3

C#(.NET Core)27 97 86 58 57 75バイト

using System.Linq;

n=>n.GroupBy(i=>i).Where(i=>i.Count()<2).Max(i=>i.Key)-48

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

ありがとう@CarlosAlejo


これは、入力として「1948710498」では機能せず(「7」ではなく「9」を返す)、using System.Linq;バイトカウントに追加する必要があります。
チャーリー

@CarlosAlejoおっと!ごめんなさい!仕様をすべてお読みください。ソリューションをすぐに編集します。
-kakkarot

編集済み。最適化できることはありますか?
-kakkarot

確かOrderBy(...).Last().OrderByDescending(...).First()、たとえば、の代わりに使用してみてください。あるいは、最後の部分を句の.Max(i=>i.Key)後で変更してくださいWhere
チャーリー

@CarlosAlejoありがとう!編集済み。
-kakkarot

2

JavaScript(ES6)、52 50バイト

入力を数字のリストとして受け取ります。0一意の数字がない場合に返します。

s=>s.reduce((m,c)=>m>c|s.filter(x=>x==c)[1]?m:c,0)

テストケース


2

Japt12 11 10バイト

入力を数字の配列として受け取ります。

k@¬èX ÉÃrw

試して


説明

     :Implicit input of array U.
k    :Filter the array to the elements that return false when...
@    :Passed through a function that...
¬    :Joins U to a string and...
èX   :Counts the number of times the current element (X) appears in the string...
É    :Minus 1.
     :(The count of unique digits will be 1, 1-1=0, 0=false)
à   :End function.
r    :Reduce by...
w    :Getting the greater of the current element and the current value.
     :Implicit output of resulting single digit integer.

2

Java(OpenJDK 8)89 85 79バイト

a->{int i=10,x[]=new int[i];for(int d:a)x[d]++;for(;i-->0&&x[i]!=1;);return i;}

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

@KevinCruijssenの洞察のおかげで-6バイト!


1
あなたは置き換えることができreturn i>0?i:0;return i;。テストケースの出力は-1になります[9,9,9,9,9,9]が、「固有の数字がない場合、プログラムは何でもできます(未定義の動作)」というチャレンジでは問題ありません
ケビンCruijssen

確かに、私は現在の改訂以来できます。テストケースのためにできなかった前に0。前のゴルフで私が監督したものです!:)
オリビエグレゴワール

2

APL(Dyalog)、14バイト

-2 TwiNightに感謝します。

⌈/⊢×1=(+/∘.=⍨)

⌈/ 最大の

 引数

× 掛ける

1=() 1つが等しいそれぞれのブール

+/ 行の合計

∘.=⍨ 彼らの平等表

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


それ自体0を除いて最高の一意の数字は決してないので0、の×代わりに1バイトを/⍨保存し、それを列車に変換する別のバイトを保存することができます
-TwiNight

@TwiNightいいね!ありがとうございました。
アダム




1

F#、88バイト

let f i=Seq.countBy(fun a->a)i|>Seq.maxBy(fun a->if snd a>1 then 0 else int(fst a))|>fst

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

私の最初の努力から改善されたアプローチは、バイト数を減らします。

興味のポイント:fstsnd、それぞれのタプルの第一及び第二の要素を返します。


1

ゼリー、9バイト

ṢŒrṪỊ$ÐfṀ

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



@LeakyNunアウトゴルフ、息子
スキッドデフ

@Mayubeしかし、コアアルゴリズムは同じです
リーキー

@LeakyNunいいえ、まったく違います。
-steenbergh

@LeakyNun私が個別に投稿することを決めた... steenberghは、いくつかの頭か何かを取りながら、基本的に大きな違いは...、私の場合、私はちょうど維持するかを決めるということです
エリックOutgolfer

1

Pyth、6バイト

eS.m/Q

テストスイート

説明:

eS.m/Q
eS.m/QbQ    Implicit variable introduction
  .m   Q    Find all minimal elements of the input by the following function:
    /Qb     Number of appearances in the input
eS          Take the maximum element remaining.

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