10.000 itibar kazandığınız için tebrikler!


19

@ MartinBüttner tam olarak 10.000 itibar elde ettikten sonra , artık kullanıcı sayfasında 10 bin kullanıcılık üç tam satır var ! Şimdi, burada hepimiz programcı olduğumuzdan, işleri manuel yapmak yerine otomatikleştirmeyi seviyoruz. Zorluk, yeni 10 bin kullanıcıları otomatik olarak tebrik etmek için bir program yazmaktır.

Şartname

Giriş

Giriş n, boşlukla ayrılmış sayıların çizgileri olacaktır . (İsterseniz, kodunuzu kısaltırsa, virgülle ayrılmış tek bir boşlukla ayrılmış sayılar listesi de alabilirsiniz.) Örneğin:

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

Veya:

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

Her sayı listesi, tek bir günde kullanıcıların itibar değerlerinin bir listesini temsil eder.

Çıktı

Çıktı aynı miktarda nsatır (veya aynı uzunlukta virgülle ayrılmış bir liste) olacaktır. Her satır / liste öğesi:

  • :D ünü = 10.000 olan bir kullanıcı olsaydı.
    • :D10.000 temsilci sayısını karşılayan veya geçen birden fazla kullanıcı varsa, birden çok boşlukla ayrılmış s. Örneğin, :D :D :D3 yeni 10 bin kullanıcı için.
  • :( ve sonra giriş belirsiz veya imkansız ise daha fazla çıkışı durdurun (bundan sonraki bölümde daha fazlası).
  • bu koşulların hiçbiri doğru değilse hiçbir şey.

belirsizlik

Girdinin belirsiz olması mümkündür. Bu zorluğun amaçları için şunları varsayıyoruz:

  • İtibar sınırı günlük 200'dür, kabul uğruna ve lütufları ve benzerlerini görmezden gelmek meydan okumadır.
  • Kullanıcılar itibarını kaybetmeyebilir (yine basitlik ve meydan okuma için).

Hangi itibar değerlerinin hangi kullanıcıya karşılık geldiğini belirlemek mümkün olmadığında girdi belirsiz kabul edilir. Örneğin, girişte 10 20,30 4010 rep kullanıcısının 30 rep kullanıcısı mı yoksa 40 rep kullanıcısı mı olduğunu söyleyemezsiniz.

Bir günden kullanıcılar ertesi günden itibaren kullanıcı olamadığında giriş imkansız kabul edilir. Örneğin, girdide 10 20,310 320, bu durum açıkça imkansızdır, çünkü kullanıcılar bir günde 300 itibar kazanamazdı. İtibarı kaybeden kullanıcılar da imkansızdır.

Edge kutuları

  • Başlangıç ​​itibar değerleri her şeyden başlayabilir (yani bir kullanıcı 1337 itibarıyla başlayabilir).
  • İlk satır / liste öğesi için çıktı yok.
  • Giriş her zaman sözdizimsel olarak geçerli olacaktır, yani itibar değerleri her zaman pozitif tamsayılar olacaktır, her satır / liste öğesi vb. İçin her zaman aynı miktarda itibar değeri olacaktır.
  • İtibar değerleri sıralanmaz; herhangi bir sırada olabilirler.

Test senaryoları

Giriş: 9900,10000
Çıkış::D

Giriş: 9900 9950 9910,10100 9950 9910,10300 10150 10110
Çıkış::D,:D :D

Giriş: 10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
Çıkış:,,,:(

Giriş: 10 20,15 25,15 25
Çıkış:,,

Giriş: 9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
Çıkış::D,:D,:(

Giriş: 100,90,80,70
Çıkış::(

Giriş: 10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
Çıkış::D,:(

Giriş: 9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
Çıkış::D :D :D :D,


@ MartinBüttner Ah, bunu fark etmedi. Sabit
Kapı Tokmağı

Bu örnekteki ilk adım da belirsizdir.
Martin Ender

1
Oysa örnek 4 belirsiz değildir.
Martin Ender

(i.e. a user can start with 1337 reputation).Benim temsilcisi oldu bu coz sevdim ... wel 5 dakika önce birisi cevaplarımı biri upvoted xD
Teun Pronk

Örnek 5, adım 2 de belirsizdir (hangi 10k kullanıcı hangisidir?). Aynı durum örneğin 7 için de geçerlidir (eşit temsilci kullanıcıları ayırt etmenin önemsiz olduğuna dair bir kural eklemezseniz, ancak daha sonra başka biriyle bağlanırsa hangi günün hangi kullanıcının hangisi olduğunu nasıl bilebilirsiniz?)
Martin Ender

Yanıtlar:


12

Yakut, 209 bayt

Edit: Ben bu yaklaşık% 30 kısaldı Ruby geçti. Orijinal Mathematica sürümü için düzenleme geçmişine bakın. Ana tasarrufların Ruby'nin permutationözdeş elemanların anahtarlamalı konumlarını (Mathematica'yı kandırmak zorunda kaldım) görmezden gelmemesinden kaynaklandığını düşünüyorum .

Yeni satırla ayrılmış biçimi kullanır.

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}))}

