2D Ungleichungen

29

Zielsetzung

Füllen Sie die Ungleichungen mit einem vorgegebenen Zahlenraster aus.

Annahmen

Die Anzahl der Spalten und Zeilen im Raster ist gleich.
Die maximale Größe des Rasters beträgt 12x12.
Das Gitter besteht nur aus ganzen Zahlen 0-9.
Die Ausgabe kann eine nachgestellte Newline enthalten.
Die Eingabe erfolgt genau wie unten beschrieben, einschließlich Leerzeichen und Zeilenumbrüchen.

Beispiel Eingabe

4 2 3 1

6 2 3 1

6 9 2 1

0 2 1 6

Beispielausgabe

4>2<3>1
^ " " "
6>2<3>1
" ^ v "
6<9>2>1
v v v ^
0<2>1<6

Beispieleingabe (2)

1 2 3 4 5

5 4 3 2 1

0 0 0 3 2

3 2 0 0 0

2 1 3 1 5

Beispielausgabe (2)

1<2<3<4<5
^ ^ " v v
5>4>3>2>1
v v v ^ ^
0=0=0<3>2
^ ^ " v v
3>2>0=0=0
v v ^ ^ ^
2>1<3>1<5

Beispiel Eingabe (3)

8

Beispielausgabe (3)

8

Beispiel Eingabe (4)

0 0 0 0 0 0 0 0 0 0 0 0

0 1 1 1 1 1 1 1 1 1 1 0

0 1 2 3 4 5 6 7 8 9 1 0

0 1 3 9 8 7 6 5 4 8 1 0

0 1 4 8 9 8 7 6 5 7 1 0

0 1 5 7 8 9 9 7 6 6 1 0

0 1 6 6 7 9 9 8 7 5 1 0

0 1 7 5 6 7 8 9 8 4 1 0

0 1 8 4 5 6 7 8 9 3 1 0

0 1 9 8 7 6 5 4 3 2 1 0

0 1 1 1 1 1 1 1 1 1 1 0

0 0 0 0 0 0 0 0 0 0 0 0

Beispielausgabe (4)

0=0=0=0=0=0=0=0=0=0=0=0
" ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ "
0<1=1=1=1=1=1=1=1=1=1>0
" " ^ ^ ^ ^ ^ ^ ^ ^ " "
0<1<2<3<4<5<6<7<8<9>1>0
" " ^ ^ ^ ^ " v v v " "
0<1<3<9>8>7>6>5>4<8>1>0
" " ^ v ^ ^ ^ ^ ^ v " "
0<1<4<8<9>8>7>6>5<7>1>0
" " ^ v v ^ ^ ^ ^ v " "
0<1<5<7<8<9=9>7>6=6>1>0
" " ^ v v " " ^ ^ v " "
0<1<6=6<7<9=9>8>7>5>1>0
" " ^ v v v v ^ ^ v " "
0<1<7>5<6<7<8<9>8>4>1>0
" " ^ v v v v v ^ v " "
0<1<8>4<5<6<7<8<9>3>1>0
" " ^ ^ ^ " v v v v " "
0<1<9>8>7>6>5>4>3>2>1>0
" " v v v v v v v v " "
0<1=1=1=1=1=1=1=1=1=1>0
" v v v v v v v v v v "
0=0=0=0=0=0=0=0=0=0=0=0
Absinth
quelle
In Ex. 2 Zeilen und Spalten sind nicht gleich.
Geokavel
1
Wird es zweistellige Zahlen geben?
Downgoat
@ Vɪʜᴀɴ Das Gitter besteht nur aus ganzen Zahlen 0-9.
Dennis
1
Ich gehe davon aus, dass die nummerierten Zeilen der Eingabe keine nachgestellten Leerzeichen enthalten. Gibt es Leerzeichen in den Leerzeilen? Wenn ich den Editierknopf drücke, stelle ich fest, dass in jeder Leerzeile 23 Leerzeichen sind, zum Beispiel 4, für alle anderen Beispiele Null. Aber die gerenderte Seite entfernt sie alle, zumindest wenn ich sie in einen Texteditor kopiere, um zu überprüfen ..
Level River St
1
@ steveverrill In den Leerzeilen sind keine Leerzeichen.
Absinth

Antworten:

3

Pyth, 46 Bytes

juCms.iJ-d\ m.x@H._-FsMk\ .:J2Gc2"=><\"v^"%2.z

Probieren Sie es online aus: Demonstration

Jakube
quelle
7

