詐欺師をマッピングしてください!


10

すべての課題が提出されると、生徒番号をファイルのハッシュにマップする辞書が作成されます。

このディクショナリ、またはハッシュマップ、またはマッピング(言語によって何と呼ばれていても)は次のようになります。

{100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}

キーは学生番号で、値はハッシュです。

私たちの仕事は詐欺師を選ぶことです!不正行為者は、同一のハッシュを持つものです。

入力が与えられると、{100: "aabb", 104: "43a", 52: "00ab", 430: "aabb", 332: "43a"}関数は次のテキストを返す(または出力する)必要があります。

100 has identical files to 430

104 has identical files to 332

ハッシュが一意であるファイルが言及されていないことに注意してください。

また、ここでの順序も重要です

{100: "aabb", 202: "aabb", 303: "ab", 404: "aabb"} 次のテキストを返す(印刷する)必要があります。

100 has identical files to 202,404

次のいずれかを印刷するのは正しくありません。

202 has identical files to 100,404

100 has identical files to 404, 202

辞書にどのように表示されるかについては、印刷する必要があります。一部の言語では、辞書を通過するのはランダムです。そのため、この特殊なケースでは、入力方法を変更して、規則正しく辞書を通過できるようにすることができます。

その他の例:

{} # prints nothing

{100: "ab", 303: "cd"} # prints nothing again

{100: "ab", 303: "cd", 404: "ab"}

100 has identical files to 404

{303: "abc", 304: "dd", 305: "abc", 405: "dd", 606: "abc"}

303 has identical files to 305,606

304 has identical files to 405

最短のコードが勝ちます!


「それは辞書にどのように表示されるかという観点から印刷する必要があります」-これが何を意味するのか完全にはわかりません。そうでなければ私は挑戦が好きです。
ジュゼッペ

3
メインサイトに投稿する前に、サンドボックスを使用することもお勧めしますか?mainを明確にするために100万件のコメントを取得する代わりに、投稿前に質問の修正を取得するのに常に役立ちます:-)
Giuseppe

1
詐欺師の複数のグループが見つかった場合、グループ間に必要な順序はありますか?たとえば、最後のテストケースでは、「304 has ...」を「303 has ...」の前に印刷できますか?
カミルドラカリ2018

2
303 has identical files to [305, 606]代わりに出力することはでき303 has identical files to 305,606ますか?
Kevin Cruijssen、2018

1
辞書、マップ、またはハッシュマップタイプが存在しない言語では、タプル(または同等のもの)のリストを使用できますか?

回答:


2

JavaScript(Babelノード)、113バイト

入力を[key, value]フォーマットの配列の配列として受け取ります。ガジェットダブルflatMapに行く!

o=>o.flatMap(([x,h],i)=>(a=o.flatMap(([y,H],j)=>j>i&H==h?(o[j]=[,j],[y]):[]))+a?x+' has identical files to '+a:a)

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


JavaScript(Babelノード)、114バイト

入力をネイティブJSオブジェクトとして受け取ります。

o=>Object.keys(o).flatMap((x,i,a)=>(a=a.filter(y=>i--<0&o[y]==o[x]&&(o[y]=y)))+a?x+' has identical files to '+a:a)

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


1
すごくいい!かなり大きなファイルですが、この問題が他の問題ほど簡単であるとは思いもしませんでした。すごい仕事!私はこれに多くを見ていきますflatMap
KスプリットX

@KSplitX flatMapはまだ広くサポートされていません。もっと短い方法があると確信していますが、遅くなり、もう考えることはできません。:p
Arnauld 2018


1

Retina 0.8.2バイト

+m`((:.+)$(¶|.)+?)^(.+)\2$
,$4$1
:.*

G`,
%1`,
 has identical files to 

オンラインでお試しください!別の行で入力を受け取りますが、リンクには例を分割するテストスイートが含まれています。説明:

+

これ以上の置き換えができなくなるまで、このマッチを繰り返します。

m`((:.+)$(¶|.)+?)^(.+)\2$
,$4$1

一致するハッシュのペアを探し、2番目の一致のキーを最初の一致のキーにカンマ区切りで追加します。

:.*

すべてのハッシュを削除します。

