001: Schlangenlinie
Serie | CodeGolfings |
Von | nopx |
Datum | 16.Dezember 2017 |
Download | Aufgabenbeschreibung [pdf] |
Schweirigkeit | ![]() |
Eingabe:
<program> <d> <l>
wobei
0 < d < 100 0 < l < 10.000
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
$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---------
Abgabe: Samstag 16.Dezember 2017 16:00 Uhr im Space
Dort schauen wir uns die unterschiedlichen Lösungen an.
Bei Fragen: [email protected]
Tests
Die folgenden Testfälle wurden überprüft.
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"}, ]
Lösungen
1. Platz
Perl von Max mit 187 Bytes. Alle Tests bestanden.
$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$/}
In sauber:
$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$/ }
2. Platz
JavaScript von Michael mit 225 Bytes. Hat Probleme mit d=1. Das führt zu einer mehrfachen Ausgabe von NaN.
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])
In sauber:
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]) }
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.
#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++;}}
In sauber:
#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++; } }