CJam, 52 Bytes

qN%::~_z_2{{_1>.-W<:g}%\z}*@@..{'=+}.{N@"\"v^"f=S*N}

Probieren Sie es online im CJam-Interpreter aus .

Vielen Dank an @CroCo für den Hinweis auf einen Fehler in Revision 3.

Vielen Dank an @Pyrrha für den Hinweis auf einen Fehler in Revision 6.

Wie es funktioniert

qN%        e# Read all input and split it at runs of linefeeds.
::~        e# Evaluate each character separately.
           e# This turns non-empty lines into arrays of integers.
_z_        e# Copy, transpose rows and columns, and copy again.
2{         e# Do the following twice:
  {        e#   For each row:
    _1>    e#     Copy the row and remove the copy's first element.
    .-     e#     Perform vectorized subtraction.
    W<     e#     Remove the last element.
           e#     This pushes the array of increments of the row.
    :g     e#     Replace each difference with its sign (-1, 0 or 1).
  }%       e#
  \        e#   Swap the two topmost arrays on the stack.
  z        e#   Transpose rows and columns of the topmost array.
}*         e#
           e# The topmost result has been transposed before and after computing
           e# the increments of its rows. It holds the increments of it columns.
           e# The result below it has been transposed twice (therefore not at
           e# all) before computing the increments of its rows.
@@         e# Rotate the number array and the row increment array on top.
..{        e# For each number and the corresponding increment, push both; then:
  '=+      e#   Add the increment to the character '='.
}          e#
.{         e# For each row of the column increment array and corresponding row
           e# of the last result, push both rows; then:
  N@       e#   Push a linefeed and rotate the column increments on top.
  "\"v^"f= e#   For each, select the appropriate comparison character.
  S*       e#   Join those characters, separated by spaces.
  N        e#   Push another linefeed.
 }         e#
Dennis
quelle
5

Python 2, 207 197 Bytes

f=lambda a:''.join(['=><'[cmp(a[i-1],a[i+1])]if c==' 'else'\n'+' '.join('"v^'[cmp(a[j-a.index('\n')],a[j+2])]for j in range(i,i+a.index('\n'),2))if a[i:i+2]=='\n\n'else c for i,c in enumerate(a)])

Dieser erzeugt eine Funktion f, die das Zahlengitter als Zeichenkette verwendet und die entsprechende Zeichenkette mit gefüllten Ungleichungen zurückgibt.

Die Funktion durchläuft jedes Zeichen in der Zeichenfolge. Wenn das Zeichen ein Leerzeichen ist, wird es durch die Ungleichung der Zahlen auf beiden Seiten ersetzt. Wenn das Zeichen und das nächste Zeichen Zeilenumbrüche sind, wird die gesamte Zeile durch die Ungleichungen für alle darüber und darunter stehenden Zahlen ersetzt.

Hier ist die Ausgabe der Funktion für jedes der Beispiele in der Frage, mit Ausnahme des wirklich langen:

>>> print f("""\
... 4 2 3 1
...
... 6 2 3 1
...
... 6 9 2 1""")
4>2<3>1
^ " " "
6>2<3>1
" ^ v "
6<9>2>1
>>> print f("""\
... 1 2 3 4 5
...
... 5 4 3 2 1
...
... 0 0 0 3 2
...
... 3 2 0 0 0
...
... 2 1 3 1 5""")
1<2<3<4<5
^ ^ " v v
5>4>3>2>1
v v v ^ ^
0=0=0<3>2
^ ^ " v v
3>2>0=0=0
v v ^ ^ ^
2>1<3>1<5
>>> print f("8")
8
cr3
quelle
Das ist klug, wenn man die Zeichen in eine Zeichenkette setzt und sie dann subskribiert. Ich werde das irgendwann benutzen müssen.
bkul
3

C, 552 408 Bytes

Dies ist ein Chaos, aber es funktioniert mit den Testfällen (für das Solo 8muss auf die Eingabe eine neue Zeile folgen, um richtig zu funktionieren)

#define P putchar
main(n,z)char**z;{char*t=*++z;n=0;while(*(*z)++!=10)if(**z!=32)n++;char a[n][n];int r=-1,c=0;n--;do*t>32?c?:r++,a[c][r]=*t:*t==10?c=0:c++;while(*++t);r=c=0;do{int j=a[c][r],s=61,k=a[c+1][r];P(j);if (c==n){if(r==n)break;c=0;r++;P(10);for(int t=a[c][r-1],b=a[c][r];c<n+1;t=a[c][r-1],b=a[c][r])s=t>b?118:t<b?94:34,printf("%c ",s),c++;c=0;P(10);continue;}s=j>k?62:j<k?60:s;P(s);c++;}while(1);}

Hier ist die erweiterte Version; Ich würde gerne hier Möglichkeiten finden, wie ich dies effektiver Golf spielen kann. Ich weiß, dass es hier noch viel zu verbessern gibt.

#define P putchar
main(n,z)char**z; {
    char *t = *++z;
    n = 0;
    while (*(*z)++!=10)
        if (**z!=32)
            n++;
    char a[n][n];
    int c,r=c=0;
    r = -1,n--;
    do
        *t>32?c?:r++, a[c][r] = *t:*t==10?c=0:c++; //32 is ASCII for space
    while (*++t);
    r=c=0;
    do {
        int j = a[c][r],s=61,k = a[c+1][r];P(j);
        if (c==n)
        {
            if (r==n)break;
            c=0;r++;P(10);
            for (int t=a[c][r-1],b=a[c][r];c<n+1; t = a[c][r-1],b = a[c][r])
                s=t>b?118:t<b?94:34,printf("%c ",s),c++;
            c = 0;
            P(10);
            continue;
        }
        s=j>k?62:j<k?60:s;

        P(s);
        c++;
    } while (1);
}
Chris Loonam
quelle
1
Benötigt mehr ternären Operator. Beispiel: In Ihrer innersten Schleife: s=t>b?'v':t<b?'^':'"';Beachten Sie, dass es nicht erforderlich ist, zu überprüfen, ob zwei Werte gleich sind, nachdem Sie bereits überprüft haben, ob der eine oder der andere größer ist. Es gibt nur 3 Möglichkeiten.
Darrel Hoffman
Danke für den Hinweis, dass das zusätzlich mit ein paar anderen Dingen über 100 Bytes gekostet hat.
Chris Loonam
2

JavaScript (ES6) 162

f=s=>(s=s.split`
`).map((r,i)=>r?(w=r).replace(/ /g,(c,j)=>x('<=>',r[j-1]-r[j+1])):w.replace(/\d/g,(c,j)=>x('^"v', c-s[i+1][j]))  ,x=(y,v)=>y[-~(v>0)-(v<0)]).join`
`

// more readeable 
u=s=>(
  x=(y,v)=>y[-~(v>0)-(v<0)],
  s=s.split`\n`,
  s.map((r,i)=>r
    ?(w=r).replace(/ /g,(c,j)=>x('<=>',r[j-1]-r[j+1]))
    :w.replace(/\d/g,(c,j)=>x('^"v', c-s[i+1][j]))
  ).join`\n`
)

//TEST
console.log=x=>O.innerHTML+=x+'\n'

;[
 '4 2 3 1\n\n6 2 3 1\n\n6 9 2 1\n\n0 2 1 6'
,'1 2 3 4 5\n\n5 4 3 2 1\n\n0 0 0 3 2\n\n3 2 0 0 0\n\n2 1 3 1 5'
,'8',  
,'0 0 0 0 0 0 0 0 0 0 0 0\n\n0 1 1 1 1 1 1 1 1 1 1 0\n\n0 1 2 3 4 5 6 7 8 9 1 0\n\n0 1 3 9 8 7 6 5 4 8 1 0\n\n0 1 4 8 9 8 7 6 5 7 1 0\n\n0 1 5 7 8 9 9 7 6 6 1 0\n\n0 1 6 6 7 9 9 8 7 5 1 0\n\n0 1 7 5 6 7 8 9 8 4 1 0\n\n0 1 8 4 5 6 7 8 9 3 1 0\n\n0 1 9 8 7 6 5 4 3 2 1 0\n\n0 1 1 1 1 1 1 1 1 1 1 0\n\n0 0 0 0 0 0 0 0 0 0 0 0'  
].forEach(t=>console.log(t+'\n\n'+f(t)+'\n\n'))
<pre id=O></pre>

edc65
quelle
1

Haskell, 201 Bytes

import Data.List
t=transpose
g=mapM_ putStrLn.t.map(h 1).t.map(h 0).lines
h n s@(a:_:b:r)|'/'<a&&a<':'=a:(o n a b):h n(b:r)
 |0<1=s
h n r=r
f=fromEnum
o n a b=l!!n!!(1+signum(f a-f b))
l=["<=>","^\"v"]

g erwartet eine Zeichenfolge.

Leif Willerts
quelle