Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

treffen:001_codegolfing [2018/04/04 20:29]
treffen:001_codegolfing [2020/02/24 19:47] (aktuell)
Zeile 1: Zeile 1:
 +====== 001 CodeGolfing - Schlangenlinie ======
 +**Eingabe**: ​
 +<​code>​
 +<​program>​ <d> <l>
 +</​code>​
 +wobei
 +<​code>​
 +0 < d < 100
 +0 < l < 10.000
 +</​code>​
 +
 +**Aufgabe**:​
 +Schreibe ein Programm das zwei Zahlen als Argumente entgegen nimmt und eine Schlangenlinie ausgibt. Die Schlangenlinie läuft über d Zeilen. Wobei die Zahlen von 1 bis l sich durch die Zeilen schlängeln. Dabei muss der Whitespace so angepasst werden dass die Zahlen spaltentechnisch betrachtet direkt an einander anschließen. Für die Zahl l besteht außer der genannten keine Beschränkung. Sie muss also nicht auf die Anzahl Zeilen (d) aufgehen. Die Zeilen müssen alle bündig enden.
 +
 +**Beispiel**: ​
 +Wobei  ‘-’ = Space
 +<​code>​
 +$python script.py 3 106
 +1---5---9-------13------17 ​ ... 101---------105---
 +-2-4-6-8-10–-12---14--15-- ​ ... ---102---104---106
 +--3---7----11-------15---- ​ ... ------103---------
 +</​code>​
 +
 +**Abgabe**: ​
 +Samstag 16.Dezember 2017   16:00 Uhr im Space
 +
 +Dort schauen wir uns die unterschiedlichen Lösungen an.
 +
 +Bei Fragen: info@vspace.one
 +
 +{{ :​treffen:​20171204_codegolfing_001_02.pdf |Download der Beschreibung}}
 +
 +==== Tests ====
 +Die folgenden Testfälle wurden überprüft.
 +<​code>​
 +testcasesEchoString = [
 + {"​name":​ "​1-1",​ "​d":​ 1, "​l":​ 1,"​result":​ "​1\n"​},​
 + {"​name":​ "​1-11",​ "​d":​ 1, "​l":​ 11,"​result":​ "​1234567891011\n"​},​
 + {"​name":​ "​2-3",​ "​d":​ 2, "​l":​ 3,"​result":​ "1 3\n 2 \n"},
 + {"​name":​ "​2-11",​ "​d":​ 2, "​l":​ 11,"​result":​ "1 3 5 7 9  11\n 2 4 6 8 10  \n"},
 + {"​name":​ "​3-3",​ "​d":​ 3, "​l":​ 3,"​result":​ "​1 ​ \n 2 \n  3\n"},
 + {"​name":​ "​3-5",​ "​d":​ 3, "​l":​ 5,"​result":​ "​1 ​  5\n 2 4 \n  3  \n"},
 + {"​name":​ "​3-10",​ "​d":​ 3, "​l":​ 10,"​result":​ "​1 ​  ​5 ​  ​9 ​ \n 2 4 6 8 10\n  3   ​7 ​   \n"},
 +]
 +</​code>​
 +
 +
 +
 +==== Lösungen ====
 +
 +=== 1. Platz ===
 +Perl von Max mit 187 Bytes. Alle Tests bestanden.
 +<​code>​
 +$d=$ARGV[0];​$l=$ARGV[1];​for(1..$d){$r=$_;​for(1..$l){$z=$d==1?​1:​($_+(($_-1)/​(2*$d-2)))%(2*$d-1);​$z=$z>​$d?​$d-($z-$d):​$z;​if($z==$r){print$_;​}else{print("​ "​x(1+(log($_)/​log(10))));​}}print$/​}
 +</​code>​
 +
 +In sauber:
 +<​code>​
 +$d=$ARGV[0];​$l=$ARGV[1];​
 +
 +for (1..$d) {
 +  $r=$_;
 +  for (1..$l){
 +    $z=$d==1?​1:​($_+(($_-1)/​(2*$d-2)))%(2*$d-1);​
 +    $z = $z>​$d?​$d-($z-$d):​$z;​
 +    if($z==$r){print$_;​}
 +    else{print($"​x(1+(log($_)/​log(10))));​}
 +  }
 +  print$/
 +}
 +</​code>​
 +
 +
 +=== 2. Platz ===
 +JavaScript von Michael mit 225 Bytes. Hat Probleme mit d=1. Das führt zu einer mehrfachen Ausgabe von NaN.
 +<​code>​
 +for(x=process.argv,​d=x[2],​l=x[3],​r=new Array(d).fill(0),​p=0,​i=j=1;​j<​=l;​j++){for(r[p]+=j,​k=0;​k<​d;​k++)k!=p&&​(r[k]=null==r[k]?"​ ":​r[k]+"​ "​.repeat(j.toString().length));​p+=i,​p==d-1&&​(i=-1),​0==p&&​(i=1)}for(i in r)console.log(r[i])
 +</​code>​
 +
 +In sauber:
 +<​code>​
 +x = process.argv
 +d = x[2]
 +l = x[3]
 +r = new Array(d).fill(0)
 +p = 0
 +i = 1
 +for (j = 1; j <= l; j++) {
 +
 +    r[p] += j
 +
 +    for (k = 0; k < d; k++) {
 +        if (k != p) {
 +            r[k] = r[k] == null ? ' ' : r[k] + ' '​.repeat(j.toString().length)
 +        }
 +    }
 +    p += i
 +
 +    if (p == d - 1) {
 +        i = -1
 +    }
 +    if (p == 0) {
 +        i = 1
 +    }
 +}
 +for (i in r) {
 +    console.log(r[i])
 +}
 +</​code>​
 +
 +=== 3. Platz ===
 +C von Robin mit 337 Bytes. Hat Probleme mit d=1. Das führt zu einer endlosen Ausgabe von einsen. Außerdem stimmen die Enden der Zeilen nicht bündig.
 +<​code>​
 +#include <​stdio.h> ​
 +int main(int b,char *a[]){int h,​i,​j,​k,​l,​m,​n,​p,​u,​v,​w,​x,​y;​x=atoi(a[1]);​y=atoi(a[2]);​h=1;​for(i=1;​i<​=x;​i++){j=h;​u=0;​while(j<​=y){m=(x-1)*2;​n=(x-i)*2;​n=u%2==0?​n:​m-n;​n=n==0?​m:​n;​v=j<​=x?​i-1:​0;​w=0;​k=j+n;​l=j;​while(l<​k){p=l;​while(p!=0){p/​=10;​w++;​}l++;​}if(v!=0)printf("​%-*c",​v,'​ '​);​printf("​%-*d",​w,​j);​j=k;​u++;​}printf("​\n"​);​h++;​}}
 +</​code>​
 +
 +In sauber:
 +<​code>​
 +#include <​stdio.h>​
 +//#inlcude <​stdlib.h>​ kann weg
 +
 +int main(int b,char *a[]) {
 +    int h,​i,​j,​k,​l,​m,​n,​p,​u,​v,​w,​x,​y;​
 +    ​
 +    x=atoi(a[1]);​
 +    y=atoi(a[2]);​
 +    ​
 +    h=1;
 +    ​
 +    for(i=1;​i<​=x;​i++) {
 +        j=h;
 +        u=0;
 +        ​
 +        while(j<​=y) {
 +            m=(x-1)*2;
 +            n=(x-i)*2;
 +            ​
 +            n=u%2==0?​n:​m-n;​
 +            ​
 +            n=n==0?m:n;
 +            ​
 +            v=j<​=x?​i-1:​0;​w=0;​
 +            ​
 +            k=j+n;
 +            l=j;
 +            ​
 +            while(l<​k) {
 +                p=l;
 +                ​
 +                while(p!=0) {
 +                    p/=10;
 +                    w++;
 +                }
 +                l++;
 +            }
 +            ​
 +            if(v!=0)
 +                printf("​%-*c",​v,'​ ');
 +            ​
 +            printf("​%-*d",​w,​j);​
 +            ​
 +            j=k;
 +            u++;
 +        }
 +        ​
 +        printf("​\n"​);​
 +        h++;
 +    }
 +}
 +</​code>​
 +