サンタの決断


29

サンタの決定:

このチャレンジでは、サンタクロースがリストの誰かがいたずらか素敵かを判断し、続いてcoalまたはを取得するのを手伝いますtoys

しかし残念ながら、サンタは、彼のエントリの一部では、未組織でnaughtynice そしてnameフィールドが間違った順序です。

入力

入力は、次の互換性のある形式で提供されます。

  • 人の名前(コロンを含めることはできません、のみa-zA-Z0-9
  • 単語のnaughty直後にコロンと、サンタがあなたをいたずらさせた回数を表す負でない整数が続きます
  • 単語のnice直後にコロンが続き、サンタがあなたを素敵に捕まえた回数を表す負でない整数

すべては、それぞれの間に単一の空白(ASCII 32)で区切られています。

さらに、名前の名前の部分の間に空白はありませんSanta Claus-> SantaClaus

ボーナス:

  • (25%):彼はサンタクロースなので、リストを2回チェックし、重複がないことを確認する必要があります。(その場合、ユーザーが持っている最初のスコアを取得するだけです)

例:

Quill naughty:4 nice:0
naughty:0 Doorknob nice:3
naughty:2 Quill nice:6
nice:3 balpha naughty:3
pops nice:4 naughty:2

出力:

出力は次のもので構成される必要があります。

人の名前に続いて:

  • にさらにポイントがnaughtyある場合coal
  • にさらにポイントがあるnice場合、toys
  • しかし、naughtyniceが等しい場合、needs more data

    出力例:

  • 組織ボーナスと重複削除ボーナスの場合:

Quill coal
Doorknob toys
balpha needs more data
pops toys
  • ボーナスなし:

Quill coal
Doorknob toys
Quill toys
balpha needs more data
pops toys

最も少ないバイト数が勝ちです!


4
テストケースにはタイプミスもあります。DorkNoobの名誉あるmodのスペルを間違えました:^)
FryAmTheEggman

9
@FryAmTheEggmanಠ_ಠ
ドアノブ

2
いいえ、いたずらまたは素敵な有効な名前
クイル

1
それは...私は次の時間が常に存在だと思う...良いアイデアだ
クイル

1
「balphaはより多くのデータを必要とします」それは正しいと思われます
アダムデイビス

回答:



5

ジュリア、176 169バイト

s->for l=split(s,"\n") M(r)=parse(matchall(r,l)[1]);g=M(r"e:\K\d+");b=M(r"y:\K\d+");println(replace(l,r" *\w+:\d+ *","")," ",g>b?"toys":b>g?"coal":"needs more data")end

これは、文字列を受け入れ、結果をSTDOUTに出力する匿名関数です。呼び出すには、名前を付けf=s->...ます。

ゴルフをしていない:

function santa(s::AbstractString)
    # Split the input on newlines and process each line separately
    for l in split(s, "\n")
        # Define a function to get the number from the result of a
        # regular expression match
        M(r) = parse(matchall(r, l)[1])

        # Goodness
        g = M(r"e:\K\d+")

        # Badness
        b = M(r"y:\K\d+")

        # Get the name by replacing the naughty and nice specifications
        # with empty strings and print the line to STDOUT
        println(replace(l, r" *\w+:\d+ *", ""), " ",
                g > b ? "toys" : b > g ? "coal" : "needs more data")
    end
end


3

Ruby、144 123 155 * .75 = 116.25バイト

