เมทริกซ์จากน้อยไปมาก


17

"เมทริกซ์จากน้อยไปมาก" เป็นเมทริกซ์ที่ไม่มีที่สิ้นสุดของจำนวนเต็ม (รวม 0) ซึ่งองค์ประกอบใด ๆ เป็นองค์ประกอบที่มีขนาดเล็กที่สุดซึ่งไม่เคยใช้ในแถวและคอลัมน์นั้นมาก่อน:

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

งานของคุณคือการเขียนโปรแกรมที่จะส่งออกองค์ประกอบที่พบในแถวและคอลัมน์ที่ระบุโดยการป้อนข้อมูล (อินพุตและเอาต์พุตมาตรฐาน)

กรณีทดสอบ:

5 3 -> 6
2 5 -> 5

ใช้กฎของรหัสกอล์ฟ - รหัสที่สั้นที่สุดชนะ

ป.ล. แม้ว่าสิ่งนี้จะมีลักษณะของอัลกอริทึม แต่รหัสก็สามารถรัดกุมมากได้

แก้ไข:ฉันไม่ได้คาดหวังว่าจะเห็นทางออกของ xor ตั้งแต่ต้น ฉันหวังว่าจะเห็น 10 โพสต์ด้วยวิธีอัลกอริทึมและจากนั้นโซลูชัน xor ตอนนี้เมื่อทราบว่ามันไม่สนุกมากที่จะเห็นวิธีการเขียน xor ในภาษาต่าง ๆ ฉันขอแนะนำให้คุณลองใช้วิธีอัลกอริทึม

ดังนั้นใช่ฉันคิดว่าไม่มีใครสามารถเอาชนะเครื่องหมาย 5 ตัวได้ในตอนนี้ดังนั้นฉันขอแสดงความยินดีกับ Ilmari Karonen สำหรับวิธีแก้ปัญหาที่ฉลาดและสั้นที่สุด แต่มีความท้าทายใหม่ขึ้นข้างหน้า: เขียนวิธีการแก้ปัญหาอัลกอริทึมที่สั้นที่สุด


5
แฮคเกอร์เป็นอัลกอริทึม
Peter Taylor

คำตอบ:


10

GolfScript 5 ตัวอักษร

