Ihre Herausforderung besteht darin, ein Programm zu schreiben, das in einem Jahr die Anzahl der "Freitag-13-ten" ausgibt.
Regeln & Details:
- Sie können Eingaben über
STDIN
oder als Argument an Ihr Programm übergeben. - Sie sollten das Ergebnis an ausgeben
STDOUT
. - Sie können davon ausgehen, dass die Eingabe ein gültiges Jahr ist und den gregorianischen Kalender nicht vorbelegt (undefiniertes Verhalten ist in diesen Fällen zulässig).
- Kalender- / Datumsbibliotheken sind zulässig.
Dies ist ein Code-Golf , also gewinnt der kürzeste Code (in Bytes).
Antworten:
APL (Dyalog APL) mit cal von dfns , 29 Bytes
Probieren Sie es online!
⍳ 12
die ganzen Zahlen eins bis zwölf⎕ ,¨
Nehmen Sie die numerische Eingabe und stellen Sie jede der zwölf Zahlen voran{
… Wende}¨
auf jedes der Paare die Funktion an…cal⍵
Holen Sie sich einen Kalender für das Jahr-Monat2 ↓
Füge zwei Zeilen ein (Beschriftung und Tage)⍉
transponieren (damit wir Spalten statt Zeilen ansprechen können)¯5 ↑
nimm die letzten fünf (jeweils zwei Ziffern für Freitag und Samstag plus ein Leerzeichen)3 ↑
nimm die ersten zwei (zwei Ziffern für Freitag plus ein Leerzeichen)⍉
transponieren (so bekommen wir Lesereihenfolge),
ravel⍎
Als APL-Ausdruck ausführen (Liste der Freitagsdaten)13 ∊
Ist 13 ein Mitglied dieser Liste?+/
summiere die 12 BooleschenMit dem @ Wrzlprmft-Algorithmus können wir 53 Bytes lang ohne Bibliotheken arbeiten:
-∘0 1
subtrahieren Sie null und eins400 100 4 ∘.|
Divisionsresttabelle für die zwei Jahre (quer) geteilt durch diese Zahlen (runter)0 ≠.=
inneres "Produkt" mit 0, aber mit ≠ und = anstelle von +. ×⊢ ,
stellen Sie das nicht geänderte Argument Jahr voran2 3 ¯1 +.×
inneres Produkt mit diesen Zahlen14 |
Division Rest, wenn durch vierzehn geteilt'21232211321211' ⌷⍨
Index in diese Zeichenfolgequelle
Mathematica
49 46 45 4442Als reine Funktion : 42 Zeichen
Beispiel
Als benannte Funktion : 44 Zeichen
Beispiele
quelle
f=DayName@{#,m,6}~Table~{m,12}~Count~Friday&
Ruby,
49 48 4746Bearbeiten: Rasierte einen Charakter, indem er dank Jan eine Woche zurückging, und einen anderen, indem er von Time.new zu Time.gm wechselte
Edit: Auf Kosten der Verschleierung ein bisschen mehr, kann ich mit bis 46 bekommen
quelle
Time.gm(m,i).wday<1
. Außerdem weiß ich nicht, warum Sie die Funktion benennen.Powershell,
6863585250Danke Iszi für den Tipp.
Wenn der erste Tag im Monat der Sonntag ist, ist der 13. der Freitag.
Ich habe auch versucht:
Aber es ist nicht dasselbe
$args
innerhalb des Skriptblocks.quelle
$n
mit$args
in der Schleife, und Sie können$n=read-host;
ganz darauf verzichten. Speichert 8. Entfernen Sie @, wie oben erwähnt, und Sie sind auf 54.$args
um$input
das Jahr aus der PipelineR
767257quelle
"%a %d")=="Fri 13"
mit"%w%d)=="513")
von dow als Zahl verwendet wird , und die Räume zu entfernen.seq
hier eigentlich kürzer ist , das Einzige im Monat zu tun !sum(format(as.Date(paste(scan(),1:12,13,sep="-")),"%w%d")=="513")
ist nur 65 Zeichen!<
das ein Zeichen zu einer ganzen Zahl machen würde. Guter Trick!Python2.7
9086Montag, der 9., hat vielleicht nicht ganz den gleichen Klang, funktioniert aber genauso gut.
Edit: Anderthalb Jahre zu bemerken, dass
date
ist kürzer alsdatetime
:)quelle
from datetime import*
f=lambda y:sum([date(y,m,13).weekday()==4 for m in range(1,13)])
.... Die gleiche Größe Lösung mit dem Import (86 Bytes), obwohl.Keine Bibliotheken oder integrierten Datumsfunktionen verwenden:
Golfscript - 51
Python -
8279Im Wesentlichen derselbe Algorithmus.
Mit diesem Trick können Sie weiter spielen, um:
quelle
C
301+287Nicht die kürzeste Antwort, verwendet aber keine Bibliotheken.
quelle
static char GetNumberOfFriday13s(int year) { const string perpetualCalendar = "1221212213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213112213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122131"; return perpetualCalendar[year % 400];
. Wird nicht für negative Jahre arbeiten.v[0]
seinv[1]
. Sie können auch ein bisschen Golf spielen;strcat
Ziehen Sie in Betracht , Zeichen zum direkten Drucken zu verwenden , zu speicherna[]
und statt Zeichenkonstanten numerische Konstanten zu subtrahieren. :)main(int x,char**v){char p[400],*a[]={"1221212213113213","2131222","21122131","1222","112213113","122223113","122221122"},*b="adcadcadcaebcadcadcafbcadcadcagbcadcadcadc";*p=0;for(;*b;b++)strcat(p,a[*b-97]);putchar(p[atoi(v[1])%400]);}
(215 Zeichen)C (
151145137131130 Zeichen)Ich bin überrascht zu sehen, dass es nur eine andere Lösung gibt, die keine integrierten Kalender-Tools verwendet. Hier ist ein (stark verschleierter) mathematischer Ansatz, auch in C:
(Die oben genannten kompiliert in GCC ohne Fehler)
Alternative Lösung: C (287-> 215 Zeichen)
Mir hat die Lösung von Williham Totland und die Komprimierung sehr gut gefallen . Ich habe zwei kleine Fehler behoben und den Code angepasst, um seine Länge zu verkürzen:
quelle
PHP, 82
<?for($i=1,$c=0;$i<13;$i++)$c+=(date("N",mktime(0,0,0,$i,1,$argv[1]))==7);echo $c;
Beyogen auf
"Jeder Monat, der an einem Sonntag beginnt, enthält einen Freitag, den 13., und es gibt mindestens einen Freitag, den 13., in jedem Kalenderjahr."
Aus http://en.wikipedia.org/wiki/Friday_the_13th
quelle
Bash
4736Vielen Dank an @DigitalTrauma für das Speichern von 10 Zeichen
seq
mit der Standardeinstellung start to1
.(Vorherige Version mit
echo
gegenwärtig einen Fehler wegen der leeren Zeile , wenn<(echo $1-{1..12}-6$'\n')
. Also diese Funktion funktionierte gut , bis heute ist ein Freitag.Wir werden sehen:
Ist abhängig vom Gebietsschema , und wenn es nicht funktioniert, müssen Sie es möglicherweise tun
oder
In eine Funktion; +7 -> 43
Bonus: +78 -> 121
Von dort, wenn meine Funktion wird:
oder
quelle
C
. Aber es gibt einen Fehler ...%s\\n
seq
, um 8 Zeichen fallen zu lassen:date -f<(seq -f$1-%g-6 1 12)|grep -c ^F
seq -f$1-%g-6 12|date -f-|grep -c ^F
JavaScript, 70
quelle
,b,c
aus der Funktionsdeklaration (! Es ist in Ordnung zu Leck Vars für Golf), auchb
gegossen alsNumber
Sie können+=
das Ergebnis des Tests statt der&&b++
:b+=/^F/.test(new Date(a,c,6))
. Sie können jedoch ein anderes Byte speichern, indem Sie!new Date(a,c,1).getDay()
(dies funktioniert, weilgetDay
für Sonntag 0 zurückgegeben wird und wenn der 13. ein Freitag ist, ist der 1. ein Sonntag) anstelle dessen,test
was Sie insgesamt 7 Bytes sparen sollten!k
64 Zeichen
Liest von stdin
quelle
Common Lisp (CLISP), 149
quelle
C #
1101019392C # Linq 88
Vielen Dank an Jeppe Stig Nielsen für den Link und den Vorschlag, sich am 8. für den Sonntag zu melden.
Vielen Dank an Danko Durbić für den Vorschlag
>
statt==
.quelle
c+=(int)new DateTime(y,i,13).DayOfWeek==5?1:0;
Verwenden Sie stattdessen das Äquivalentc+=new DateTime(y,i,8).DayOfWeek==0?1:0;
. Der Trick ist, zu subtrahieren5
, denn dann können Sie den Wurf auf loswerdenint
, und auch die Zahl8
hat eine Ziffer weniger als die Zahl13
. Sonntag der Achte!int g(int y){return Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0);}
. Natürlich als Lambday=>Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0)
..DayOfWeek<1
.c#
Antwort zutreffen, ist sich aber nicht sicher, wie man es anwenden solllinq
.DayOfWeek
mit einer anderen ganzen Zahl als0
- vergleichenerror CS0019: Operator '<' cannot be applied to operands of type 'System.DayOfWeek' and 'int'
.PHP, 55 Bytes
Laufen Sie mit
echo <year> | php -nR '<code>'
.Im Grunde dasselbe wie Oleg und Damir Kasipovic , nur mit besserem Golfspiel:
Jeder Monat, der mit einem Sonntag beginnt, hat einen Freitag, den 13 ..
Also durchlaufe ich die Monate und zähle die ersten Tage, die Sonntage sind.
Nervenzusammenbruch
quelle
K, 42
.
quelle
Bash (
5247 Zeichen)quelle
Rebol, 63
Anwendungsbeispiel in der Rebol-Konsole:
Alternative Lösung, die den ganzen Freitag, den 13. im gegebenen Jahr sammelt, ist:
quelle
Bash und Sed, 39
ncal
druckt einen Kalender für das angegebene Jahr mit Wochentagen links unten.sed
mit einer/g
Flagge werden alle 13er mit Zeilenumbrüchen unterlegtgrep -c
zählt die Zeilen, die mit "2" beginnen (20 folgt immer 13)Vielen Dank an @DigitalTrauma, dass Sie einen Fehler in meiner alten Version gefunden und eine Lösung vorgeschlagen haben!
quelle
ncal $1|sed /F/s/13/\\n/g|grep -c ^\ 2
Scala,
7668 ZeichenIn 78 Zeichen:
def f(y:Int)=0 to 11 count(new java.util.GregorianCalendar(y,_,6).get(7)==6)
Nichts Außergewöhnliches, außer magische Zahlen für
DAY_OF_WEEK = 7
und zu verwendenFRIDAY = 6
.Version mit 68 Zeichen:
def f(y:Int)=0 to 11 count(new java.util.Date(y-1900,_,6).getDay==5)
Ja, Java hat die Werte der Wochentagskonstanten zwischen den APIs geändert.
quelle
new java.util.GregorianCalendar
, muss so lange dauern :(Python 195/204
Funktioniert nur für frühere Jahre, da
monthdatescalendar
bis jetzt ein Kalender für das angegebene Jahr zurückgegeben wird . Ich denke, es gibt noch viel Optimierungspotential :).Eine andere Lösung, die für jedes Datum geeignet ist, aber nicht kleiner ist:
quelle
Perl 6,
5553Alte Antwort:
quelle
Python (v2) 120
quelle
Perl + lib POSIX 55
Mit dem Gedanken, nicht erst zu suchen
13th
, und wie essunday
ist,0
lassen Sie 3 Zeichen sparen! Danke @ Iszi und Danko Durbić!Könnte 2010 bis 2017 (als Beispiel) folgendermaßen berechnen:
(Ok, es gibt kein Newline , aber das wurde nicht gefragt;)
Alter Beitrag: 63
In Aktion:
quelle
In Smalltalk (Squeak / Pharo Aroma), implementieren diese Methode in Integer ( 86 Zeichen)
Dann verwenden Sie es wie folgt aus :
2014countFriday13
.Natürlich könnten wir einen kürzeren Namen verwenden, aber dann wäre es nicht Smalltalk
quelle
C ++ - Zu viele Bytes :(
Ich habe eine Lösung ausprobiert, die keine Datumsbibliotheken verwendet.
Ich fand eine ziemlich coole (wenn ich so sagen darf) Lösung. Leider kann ich es nicht kürzer machen, was mich wirklich nervt, weil ich das Gefühl habe, dass es einen besseren Weg geben sollte.
Die Lösung hängt von diesem Algorithmus ab, der nur 44 Byte umfasst. Leider brauche ich noch 100 Bytes, um es schön zu verpacken ...
Ausgabe über den Rückkehrcode (in C ++ erfordert die Verwendung von
cout
oderprintf
etwas Ähnliches ein anderes#include
, was die Lösung noch mehr in die Luft jagen würde).Treiber / Testprogramm:
Ausgabe des Treiberprogramms:
quelle
($m<3?$y--:$y-2)+3
stattd=13,
,d+=m<3?y--:y-2,
undd+4
sollte auch funktionieren und viel sparen.+5
statt+3
und-5
sollte auch funktionieren und spart 2 bytes.for(m=0;++m<13;)
spart ein Byte. Wenn Siem=0
zum Funktionskopf wechseln, wird ein weiteres Byte gespeichert. Wenn Sie sich()%7||++f
zum Schleifenkopf bewegen , wird ein anderer gespeichert. Nach unten von 149 auf 136 Bytes.Clojure,
207187 Bytes-20 Bytes durch das Loswerden der
import
und einige Leerzeichen, die ich verpasst habe.Ab dem 1. Januar des jeweiligen Jahres durchläuft es jeden Tag eine Schleife. Wenn der Tag Freitag der 13. ist, wird die Anzahl erhöht. Die Schleife wird fortgesetzt, bis sie das nächste Jahr erreicht.
quelle
PHP, keine eingebauten, 81 Bytes
Laufen Sie mit
echo <year> | php -nR '<code>'
.Nervenzusammenbruch
Die Wochentage wiederholen sich alle 400 Jahre.
In den Ergebnissen für 1600 bis 1999 (zum Beispiel) gibt es einen Zeitraum von 28 Jahren mit nur drei Lücken:
Nachdem wir das Jahr für diese Lücken angepasst haben, können wir das Ergebnis mit einem einfachen Hash erhalten:
Nicht kurz (95 Bytes), aber hübsch. Und wir können Golf spielen
quelle
for(;++$m<13;23*$m/9+($m<3?$y--:$y-2)+5+$y/4-$y/100+$y/400)%7?:$f++)$y=$argn;echo$f;
Japt
-x
, 10 BytesVersuch es
quelle