Codegolf: Difference between revisions

From NoName e.V.
Jump to navigation Jump to search
Line 4: Line 4:
"Wie ist der Wochentag eines bestimmten Datums?"
"Wie ist der Wochentag eines bestimmten Datums?"


  $ ./wochentag 1. Januar 1970
[[/3te_Challenge|klick mich]]
  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+\. (Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember) \d+
Testcases kommen bald[tm].
 
[[user:sur5r|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
 
==== Kungi (Python): ====
"Geheim"


=== Challenge #2: Unlambda ===
=== Challenge #2: Unlambda ===

Revision as of 11:53, 19 July 2008

Es gelten die generischen Regeln

Challenge #3: Wochentagberechnung

"Wie ist der Wochentag eines bestimmten Datums?"

klick mich

Challenge #2: Unlambda

Ein Unlambda Interpreter. Genauere Zielvorgaben gibt es bald.

Na, dieses Loch war dann doch einwenig zu umfangreich?

Challenge #1

<SdK> gibts wörter, die nach rot13 n anderes existierendes wort ergeben?

Testdatei: http://qu.cx/~mxf/web2.gz == /usr/share/dict/web2
Gepiped durch wc -l sollte 154 rausfallen, da einige Wörter doppelt vorkommen. 
Falls Duplikate gefiltert werden, sollten es 132 sein.
Ausgabe in Form von "iraq->vend\n"

mxf: Perl

Fuer 154 Zeilen:

perl -nle'$w{$r=$_=lc}++;y&a-z&n-za-m&;$w{$_}&&print"$r->$_"' /usr/share/dict/web2

50+2 Zeichen

Fuer 132 Zeilen:

perl -nle'$w{$r=$_=lc}=1;y&a-z&n-za-m&;$w{$_}-->0&&print"$r->$_"' /usr/share/dict/web2

54+2 Zeichen

Das ganze in PHP

 php -r'foreach(file($argv[1],2)as$k){$f[$k=strtolower($k)]=0;if(isset($f[$r=str_rot13($k)]))echo$r."->$k\n";}' /usr/share/dict/web2 

154 Zeilen/102 Zeichen

urs: Perl

perl -nle'($$_=$_=lc)=~y^a-z^n-za-m^;print"$_->$$_"if$$$_' /usr/share/dict/web2

47+2 Zeichen. Gibt 154 Zeilen output.

PhilFry: Ruby

ruby -nle'y||={};$_.downcase!;y[$_]=0;r=$_.tr("a-z","n-za-m");y[r]&&(p $_+"->"+r)' < /usr/share/dict/web2

71 Zeichen

Ch3ka: php

<?$f=file($argv[1]);while($a[]=strtolower(next($f))){}while($b[]=str_rot13(next($a))){$c=end($b);if(in_array($c,$a))echo$c;}?>

122 Chrs

watz: PHP

<?require "File.php";foreach(explode("\n",strtolower(File::readAll($argv[1]))) as $f)$i[$f]=str_rot13($f);foreach($i as $a=>$b){if(array_key_exists($b,$i)){unset($i[$a]);echo"$a->$b\n";}}?>

190 Zeichen .. dafür schneller als Ch3ka .. Sortiert doppelte Worte auch raus --> 132 Zeilen+1 (1 Zeile leer weil eine Leerzeile im Dictionary) Man kann aber noch ein paar Zeichen rauskürzen und evlt. das mit dem File einlesen schöner machen.

Obige Zeile als PHP-Skript speichern und Aufruf mit php <php-skript> <dict>

Alternativ 186 Zeichen mit Aufruf:

php -r 'require "File.php";foreach(explode("\n",strtolower(File::readAll($argv[1]))) as $f)$i[$f]=str_rot13($f);foreach($i as $a=>$b){if(array_key_exists($b,$i)){unset($i[$a]);echo"$a->$b\n";}}' <dict>

Kungi: Python

import sys
e=dict([(a,0)for a in open(sys.argv[1]).read().lower().split()])
for w in e:
 b=w.encode('rot13')
 if b in e:
  print w+" -> "+b
kungi@BeerBook: wc golf.py                                                                                                                  
      6      19     140 golf.py

k-zed: common lisp

(with-open-file (s "/usr/share/dict/web2")
  (let ((d (make-hash-table :test #'equal)))
    (loop for l = (read-line s nil) until (not l)
          do (setf (gethash (string-downcase l) d) t))
    (maphash
      (lambda (k v)
        (let ((p (map 'string (lambda (c) (code-char (+ (mod (- (char-code c) 84) 26) 97))) k)))
          (when (gethash p d) (format t "~A -> ~A~%" k p)))) d)))

CentronX: eicar & ein Inder

Man lasse einen Inder das ganze in eicar eintippen und dann vergleichen.

Sack-C-ment: C natürlich

#include <stdio.h>
#include <stdlib.h>
#include <search.h>

int main() {
	FILE *fd = fopen("/tmp/web2", "r"); char *b = malloc(234937 * 26); int c = 0; ENTRY e,*d; hcreate(234937);
	while (fgets(b+(26*c++), 26, fd)) { char *r=strdup(b+(26*(c-1))); e.key=r; while (*(++r) != '\0' && *r != '\n') *r = (*r+13 > 'z' ? *r-13 : *r+13); e.data = b+(26*(c-1)); hsearch(e, ENTER); }
	for (c = 0; c < 234937; c++) { e.key = b+(26*c); if (d=hsearch(e, FIND)) printf("print it! %s / %s\n", d->data, d->key); }
}

Compile / Setup:

sort /usr/share/dict/web2 /tmp/web2
gcc -o golf golf.c && ./golf

Exakt 500 Zeichen

Sack-C-ment modified by jchome

#include <stdio.h>
#include <search.h>
#define A 234937
main(){FILE *f=fopen("web2", "r");char *b=malloc(A*26);int c=0;ENTRY e,*d;hc
reate(A);while(fgets(b+(26*c++),26,f)){char *r=strdup(b+(26*(c-1)));e.key=r;
while(*(++r)!='\0'&&*r!='\n')*r=(*r+13>'z'?*r-13:*r+13);e.data=b+(26*(c-1));
hsearch(e,ENTER);}for(c=0;c<A;c++){e.key=b+(26*c);if(d=hsearch(e,FIND))print
f("%s->%s\n",d->data,d->key);}}


`--> wc foo.c                   
4      14     392 foo.c

urs: Haskell

(Nein, eigentlich nicht auf länge optimiert. Aber wenn wir schon seltsame Programmiersprachen nehmen...)

import qualified Data.Set as S
import Data.Char
r=map(\x->chr(ord 'a'+((ord x-ord 'a'+13)`mod`26)))
f [] w=[]
f (x:y) w |x`S.member`w=x:f y w
          |otherwise=f y (S.insert (r x) w)
main = do
    cts <- getContents
    putStr$concat$concatMap(\x->[x,"->",(r x),"\n"])$f(words$map toLower cts) S.empty

299 Zeichen. 154 Zeilen Ausgabe.