Herzlichen Glückwunsch zum 10.000 Ruf!

19

Nach @ MartinBüttner erreicht genau 10.000 Ruf , wir haben jetzt drei volle Reihen von 10k Benutzer auf der Benutzer - Seite ! Da wir hier alle Programmierer sind, möchten wir Dinge automatisieren, anstatt sie manuell auszuführen. Ihre Herausforderung besteht darin, ein Programm zu schreiben, mit dem Sie automatisch neuen 10k-Benutzern gratulieren können.

Spezifikation

Eingang

Die Eingabe erfolgt in nZeilen mit durch Leerzeichen getrennten Zahlen. (Wenn Sie möchten, können Sie auch eine einzelne durch Kommas getrennte Liste von durch Leerzeichen getrennten Zahlen verwenden, wenn dies Ihren Code kürzer macht.) Zum Beispiel:

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

Oder:

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

Jede Nummernliste repräsentiert eine Liste der Reputationswerte der Benutzer an einem einzelnen Tag.

Ausgabe

Die Ausgabe erfolgt in der gleichen Anzahl von nZeilen (oder in einer durch Kommas getrennten Liste mit der gleichen Länge). Jedes Zeilen- / Listenelement ist:

  • :D wenn es einen Benutzer gäbe, dessen Ruf gerade> = 10.000 wurde.
    • Mehrere durch Leerzeichen getrennte :Ds, wenn mehrere Benutzer die Anzahl von 10.000 Wiederholungen erreicht oder überschritten haben. Zum Beispiel :D :D :Dfür 3 neue 10k Benutzer.
  • :( und dann die weitere Ausgabe anhalten, wenn die Eingabe mehrdeutig oder unmöglich ist (mehr dazu im nächsten Abschnitt).
  • nichts, wenn keine dieser Bedingungen erfüllt ist.

Mehrdeutigkeit

Möglicherweise ist die Eingabe nicht eindeutig. Für die Zwecke dieser Herausforderung gehen wir davon aus, dass:

  • Die Reputationsobergrenze liegt bei 200 pro Tag, wobei Akzeptanz, Kopfgeld und dergleichen für die Herausforderung ignoriert werden.
  • Die Benutzer dürfen ihren Ruf nicht verlieren (der Einfachheit halber und wegen der Herausforderung).

Eingaben gelten als mehrdeutig, wenn nicht festgestellt werden kann, welche Reputationswerte welchem ​​Benutzer entsprechen. Beispielsweise können Sie in der Eingabe 10 20,30 40nicht feststellen, ob der Benutzer mit 10 oder 40 Wiederholungen der Benutzer mit 30 oder 40 Wiederholungen wurde.

Eine Eingabe wird als unmöglich angesehen, wenn die Benutzer eines Tages möglicherweise nicht die Benutzer des nächsten Tages geworden sind. Beispielsweise ist 10 20,310 320diese Situation bei der Eingabe eindeutig unmöglich, da die Benutzer nicht an einem Tag 300 Reputation hätten erlangen können. Es ist auch unmöglich, dass Benutzer ihren Ruf verlieren.

Edge-Fälle

  • Die anfänglichen Reputationswerte können bei irgendetwas beginnen (dh ein Benutzer kann mit 1337 Reputation beginnen).
  • Für den ersten Zeilen- / Listeneintrag erfolgt keine Ausgabe.
  • Die Eingabe ist immer syntaktisch gültig, dh die Reputationswerte sind immer positive ganze Zahlen, es gibt immer die gleiche Menge an Reputationswerten pro Zeile / Listenelement usw.
  • Die Reputationswerte werden nicht sortiert. Sie können in beliebiger Reihenfolge sein.

Testfälle

Eingabe: 9900,10000
Ausgabe::D

Eingabe: 9900 9950 9910,10100 9950 9910,10300 10150 10110
Ausgabe::D,:D :D

Eingabe: 10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
Ausgabe:,,,:(

Eingabe: 10 20,15 25,15 25
Ausgabe:,,

Eingabe: 9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
Ausgabe::D,:D,:(

Eingabe: 100,90,80,70
Ausgabe::(

Eingabe: 10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
Ausgabe::D,:(

Eingabe: 9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
Ausgabe::D :D :D :D,

Türknauf
quelle
@ MartinBüttner Ah, das ist mir nicht aufgefallen. Behoben
Türklinke
Der erste Schritt in diesem Beispiel ist ebenfalls nicht eindeutig.
Martin Ender
1
Während Beispiel 4 nicht mehrdeutig ist.
Martin Ender
(i.e. a user can start with 1337 reputation).Ich mochte diese Coz, die mein Repräsentant war ... wel vor 5 Minuten, bis jemand eine meiner Antworten upvoted xD
Teun Pronk
Beispiel 5, Schritt 2 ist ebenfalls nicht eindeutig (welcher 10k-Benutzer ist welcher?). Gleiches gilt für Beispiel 7 (es sei denn, Sie fügen eine Regel hinzu, dass das Erkennen von gleichrangigen Benutzern irrelevant ist. Aber woher wissen Sie, welcher Benutzer am ersten Tag welcher war, wenn er später mit einem anderen verbunden wurde?)
Martin Ender

Antworten:

12

Ruby, 209 Bytes

Edit: Ich habe zu Ruby gewechselt, was dies um ca. 30% verkürzt hat. Die ursprüngliche Mathematica-Version finden Sie im Bearbeitungsverlauf. Ich nehme an, die größten Einsparungen resultieren daraus, dass Ruby permutationvertauschte Positionen identischer Elemente nicht ignoriert (zu denen ich Mathematica überlisten musste).

Dies verwendet das durch Zeilenumbrüche getrennte Format.

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

Das Wesentliche ist folgendes:

  • Holen Sie sich alle aufeinander folgenden Tage.
  • Holen Sie sich alle Permutationen des vorherigen Tages und subtrahieren Sie diese jeweils vom aktuellen Tag.
  • Beenden Sie alle Ergebnisse, die negative oder größere Unterschiede enthalten 200.
  • Wenn die Anzahl der verbleibenden Permutationen nicht 1 ist, wird ausgegeben :(.
  • Andernfalls werden so viele ausgegeben, wie :Dneue 10.000 Benutzer vorhanden sind.
  • Am Ende alle Tage nach dem ersten fallen lassen :(.

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

Ich denke, das ist eine schöne Kette von Aufzählungszeichen. :)

PS: Ist es komisch, dass ich als erster eine Antwort darauf eingereicht habe?

Martin Ender
quelle
8
Ich finde es nicht komisch. Etwas sagt mir, dass du den Heimvorteil hast;)
Calvins Hobbys
Das scheitert also an einigen Beispielen in der Frage, oder?
Cruncher
@Cruncher Es wird scheitern diejenigen, die ich für falsch halte nach der Spezifikation (wie ich in den Kommentaren erwähnt habe). Wenn Doorknob beschließt, die Spezifikation zu ändern, anstatt die Beispiele zu korrigieren, muss dies vermutlich überarbeitet werden.
Martin Ender
@ MartinBüttner Das habe ich mir gedacht. Nur zur Bestätigung :)
Cruncher
6

Haskell, 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

Eine kleine Erklärung: Der Algorithmus ist dem von MartinBüttner sehr ähnlich, abgesehen von dem nub, über den ich mich Gedanken gemacht habe. Beachten Sie, dass eine Liste Unterschied zum Ausarbeiten verwendet wird , wie vielen Ruf Werte 10000 oder größer am Tag n + 1 im Vergleich zu Tag n: t b\\t a.

Ich stimme auch MartinBüttner bei der Interpretation der Spezifikationen zu und stelle fest, dass einige der obigen Beispiele falsch sind, auch wenn Beispiel 2 falsch ist (sein sollte :().

TheSpanishInquisition
quelle
Solltest du nicht Pseudonym map?
stolzer Haskeller
1
Das ist richtig (Einsparung 2 Byte), aber weitere 10 Bytes können , indem sie gespeichert werden zInfix und Ersetzen replicate (length l) xmit map (const x) l. Ist Haskell nicht fantastisch?
TheSpanishInquisition
es ist sicher. Schönes Golfen! In diesem Sinne, da die höchste Priorität Funktionsanwendung hat, sollten Sie in der Lage sein , zu verkürzen , (t b)\\(t a)zu t b\\t a, Golf aus 4 weitere Bytes.
stolzer Haskeller
Es wäre schön, wenn es Code gäbe, um diese Stellen zu finden, an denen Code automatisch gekürzt werden kann ... Scheint jedoch ein großes Projekt zu sein.
stolzer Haskeller
Sie haben Recht @proudhaskeller, diese Parethesen waren unnötig. Vielen Dank.
TheSpanishInquisition