Inhaltsverzeichnis

CC BY-SA 3.0 by Oliver Kurmis

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: info@vspace.one

Download der Beschreibung

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++;
    }
}