G`,

コンマを含む行のみを保持します。

%1`,
 has identical files to 

各行の最初のコンマを目的のテキスト(末尾のスペースを含む)に置き換えます。


1

R145の 132 129 126 124バイト

function(m,`!`=names)for(e in !(t=table(m))[t>1])cat(el(n<-!m[m==e]),'has identical files to',paste(n[-1],collapse=','),'
')

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

名前付きベクトルを入力として受け取ります(名前はキーです)

  • -ジュゼッペのおかげで2バイト

もし ", "複数の重複があるセパレーター(コンマの後にスペースを含む)が許可されている場合、このコードを使用して10バイトを節約できます。

R、114バイト

function(m,`!`=names)for(e in !(t=table(m))[t>1])cat(el(n<-!m[m==e]),'has identical files to',toString(n[-1]),'
')

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


124はバイト私の腸は、115の範囲で何かをもたらす可能性がある別のアプローチを私に伝えますが、...
ジュゼッペ

0

05AB1E、34 バイト

Σθ}.γθ}vyg1›iy€нć“ÿ€°Ê¼‡œ€„ “?',ý,

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

説明:

Σθ}                   # Sort the (implicit) input by the string
.γθ}                  # Then group it by the string
v                     # Loop `y` over each grouped inner list
 yg1i                #  If the group contains more than 1 key-value pairs:
      y€н             #   Only leave the keys
      ć               #   Pop and push the head and rest of the list separately
                      #   (with the head being at the top of the stack now)
       “ÿ€°Ê¼‡œ€„    #   Compressed string "ÿ has identical files to "
                      #   where the "ÿ" is automatically replaced with the top of the stack
                   ?  #   Print it (without trailing newline)
       ',ý           '#   Join the remaining numbers by a comma
          ,           #   And output it as well (with trailing newline)

なぜかを理解するに“ÿ€°Ê¼‡œ€„ “、私の05AB1E回答(「辞書の使用方法」のセクション参照してください"ÿ has identical files to "




0

C#(Visual C#Interactive Compiler)、130バイト

a=>a.GroupBy(x=>x.Value,x=>x.Key).Where(x=>x.Count()>1).Select(x=>x.First()+" has identical files to "+String.Join(",",x.Skip(1)))

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

この質問の奇妙なことは、例がJSON形式でキー/値のペアとして提供されていることです。これは通常、それらが順序付けされていないことを意味します...ただし、この場合、順序が重要です。そのため、入力にはタプルのリストを使用し、出力には文字列のリストを使用しています。

// a is a list of tuples
// (student #, hash)
a=>a
  // group by hash
  // grouped items are the student #'s
  .GroupBy(x=>x.Value,x=>x.Key)
  // remove single student groups
  .Where(x=>x.Count()>1)
  // format the output strings
  .Select(x=>x.First()+
    " has identical files to "+
    String.Join(",",x.Skip(1)))


0

Japt、34バイト

üÌl>1 ®mgîÎ+` •s ÅÁÈól fÅC ‘ `+ZÅ

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

現在のところ、行の順序は少し矛盾していますが、行内では正しく出力されます。出力の行を特定の順序にする必要がある場合は、さらに数バイトかかります。入力は単なる配列です[id, hash]ペアの

説明:

üÌ                                    :Group by hash
  l>1                                 :Remove the ones that are unique
      ®mgà                            :Get just the Ids
          ®                           :Generate a string for each hash:
           Î                          : The first Id with that hash
            +` •s ÅÁÈól fÅC ‘ `       : Plus " has identical files to " compressed
                               +ZÅ    : Plus the remaining Ids
                                      : Implicitly comma delimited

0

Perl 6の115の 110 103バイト

-Jo Kingのおかげで2バイト

{unique map {.[0]~" has identical files to "~join ',',.skip},grep *>1,.map:{.grep(*{*}eq$^p{*})>>.key}}

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

ハッシュは順序付けされていないため、ペアのリストを取得します。2要素のリストのリストは数バイトを節約しますが、慣用的ではないようです。行のリストを返します。

結果の行の順序が重要でない場合は、 95 88バイト

*.classify(*{*}){*}>>.key.grep(*>1).map:{.[0]~" has identical files to "~join ',',.skip}

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


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