Matrice ascendente


17

La "matrice ascendente" è una matrice infinita di numeri interi (0 incluso) in cui ogni elemento è il più piccolo elemento disponibile che non è stato precedentemente utilizzato sulla rispettiva riga e colonna:

  | 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 ...
. | ...............

Il tuo compito è scrivere un programma che produrrà l'elemento trovato nella riga e colonna specificata dall'input. (input e output standard)

Casi test:

5 3 -> 6
2 5 -> 5

Si applicano le regole del Code Golf: vince il codice più breve.

PS Anche se questo ha una natura algoritmica, il codice può essere molto, molto conciso.

EDIT: non mi aspettavo di vedere la soluzione xor così presto. Speravo davvero di vedere 10 post con un approccio algoritmico e POI la soluzione xor. Ora, tenendo presente che non è molto divertente vedere come scrivere xor in diverse lingue, ti consiglio di provare anche un approccio algoritmico.

Quindi, sì, penso che nessuno possa battere il segno dei 5 personaggi ora, quindi mi congratulo con Ilmari Karonen per la soluzione più intelligente e più breve. Ma c'è una nuova sfida: scrivere la soluzione algoritmica più breve .


5
Xor è algoritmico.
Peter Taylor,

Risposte:


10

GolfScript, 5 caratteri

~(\(^

In effetti, questo compito è molto semplice una volta riconosciuto il modello. L'unico bit scomodo è l'indicizzazione basata su 1: se gli indici di input fossero a base zero, questa soluzione a 2 caratteri sarebbe sufficiente:

~^

Per spiegare questo ai lettori che non hanno familiarità con GolfScript, il ~comando elimina l'input, lasciando i due numeri in pila. ^quindi XOR mette insieme i due numeri più in alto nello stack, lasciando il risultato per l'output. Per gestire l'input basato su 1, sono necessari altri due comandi: (diminuisce di uno il numero più in alto nello stack di uno, mentre \scambia i due elementi in cima allo stack.


1
Potresti spiegare per favore il ^? Ho fatto riferimento alla pagina incorporata di GolfScript e alla differenza simmetrica ; usare questa operazione con due serie di matrici ha senso, ma non capisco come funzioni solo per due numeri separati.
Rob,

1
@Mike: quando applicato ai numeri, l' ^operatore restituisce il loro XOR bit a bit .
Ilmari Karonen,

Questa è una relazione molto interessante :)
beary605

1
Hai avuto ragione nella tua valutazione della mia risposta, che ho rimosso per essermi basato su una lettura errata della sfida.
David C

2

Mathematica 10 44

modificare

La mia prima risposta si basava su un malinteso sulla natura della sfida, come osservato da Ilmari. Ecco un altro tentativo.

uso

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

@IlmariKaronen Penso di aver capito bene questa volta. Ma non si avvicina nemmeno alle dimensioni della tua soluzione.
DavidC,

2

K, 31

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

Ho rubato la logica XOR di Ilmari Karonen, che non mi sarei mai individuato.


2

PHP, 38

Solo una semplice implementazione di XOR di Ilmari Karonen

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

Uso:

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

stamperà 6


2

Haskell 174

Ho pensato che avrei realizzato una soluzione che non si basava su XOR. Troppo pigro per giocare a golf correttamente.

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)

Modifica: un giorno dopo mi sono reso conto che si tratta solo di calcolare XOR. Quindi se questo conta come una soluzione algoritmica, lo stesso dovrebbe fare per Ilmari Karonen.


2
Troppo pigro per giocare a golf correttamente. - si prega di giocare a golf la tua richiesta per essere un serio contendente.
Jonathan Frech,

2

Python 2, 36

Immagino da quando ho appena iniziato a imparare Python che questo sarebbe il momento perfetto per inviare la mia prima risposta utilizzandola (e nessuno ha risposto utilizzando Python) e forse potrei ricevere un feedback.

Grazie @IlmariKaronen per la scorciatoia molto interessante.

Grazie @Gareth per il codice qui sotto.

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

Python 3, 56

Il programma originale che avevo scritto.

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

IDEONE con 2 e 5

IDEONE con 3 e 3


Suppongo che tu stia usando Python 2 anziché Python 3 - se non ignori questo commento. inputvaluta già l'input, quindi int()non dovrebbe essere necessario. Anche dal momento che stai ottenendo un int direttamente da input()te potresti fare -1subito. Puoi anche eliminare completamente le variabili intermedie e andare a destra print(input()-1^input()-1). Sulla necessità o meno dell'importazione: altri utenti Python su questo sito non la includono per i programmi che usano input(), ma non sono un programmatore Python, quindi non posso dire se è necessario o meno.
Gareth,

@Gareth In realtà stavo usando Python 3, ma mi piace usare il tuo suggerimento print(input()-1^input()-1). Grazie per l'aiuto!
Rob,

Posso chiederti perché importi sys?
Jonathan Frech,

2

MATL , 2 byte

Z~

Provalo online!

MATL post-data la sfida di diversi anni, ma, ehi, l'indicizzazione naturale basata su 1 e una funzione xor bit a bit rendono questo bello e pulito!



0

Javascript 13 byte

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>


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.