10,000の評判を獲得しておめでとうございます!


19

@MartinBüttner正確に10,000の評判を達成した後、ユーザーページに1万人のユーザーの3つの完全な行があります!さて、私たちは全員プログラマーなので、手動で行うのではなく自動化するのが好きです。あなたの課題は、新しい1万人のユーザーを自動的に祝福するプログラムを作成することです。

仕様

入力

入力はn、スペースで区切られた数字の行になります。(必要に応じて、コードを短くする場合は、スペースで区切られた数字のコンマ区切りリストを1つ使用することもできます。)次に例を示します。

10 20 30 40 50
15 25 35 45 55
20 30 40 50 60

または:

10 20 30 40 50,15 25 35 45 55,20 30 40 50 60

数字の各リストは、1日のユーザーの評価値のリストを表します。

出力

出力は、同じn行数(または同じ長さのコンマ区切りリスト)になります。各行/リスト項目は次のとおりです。

  • :D レピュテーションが10,000以上になったユーザーがいた場合。
    • :D10,000人の担当者に会った、または合格したユーザーが複数いる場合は、スペースで区切られた複数の。たとえば、:D :D :D3人の新しい1万人のユーザー向け。
  • :( 入力があいまいまたは不可能な場合は、さらに出力を停止します(これについては次のセクションで詳しく説明します)。
  • これらの条件のどちらも当てはまらない場合は何もありません。

あいまいさ

入力があいまいである可能性があります。この課題のために、次のことを想定しています。

  • レピュテーションキャップは1日あたり200であり、チャレンジのために受け入れや賞金などを無視します。
  • ユーザーは評判を失うことはありません(これも単純さと挑戦のためです)。

どの評価値がどのユーザーに対応するかを判断できない場合、入力はあいまいと見なされます。たとえば、入力10 20,30 40では、10人のユーザーが30人のユーザーになったか、40人のユーザーになったかはわかりません。

ある日のユーザーが翌日のユーザーにならない可能性がある場合、入力は不可能と見なされます。たとえば、入力10 20,310 320では、ユーザーが1日で300の評判を得ることができなかったため、この状況は明らかに不可能です。ユーザーが評判を失うことも不可能です。

エッジケース

  • 最初のレピュテーション値は何でも開始できます(つまり、ユーザーは1337レピュテーションで開始できます)。
  • 最初の行/リスト項目の出力はありません。
  • 入力は常に構文的に有効です。つまり、レピュテーション値は常に正の整数であり、行/リスト項目ごとに常に同じ量のレピュテーション値があります。
  • レピュテーション値はソートされていません。順序は任意です。

テストケース

入力:9900,10000
出力::D

入力:9900 9950 9910,10100 9950 9910,10300 10150 10110
出力::D,:D :D

入力:10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
出力:,,,:(

入力:10 20,15 25,15 25
出力:,,

入力:9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
出力::D,:D,:(

入力:100,90,80,70
出力::(

入力:10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
出力::D,:(

入力:9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
出力::D :D :D :D,


@MartinBüttnerああ、それに気づかなかった。修正済み
ドアノブ

その例の最初のステップもあいまいです。
マーティンエンダー14

1
例4はあいまいではありません。
マーティンエンダー14

(i.e. a user can start with 1337 reputation).5分前に誰かが私の答えの1つを支持するまで、このcozが好きだったxD
Teun Pronk 14

例5、ステップ2も曖昧です(どの10kユーザーがどちらですか?)。同じことが例7にも当てはまります(同等のユーザーを識別することは無関係であるというルールを追加しない限り、1日目にどのユーザーが他の誰かと結びついた場合、どのユーザーであるかをどのように確認しますか?)
Martin Ender

回答:


12

ルビー、209バイト

編集: Rubyに切り替えて、これを約30%短縮しました。元のMathematicaバージョンの編集履歴を参照してください。主な節約は、Ruby permutationが同一の要素の切り替えられた位置を無視しないことによるものだと思います(Mathematicaをだまさなければなりませんでした)。

これは、改行で区切られた形式を使用します。

gets.split('
').map{|s|s.split.map &:to_i}.each_cons(2){|a,b|a.permutation.map{|q|q.zip(b).map{|x,y|y-x}}.reject{|d|d.any?{|x|x<0||x>200}}.size!=1?abort(':('):(puts':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))}

要点は次のとおりです。

  • 連続するすべての日のペアを取得します。
  • 前日のすべての順列を取得し、これらのそれぞれを現在の日から減算します。
  • 負または200より大きい差を含むすべての結果を捨てます。
  • 残りの順列の数が1でない場合、output :(
  • それ以外の場合は、:D新しい1万人のユーザーと同じ数だけ出力します。
  • 最後に、最初の日以降すべての日をドロップします:(

少ないゴルフ:

gets.split("\n").map{|s|
  s.split.map &:to_i
}.each_cons(2){|a,b|
  a.permutation.map{|q|
    q.zip(b).map{|x,y|
      y-x
    }
  }.reject{|d|
    d.any?{|x|
      x<0||x>200
    }
  }.size!=1 ? abort(':(') : (puts ':D '*(a.count{|d|d<1e4}-b.count{|d|d<1e4}))
}

これは列挙子の美しいチェーンの1つだと思います。:)

PS:がこれに対する答えを最初に提出したのは奇妙ですか?


8
変だとは思わない。ホームフィールドの優位性があることを教えてくれます;)
カルビンの趣味

だから、これは問題のいくつかの例に失敗するでしょう?
ランチャー14

@Cruncher仕様に従って間違っていると思うものは失敗します(コメントで述べたように)。Doorknobが例を修正するのではなく仕様を変更することに決めた場合、これをやり直す必要があると思います。
マーティンエンダー14

@MartinBüttnerそれが私が考えたことです。ただ確認:)
ランチャー14

6

ハスケル、254 249 244 232 228

import Data.List
t=m(9999<)
p(a:b:r)=(a,b,r)%(filter(all(`elem`[0..200]))$nub$m(zipWith(-)b)$permutations a)
p _=""
(a,b,r)%(_:[])=(concat$m(const":D ")$t b\\t a)++'\n':p(b:r)
_%_=":("
m=map
main=interact$p.m(m read.words).lines

ちょっとした説明:アルゴリズムは、MartinBüttnerが使用したものと非常によく似ていますがnub、私が考えたものを除きます。リストnに比べてn + 1日目に10000以上のレピュテーション値がいくつあるかを計算するためにリストの違いが使用されることに注意してくださいt b\\t a

また、仕様の解釈と、上記の例のいくつかが間違っていること、例2が間違っているという点までは、MartinBüttnerに同意します(そうすべきです:()。


あなたは別名をつけるべきではありませんmapか?
誇りに思ってhaskeller 14

1
権利(2つのバイトを保存する)が、別の10のバイトをすることによって保存することができz中置をと交換replicate (length l) xmap (const x) l。Haskellは素晴らしいものではありませんか?
TheSpanishInquisition 14

確かです。素敵なゴルフ!その点については、関数アプリケーションの優先順位が最も高い(t b)\\(t a)ためt b\\t a、に短縮でき、さらに4バイトをゴルフアウトできます。
誇りに思ってhaskeller 14

コードを自動的に短縮できる場所を見つけるためのコードがあればいいのですが...少し大きなプロジェクトのようです。
誇りに思ってhaskeller 14

あなたは正しいです@proudhaskeller、それらの教区は不必要でした。ありがとう。
TheSpanishInquisition 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.