~(\(^

แท้จริงแล้วงานนี้ง่ายมากเมื่อคุณรับรู้รูปแบบ บิตที่น่าอึดอัดใจเพียงอย่างเดียวคือการจัดทำดัชนีแบบ 1 หากดัชนีอินพุทเป็นแบบอิงศูนย์โซลูชัน 2 ตัวอักษรนี้น่าจะพอเพียง:

~^

เพื่ออธิบายสิ่งนี้แก่ผู้อ่านที่ไม่คุ้นเคยกับ GolfScript ~คำสั่งจะทำการแปลงค่าอินพุตให้เหลือตัวเลขสองตัวบนสแต็ก ^จากนั้น XORs ตัวเลขสูงสุดสองตัวบนสแต็กเข้าด้วยกันโดยปล่อยให้ผลลัพธ์ออกมา ในการจัดการกับอินพุตแบบอิง 1 จำเป็นต้องใช้คำสั่งอีกสองคำสั่ง: (ลดจำนวนสูงสุดบนสแต็กทีละหนึ่งขณะที่\สลับรายการสองอันดับแรกบนสแต็ก


1
คุณช่วยอธิบายได้^มั้ย ฉันหมายถึงGolfScript Built-ins หน้าและสมมาตรแตกต่าง ; การใช้การดำเนินการนี้กับอาร์เรย์สองชุดนั้นสมเหตุสมผล แต่ฉันไม่เข้าใจว่ามันใช้งานอย่างไรสำหรับตัวเลขสองตัวแยกกัน
Rob

1
@ ไมค์: เมื่อนำไปใช้กับตัวเลขที่^ผู้ประกอบการส่งกลับของพวกเขาXOR บิต
Ilmari Karonen

นั่นคือความสัมพันธ์ที่เจ๋งมาก :)
beary605

1
คุณถูกต้องในการประเมินผลการตอบกลับของฉันซึ่งฉันได้ลบออกไปเพราะตั้งอยู่บนพื้นฐานของความท้าทายที่ผิดพลาด
DavidC

2

Mathematica 10 44

แก้ไข

คำตอบแรกของฉันขึ้นอยู่กับความเข้าใจผิดเกี่ยวกับธรรมชาติของความท้าทายตามที่ Ilmari ระบุไว้ ลองอีกครั้ง

การใช้

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

@IlmariKaronen ฉันคิดว่าฉันเข้าใจถูกแล้ว แต่มันก็ไม่ได้ใกล้เคียงกับขนาดของโซลูชันของคุณ
DavidC

2

K, 31

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

ตรรกะ XOR ของ Stole Ilmari Karonen ซึ่งฉันจะไม่มีวันได้เห็นตัวเอง


2

PHP, 38

เพียงใช้งานง่ายกับ XOR ของ Ilmari Karonen

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

การใช้งาน:

... / xor.php อย่างไร = 4 & B = 7

จะพิมพ์ 6


2

Haskell 174

คิดว่าฉันจะแก้ปัญหาที่ไม่พึ่งพา XOR ขี้เกียจเกินไปที่จะเล่นกอล์ฟอย่างถูกต้อง

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)

แก้ไข:ฉันตระหนักได้ในวันต่อมาว่านี่เป็นเพียงการคำนวณ XOR ดังนั้นหากนับเป็นวิธีแก้ปัญหาอัลกอริทึมดังนั้น Ilmari Karonen จึงควร


2
ขี้เกียจเกินไปที่จะเล่นกอล์ฟอย่างถูกต้อง - กรุณาส่งผลงานของคุณเพื่อที่จะเป็นคู่แข่งที่สำคัญ
Jonathan Frech

2

Python 2, 36

ฉันคิดตั้งแต่ฉันเพิ่งเริ่มเรียนรู้ Python ว่านี่เป็นเวลาที่เหมาะสมในการส่งคำตอบแรกของฉันโดยใช้ (และไม่มีใครตอบโดยใช้ Python) และบางทีฉันอาจได้รับคำติชมบางอย่าง

ขอบคุณ @IlmariKaronen สำหรับทางลัดที่เจ๋งมาก

ขอบคุณ @Gareth สำหรับรหัสด้านล่าง

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

Python 3, 56

โปรแกรมต้นฉบับที่ฉันเขียน

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

IDEONE ที่มี 2 และ 5

IDEONE ที่มี 3 และ 3


ฉันสมมติว่าคุณใช้ Python 2 มากกว่า Python 3 หากไม่สนใจความคิดเห็นนี้ inputประเมินอินพุตเรียบร้อยแล้วดังนั้นint()ไม่ควรจำเป็น นอกจากนี้เนื่องจากคุณได้รับ int โดยตรงจากinput()คุณสามารถทำได้-1ทันที print(input()-1^input()-1)นอกจากนี้คุณยังสามารถกำจัดตัวแปรตัวกลางสมบูรณ์และไปที่เหมาะสมสำหรับ สำหรับการนำเข้านั้นมีความจำเป็นหรือไม่ผู้ใช้ Python รายอื่นในเว็บไซต์นี้ไม่ได้รวมโปรแกรมที่ใช้input()แต่ฉันไม่ใช่โปรแกรมเมอร์ของ Python ดังนั้นฉันจึงไม่สามารถพูดได้ว่าจำเป็นหรือไม่
Gareth

@Gareth ที่จริงผมก็ใช้งูหลาม 3 print(input()-1^input()-1)แต่ผมชอบข้อเสนอแนะของคุณเพื่อการใช้งาน ขอบคุณสำหรับความช่วยเหลือ!
Rob

ผมอาจจะถามว่าทำไมคุณนำเข้าsys?
Jonathan Frech




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.