Artan matris


17

"Yükselen matris", herhangi bir öğenin, ilgili satır ve sütunda daha önce kullanılmamış olan en küçük eleman olduğu tam sayıların (0 dahil) sonsuz bir matrisidir:

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

Göreviniz, girdi tarafından belirtilen satır ve sütunda bulunan öğeyi çıktılayacak bir program yazmaktır. (standart giriş ve çıkış)

Test senaryoları:

5 3 -> 6
2 5 -> 5

Code Golf kuralları geçerlidir; en kısa kod kazanır.

PS Bu algoritmik bir yapıya sahip olsa bile, kod çok ama çok özlü olabilir.

EDIT: xor çözümünü bu kadar erken görmeyi beklemiyordum. Gerçekten algoritmik bir yaklaşım ve daha sonra xor çözümü ile 10 yazı görmek umuyordum. Şimdi, farklı dillerde xor yazmanın çok eğlenceli olmadığını akılda tutarak algoritmik bir yaklaşım denemenizi tavsiye ederim.

Evet, sanırım şimdi kimse 5 karakter işaretini geçemez - bu nedenle Ilmari Karonen'i en akıllı ve en kısa çözüm için tebrik ediyorum. Ancak ileride yeni bir zorluk var: en kısa algoritmik çözümü yazın .


5
Xor algoritmiktir.
Peter Taylor

Yanıtlar:


10

GolfScript, 5 karakter

~(\(^

Gerçekten de, kalıbı tanıdığınızda bu görev çok basittir. Tek garip bit 1 tabanlı indeksleme - giriş endeksleri sıfır tabanlıysa, bu 2 karakterli çözüm yeterli olacaktır:

~^

Bunu GolfScript'e aşina olmayan okuyuculara açıklamak için, ~komut girdiyi değiştirir ve iki sayıyı yığın üzerinde bırakır. ^sonra XOR yığındaki en üstteki iki sayıyı bir araya getirerek sonucu çıktı için bırakır. 1 tabanlı girişle başa çıkmak için iki komut daha gerekir: (yığındaki en üstteki sayıyı bir azaltır, yığındaki \en üstteki iki öğeyi değiştirir.


1
Lütfen açıklayabilir misiniz? ^ ? Ben anılacaktır GolfScript Yerleşik ins sayfa ve Simetrik farkı ; Bu işlemi iki dizi diziyle kullanmak mantıklıdır, ancak sadece iki ayrı sayı için nasıl çalıştığını anlamıyorum.
Rob

1
@Mike: Sayılara uygulandığında, ^operatör bitsel XOR değerini döndürür .
Ilmari Karonen

Bu çok güzel bir ilişki :)
beary605

1
O zamandan bu yana zorluğun yanlış anlaşılmasından dolayı kaldırdığım yanıtımı değerlendirdiğinizde haklıydınız.
DavidC

2

Mathematica 10 44

Düzenle

İlk cevabım, Ilmari'nin belirttiği gibi, zorluğun doğası hakkında bir yanlış anlaşılmaya dayanıyordu. İşte başka bir deneme.

kullanım

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

@IlmariKaronen Sanırım bu sefer doğru anladım. Ancak çözümünüzün boyutuna bile yaklaşmıyor.
DavidC

2

K, 31

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

Kendimi asla fark etmeyeceğim Ilmari Karonen'in XOR mantığını çaldım.


2

PHP, 38

Ilmari Karonen'in XOR'unun basit bir uygulaması

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

Kullanımı:

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

yazdıracak 6


2

Haskell 174

XOR'a dayanmayan bir çözüm yapacağımı düşündüm. Düzgün golf için çok tembel.

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)

Düzenleme: Bir gün sonra bu sadece XOR hesaplıyor fark ettim. Eğer bu algoritmik bir çözüm olarak sayılırsa, Ilmari Karonen'in de öyle.


2
Düzgün golf için çok tembel. - Lütfen ciddi bir yarışmacı olması için gönderinizi golf.
Jonathan Frech

2

Python 2, 36

Ben sadece Python öğrenmeye başladığımdan beri, ilk cevabımı kullanarak göndermek için mükemmel bir zaman olacağını anladım (ve hiç kimse Python kullanarak cevap vermedi) ve belki de bazı geri bildirimler alabilirim.

@IlmariKaronen'a çok güzel kısayol için teşekkür ederiz.

Aşağıdaki kod için @Gareth'e teşekkür ederiz.

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

Python 3, 56

Yazdığım orijinal program.

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

2 ve 5'li IDEONE

3 ve 3 ile IDEONE


Bu yorumu göz ardı etmezseniz, Python 3 yerine Python 2 kullandığınızı varsayıyorum. inputgirişi zaten değerlendirir, bu yüzden gerekli int()olmamalıdır. Ayrıca doğrudan int bir int alıyorsanız hemen input()yapabilirsiniz -1. Ayrıca aracı değişkenlerden tamamen kurtulabilir ve doğru yola çıkabilirsiniz print(input()-1^input()-1). İçe aktarmanın gerekli olup olmadığı konusunda - bu sitedeki diğer Python kullanıcıları bunu kullanan programlar için içermez input(), ancak bir Python programcısı değilim, bu yüzden gerekli olup olmadığını söyleyemedim.
Gareth

@Gareth Aslında Python 3 kullanıyordum, ancak önerilerinizi kullanmayı seviyorum print(input()-1^input()-1). Yardım için teşekkürler!
Rob

Neden ithal ettiğinizi sorabilir miyim sys?
Jonathan Frech

2

MATL , 2 bayt

Z~

Çevrimiçi deneyin!

MATL, meydan okumayı birkaç yıl sonra erteliyor, ancak, hey, doğal 1 tabanlı indeksleme ve bitsel bir xor fonksiyonu bunu güzel ve düzenli hale getiriyor!



0

Javascript 13 bayt

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>


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.