Buradaki öz:

  • Ardışık tüm çift günlerini alın.
  • Önceki günün tüm permütasyonlarını alın ve bunların her birini mevcut günden çıkarın.
  • Negatif veya 200'den büyük farklılıklar içeren tüm sonuçları kaldırın.
  • Kalan permütasyon sayısı 1 değilse çıktı alın :(.
  • Aksi takdirde, :Dyeni 10k kullanıcı sayısı kadar çıktı alın .
  • Sonunda, ilkinden sonraki tüm günleri bırakın :(.

Daha az golf:

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}))
}

Bence bu güzel bir numaralandırma zinciri. :)

Not: Buna ilk cevap gönderen kişi benim için garip mi?


8
Bunun garip olduğunu düşünmüyorum. Bir şey bana ev alanı avantajına sahip olduğunu söylüyor;)
Calvin'in Hobileri

Yani bu sorudaki bazı örneklerden başarısız olacak, değil mi?
Cruncher

@Cruncher (Ben yorumlarda belirtildiği gibi) spec göre yanlış olduğunu düşünüyorum olanlar başarısız olacaktır. Doorknob, örnekleri düzeltmek yerine spesifikasyonu değiştirmeye karar verirse, sanırım bunu yeniden yapmak zorunda kalacağım.
Martin Ender

@ MartinBüttner Ben de öyle düşündüm. Sadece onaylama :)
Cruncher

6

Haskell'in 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

Biraz açıklama: Algoritma MartinBüttner'ın kullandığı algoritmaya çok benziyor, bunun dışında nubbiraz düşünmem. N + 1 gününde n: gününe kıyasla daha fazla itibar değerinin 10000 veya daha fazla olduğunu hesaplamak için bir liste farkının kullanıldığını unutmayın t b\\t a.

Ayrıca, spesifikasyonların yorumlanması ve yukarıdaki örneklerden bazılarının yanlış olduğunu, hatta # 2 örneğinin yanlış olduğu (hatta) olması gerektiği noktaya kadar, MartinBüttner ile aynı fikirdeyim :(.


Takma ad yapmamalısın map?
gururlu haskeller

1
Bu doğru (2 bayt tasarruf), ama başka bir 10 bayt yaparak kaydedilebilir zinfix ve değiştirilmesi replicate (length l) xile map (const x) l. Haskell harika değil mi?
TheSpanishInquisition

emin. Güzel golf! Bu notta, fonksiyon uygulaması en yüksek önceliğe sahip (t b)\\(t a)olduğundan t b\\t a, 4 bayt daha golf ederek kısaltmanız gerekir.
gururlu haskeller

Kodun otomatik olarak kısaltılabileceği yerleri bulmak için bazı kodlar olsaydı iyi olurdu ... Yine de bir proje biraz büyük görünüyor.
gururlu haskeller

Haklısın @proudhaskeller, bu parantezler gereksizdi. Teşekkürler.
TheSpanishInquisition
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.