Codegolf/3

From NoName e.V.
Revision as of 14:51, 26 July 2008 by Mxf (talk | contribs) (→‎Perl)
Jump to navigation Jump to search

Challenge #3: Wochentagberechnung

"Wie ist der Wochentag eines bestimmten Datums?"

 $ ./wochentag 1. Januar 1970
 Donnerstag
 $

Siehe: http://de.wikipedia.org/wiki/Wochentagsberechnung


Um es ein wenig golfbarer zu machen, rechnen wir nur mit dem gregorianischen Kalender.

Man kann davon ausgehen, dass das Programm immer mit einem legitimen Datum aufgerufen wird. Der Aufruf ist immer in der Form

 \d{1,2}\. (Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember) \d{4}

Die Ausgabe muss:

 (Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag)\n

entsprechen.

sur5r ist der Schiedsrichter dieser Challenge.

Es dürfen keine generischen/speziellen Datumsumrechnungsmodule der Sprache benutzt werden, auch wenn sie Bestandteil der Distribution der Sprache sind.

Das Programm darf nichts nach STDERR schreiben

Test

#!/usr/bin/ruby
def assert_eq(a, b)
   raise Exception.new("assertion failed: "+a+"!="+b) if a!=b
end
assert_eq `#{ARGV[0]} 14. Juli 1789`, "Dienstag\n"
assert_eq `#{ARGV[0]} 23. Mai 1949`, "Montag\n"
assert_eq `#{ARGV[0]} 20. März 1983`, "Sonntag\n"
assert_eq `#{ARGV[0]} 9. November 1989`, "Donnerstag\n"
assert_eq `#{ARGV[0]} 12. Januar 2006`, "Donnerstag\n"
assert_eq `#{ARGV[0]} 1. Januar 2000`, "Samstag\n"
assert_eq `#{ARGV[0]} 1. März 2000`, "Mittwoch\n"
assert_eq `#{ARGV[0]} 1. Januar 1712`, "Freitag\n"

(Score: 498)

./test.rb ./wochentag

Der Test ist genau dann erfolgreich, wenn keinerlei Ausgabe erfolgt.

Test in Shellscript

Für alle Rubyhasser oder Nicht-Ruby-Haber:

#!/bin/sh
T=$1;t(){ o=$($T $1|tr '\n' X);[ "$o" = "$2X" ]||echo "Assertion failed ($1): ${o/X/} != $2";}
t "14. Juli 1789" "Dienstag"
t "23. Mai 1949" "Montag"
t "20. März 1983" "Sonntag"
t "9. November 1989" "Donnerstag"
t "12. Januar 2006" "Donnerstag"
t "1. Januar 2000" "Samstag"
t "1. März 2000" "Mittwoch"
t "1. Januar 1712" "Freitag"

(Score: 331)

./test.sh ./wochentag

Inoffizielle, vom Schiri nicht bestätigte Scores

Shellscripting

  • sECuRE / zsh: 147
  • jiska / bash: 246
  • cato / bash: 274
  • CentronX / PowerShell: ca. 800 (Ja, I know!)

Perl

  • mxf: 153
  • urs: 171
  • yath: 188
  • downhill: 245

Python

  • Nicolas / Python: 190
  • Kungi / Python: 257

Ruby

C

  • sECuRE / C: 260 byte (normal), 220 byte (obfuscated, ohne compileraufruf), 132 byte (obfuscated, nicht rules-compliant, ohne compileraufruf)

ABAP

  • SdK / ABAP: 1586

PHP

  • BugBlue / PHP: 345