->s{d={}
s.split("
").map{|l|
a=l.split
b=a.grep /:/
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

grep方法を提案してくれたhistocratに感謝します。

164 * .75 = 123バイト

->s{d={}
s.split("
").map{|l|
a=l.split
b=a.select{|t|t[?:]}
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

144バイト

->s{puts s.split("
").map{|l|b=(a=l.split).select{|t|t[?:]};i,j=(b.sort*'').scan(/\d+/);(a-b)[0]+' '+['needs more data','coal','toys'][i<=>j]}}

非ゴルフ

->s{
  d={}
  s.split("
  ").map{ |l|
    a = l.split
    b = a.grep /:/
    i, j, v = (b.sort * '').scan(/\d+/) + a-b
    d[v] ||
      (d[v]=0
       puts v + ' ' + ['needs more data','coal','toys'][i<=>j]
      )
  }
}

使用法:

# Assign the anonymous function to a variable
f = ->s{d={}
s.split("
").map{|l|
a=l.split
b=a.grep /:/
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

f["Quill naughty:4 nice:0
naughty:0 Doorknob nice:3
naughty:2 Quill nice:6
nice:3 balpha naughty:3
pops nice:4 naughty:2"]

Quill coal
Doorknob toys
balpha needs more data
pops toys

.select{|t|t[?:]}ゴルフすることができます.grep(/:/)
histocrat

@histocratうわー、私はその方法を完全に忘れました。ありがとう:)
Vasu Adari

3

Perlの、138 113 105 103 102 96から25パーセント= 72

+1を含む -p

s/ *\w*(.):(\d+) */$$1=$2,()/eg;$$_++?$_='':s/\n/$".('needs more data',toys,coal)[$e<=>$y].$&/e

少ないゴルフ:

s/ *\w*(.):(\d+) */$$1=$2,()/eg;    # strip naughty/nice, set $a to naughty, $i to nice
                                    # $_ is now the input name followed by \n
$$_++ ? $_='' :                     # only output once per name
s/\n/                               # replace newlines with:
  $".                               # a space,
  ('needs more data',toys,coal)     # one of these strings,
  [$e<=>$y]                         # indexed by -1, 0 or 1
  .$&                               # and the matched newline.
/ex                                 # (/x only for legibility)

  • アップデート113
    • 変数名からniceまたはnaughty変数名として1文字を使用して25バイトを節約します。
    • 名前が最後の場合のバグを修正して5バイトを失う
  • 更新105<=>は、出力文字列のリストにインデックスを付けることで8バイトを節約します。
  • 更新103は、出力文字列を追加するために正規表現を使用して2バイトを保存します
  • 更新102では、2番目の最後の文字を使用するnicenaughty、2番目の代わりに1バイトを保存します。
  • 更新96変更して6セーブでバイト$$_ ? ... : ($$_++, ...)$$_++ ? ... : ...
    (なぜ私は前にそれを見ていません)。

2

JavaScript(ES6)、174バイト-25%ボーナス= 130.5スコア

s=>s.split`
`.map(l=>l.split` `.map(p=>(m=p.match(/\w:\d+/))?(n=+m[0].slice(2),m>"f")?b=n:c=n:a=p)&&d[a]?"":d[a]=a+" "+(b>c?`coal
`:b<c?`toys
`:`needs more data
`),d={}).join``

説明

s=>
  s.split`
`.map(l=>                   // for each line l of Santa's list
    l.split` `.map(p=>      // for each word p in l
      (m=p.match(/\w:\d+/)) // m = "y:x" for naughty, "e:x" for nice or null for name
        ?(n=+m[0].slice(2), // n = number at end of match
          m>"f")?b=n:c=n    // if naughty matched b = n, if nice matched c = n
        :a=p                // if no match, a = name
    )
    &&d[a]?"":              // if the name has been used before, add nothing to output
    d[a]=                   // else set d[name] to true

      // Add the appropriate text to the output
      a+" "+(b>c?`coal
`:b<c?`toys
`:`needs more data
`),

    // NOTE: This line is executed BEFORE the code above it in the map function...
    d={}                    // d = list of names that have been output
  )
  .join``                   // return the list of outputs as a string

テスト



2

Lua、329バイト-25%ボーナス= 246.75

a={...}p={}u=" "k=ipairs for i=1,#a/3 do p[i]={}end for i,v in k(a)do p[math.floor((i+2)/3)][(v:find("y:")and 3)or(v:find("e:")and 2)or 1]=v:gsub("%a+%:","")end for i,v in k(p)do d=tonumber b,g,n=d(v[3]),d(v[2]),v[1]if(not u:find(" "..n.." "))then u=u..n.." "print(n..(g<b and" coal"or g>b and" toys"or" needs more data"))end end

現時点では少しうんざりしているので、未バージョンと説明を後で編集します。すべての入力は、スペースで区切られたコマンドラインから取得されます。


2

Python 2、206バイト-25%= 154.5

s=[]
x=[0,0]
for p in zip(*(iter(input().split()),)*3):
 for w in p:
  j=w.find(':')+1
  if j:x[j<6]=int(w[j:])
  else:N=w
 b,g=x
 if N not in s:print N,['needs more data','coal','toys'][(b>g)-(g>b)];s+=[N]

2

JavaScript(ES6)120(160-25%)

テンプレート文字列を使用する匿名関数。重要でバイトカウントに含まれる4つの改行があります。

l=>l.split`
`.map(r=>k[r=r.replace(/\S+:(\d+)/g,(a,c)=>(t-=a[1]<'i'?c:-c,''),t=0).trim()]?'':k[r]=r+(t>0?` toys
`:t<0?` coal
`:` needs more data
`),k={}).join``
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.