| 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]
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"},
]
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$/
}
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])
}
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++;
}
}