Aufsteigende Matrix


17

Die "aufsteigende Matrix" ist eine unendliche Matrix aus ganzen Zahlen (einschließlich 0), in der jedes Element das kleinste verfügbare Element ist, das zuvor in der jeweiligen Zeile und Spalte nicht verwendet wurde:

  | 1 2 3 4 5 6 ...
--+----------------
1 | 0 1 2 3 4 5 ...
2 | 1 0 3 2 5 4 ...
3 | 2 3 0 1 6 7 ...
4 | 3 2 1 0 7 6 ...
5 | 4 5 6 7 0 1 ...
6 | 5 4 7 6 1 0 ...
. | ...............

Ihre Aufgabe ist es, ein Programm zu schreiben, das das Element ausgibt, das in der durch die Eingabe angegebenen Zeile und Spalte gefunden wurde. (Standardeingabe und -ausgabe)

Testfälle:

5 3 -> 6
2 5 -> 5

Es gelten die Code-Golf-Regeln - der kürzeste Code gewinnt.

PS Auch wenn dies algorithmischer Natur ist, kann der Code sehr, sehr präzise sein.

EDIT: Ich hatte nicht erwartet, die xor-Lösung so früh zu sehen. Ich hatte wirklich gehofft, 10 Beiträge mit einem algorithmischen Ansatz und dann die xor-Lösung zu sehen. In Anbetracht der Tatsache, dass es nicht viel Spaß macht, xor in verschiedenen Sprachen zu schreiben, empfehle ich Ihnen, auch einen algorithmischen Ansatz zu wählen.

Also, ja, ich denke, niemand kann jetzt die 5-Zeichen-Marke überschreiten - deshalb gratuliere ich Ilmari Karonen zu der klügsten und kürzesten Lösung. Vor uns liegt jedoch eine neue Herausforderung: Schreiben Sie die kürzeste algorithmische Lösung .


5
Xor ist algorithmisch.
Peter Taylor

Antworten:


10

GolfScript, 5 Zeichen

~(\(^

In der Tat ist diese Aufgabe sehr einfach, sobald Sie das Muster erkannt haben. Das einzige unangenehme Bit ist die 1-basierte Indizierung. Wenn die Eingabeindizes auf Null basieren würden, würde diese 2-stellige Lösung ausreichen:

~^

Um dies Lesern zu erklären, die mit GolfScript nicht vertraut sind, wertet der ~Befehl die Eingabe aus und belässt die beiden Zahlen auf dem Stapel. ^Anschließend werden die beiden obersten Zahlen auf dem Stapel durch XOR verknüpft, sodass das Ergebnis für die Ausgabe übrig bleibt. Um mit 1-basierten Eingaben umzugehen, sind zwei weitere Befehle erforderlich: (Verringert die oberste Zahl auf dem Stapel um eins, während \die beiden obersten Elemente auf dem Stapel vertauscht werden.


1
Könnten Sie bitte das erklären ^? Ich bezog mich auf die GolfScript Built-Ins-Seite und den Symmetric-Unterschied . Die Verwendung dieser Operation mit zwei Gruppen von Arrays ist sinnvoll, aber ich verstehe nicht, wie das bei nur zwei separaten Zahlen funktioniert.
Rob

1
@Mike: Bei Anwendung auf Zahlen gibt der ^Operator das bitweise XOR zurück .
Ilmari Karonen

Das ist eine sehr coole Beziehung :)
beary605

1
Sie haben meine Antwort, die ich inzwischen aufgrund eines falschen Verständnisses der Herausforderung entfernt habe, richtig eingeschätzt.
DavidC

2

Mathematica 10 44

Bearbeiten

Meine erste Antwort basierte auf einem von Ilmari festgestellten Missverständnis über die Art der Herausforderung. Hier ist ein weiterer Versuch.

Verwendung

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]

@IlmariKaronen Ich glaube, ich habe es dieses Mal richtig gemacht. Aber es kommt nicht annähernd an die Größe Ihrer Lösung heran.
DavidC

2

K, 31

{0b/:{(x|y)&~x~y}. 0b\:'-1+x,y}

Hat Ilmari Karonens XOR-Logik gestohlen, die ich selbst nie entdeckt hätte.


2

PHP, 38

Nur eine einfache Implementierung von Ilmari Karonens XOR

<?php echo --$_GET['a']^--$_GET['b']?>

Verwendung:

... / xor.php? a = 4 & b = 7

druckt 6


2

Haskell 174

Ich dachte, ich würde eine Lösung finden, die sich nicht auf XOR stützt. Zu faul, um richtig Golf zu spielen.

a 0 0=0
a b c
 |m==n=a(b-m)(c-n)
 |m>n=m+a(b-m)c
 |m<n=n+a b(c-n)
 where{g f=until(>f)(*2)1`div`2;m=g b;n=g c;}
main=do
 [x,y]<-fmap(map read.words)getLine
 print$a(x-1)(y-1)

Edit: Einen Tag später wurde mir klar, dass dies nur eine Berechnung des XOR ist. Wenn dies als algorithmische Lösung gilt, sollte dies auch für Ilmari Karonen gelten.


2
Zu faul, um richtig Golf zu spielen. - Bitte legen Sie Wert darauf, dass es sich um einen ernsthaften Konkurrenten handelt.
Jonathan Frech

2

Python 2, 36

Ich denke, da ich gerade erst anfange, Python zu lernen, ist dies der perfekte Zeitpunkt, um meine erste Antwort mit Python zu übermitteln (und niemand hat mit Python geantwortet), und vielleicht könnte ich ein Feedback erhalten.

Vielen Dank an @IlmariKaronen für die sehr coole Verknüpfung.

Vielen Dank, dass Sie @Gareth für den Code unten.

import sys
print(input()-1^input()-1)

Python 3, 56

Das ursprüngliche Programm, das ich geschrieben hatte.

import sys
x=int(input())
y=int(input())
x-=1
y-=1
print(x^y)

IDEONE mit 2 und 5

IDEONE mit 3 und 3


Ich gehe davon aus, dass Sie Python 2 anstelle von Python 3 verwenden - wenn Sie diesen Kommentar nicht ignorieren. inputwertet die Eingabe bereits aus, int()sollte also nicht notwendig sein. Auch da Sie ein Int direkt von input()Ihnen bekommen, könnten Sie das -1sofort tun . Sie können auch die Zwischenvariablen vollständig entfernen und nach rechts gehen print(input()-1^input()-1). Ob der Import notwendig ist oder nicht - andere Python-Benutzer auf dieser Site bieten ihn nicht für Programme an, die input()Python verwenden , aber ich bin kein Python-Programmierer, daher kann ich nicht sagen, ob dies notwendig ist oder nicht.
Gareth

@Gareth Eigentlich habe ich Python 3 verwendet, aber ich freue mich über Ihren Vorschlag print(input()-1^input()-1). Danke für die Hilfe!
Rob

Darf ich fragen, warum Sie importieren sys?
Jonathan Frech

2

MATL , 2 Bytes

Z~

Probieren Sie es online!

MATL gibt die Herausforderung um einige Jahre nach, aber hey, eine natürliche 1-basierte Indizierung und eine bitweise xor-Funktion machen dies schön und ordentlich!



0

Javascript 13 Bytes

a=>b=>--a^--b

f=a=>b=>--a^--b

result = document.getElementById('result')
<input type="text" onkeyup="result.innerHTML = f(this.value.split(',')[0])(this.value.split(',')[1])" >
<p id="result"></p>


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.