หมากรุกสามมิติ


26

เพื่อปกป้องการตัดสินใจของใครบางคนที่ทำให้งงงันคนมักจะพูดว่าคนคนนั้นจะไปหัวของทุกคนและเล่น "หมากรุกสามมิติ" ตอนนี้เป็นโอกาสของคุณที่จะเล่นหมากรุกสามมิติ!

กฎระเบียบ

มีหมากรุก 3 มิติหลายแบบแต่สำหรับความท้าทายนี้ฉันได้ทำขึ้นมาเอง เวอร์ชันของฉันเหมือนกับหมากรุกทั่วไปยกเว้นชิ้นส่วนนั้นอยู่ภายในลูกบาศก์แทนที่จะเป็นสี่เหลี่ยมจัตุรัสและตอนนี้มีมิติของการเคลื่อนไหวเพิ่มเติม ที่จะทำให้ความท้าทายนี้ง่ายมีไม่มีเบี้ยและไม่มี castling

การเคลื่อนไหวของชิ้น

(ทิศทางเข็มทิศหมายถึงการเคลื่อนไหวที่จะเกิดขึ้นบนกระดานหมากรุกมาตรฐานขึ้นและลงหมายถึงการเคลื่อนที่ในแนวตั้งบนกระดานหมากรุก 3 มิติ)

  • King - มี 26 สี่เหลี่ยมซึ่งสามารถไปในเทิร์นที่กำหนด: N, NE, E, SE, S, SW, W, NW; เช่นเดียวกับขึ้นลงและขึ้น / ลง + หนึ่งในทิศทางเข็มทิศ
  • Queen - สามารถไปในทิศทางเดียวกับ King แต่เท่าที่เธอต้องการในทิศทางนั้น
  • Rook - สามารถเคลื่อนที่ได้ 6 ทิศทาง: N, E, S, W, ขึ้นและลง
  • บิชอป - มีทิศทางการท่องเที่ยว 8 ทิศทาง: NE + ขึ้น / ลง, SE + ขึ้น / ลง, SW + ขึ้น / ลง, NW + ขึ้น / ลง
  • Knight - ย้าย 2 ช่องว่างหนึ่งแกนจากนั้นอีก 1 ช่องบนอีกช่องหนึ่ง เช่นเดียวกับหมากรุกทั่วไปอัศวินเป็นชิ้นเดียวที่สามารถกระโดดข้ามชิ้นอื่น ๆ

เครื่องทดสอบชิ้น

ใช้ตัวอย่างนี้เพื่อดูว่าชิ้นส่วนต่าง ๆ เคลื่อนที่บนกระดาน 3D อย่างไร ( เคล็ดลับ : ตรวจสอบ*Testฟังก์ชั่นใน JS เพื่อหาวิธีที่รวดเร็วในการตรวจสอบว่าสแควร์เป็นการเคลื่อนไหวที่ถูกต้องหรือไม่

const color = "Black";
const pieces = ["N","B","R","Q","K"];
const urls = ["https://image.ibb.co/gyS9Cx/Black_N.png","https://image.ibb.co/dknnzc/Black_B.png","https://image.ibb.co/kb3hXx/Black_R.png","https://image.ibb.co/hGO5kH/Black_Q.png","https://image.ibb.co/jApd5H/Black_K.png"];
var dragPiece;
var size = 3;
var index = 0;
function start() {
Array.prototype.add = function(a) {return [this[0]+a[0],this[1]+a[1],this[2]+a[2]]};

document.getElementById("n").onchange=function() {
	size = parseInt(this.value);
	var s = document.getElementsByClassName("selected");
	var pos;
	if(s.length > 0) {
		pos = s[0].pos;
	}
	document.body.removeChild(document.body.firstChild);
	createBoards();
	if(pos != null && valid(...pos)) {
	cellAt(...pos).click();
	}
};
createBoards();
}

function createBoards() {
var boards = document.createElement("div");
boards.style.counterReset = "board-count "+(size+1);
boards.name=size;
for(var x = 0;x<size;x++) {
var t = document.createElement("table");
for(var i = 0;i<size;i++) {
  var row = document.createElement("tr");
  row.className="row";
  for(var j = 0;j<size;j++) {
  	var cell = document.createElement("td");
    cell.className = (size+i+j)%2 == 1 ? "black" : "white";
    var im = document.createElement("img");
    im.draggable = true;
    im.ondragstart = function(e) {dragPiece = this;e.dataTransfer.setData("piece",this.parentElement.name);
    this.parentElement.classList.add("start");
    this.classList.add("dragged");
    };
    im.ondragend = function(e) {this.parentElement.classList.remove("start");this.classList.remove("dragged");};
    im.hidden = true;
    cell.appendChild(im);
    cell.pos = [j,i,x];
    cell.ondragover = function(e) {e.preventDefault();};
    cell.ondragenter = function(e) {this.classList.add("drag");};
    cell.ondragleave = function(e) {this.classList.remove("drag");};
    cell.ondrop = function(e) { e.preventDefault();this.classList.remove("drag");
    if(this != dragPiece.parentElement && this.firstChild.hidden ){
    dragPiece.hidden=true;
    setPiece(this,e.dataTransfer.getData("piece"));
    }
    
    };
    cell.onclick = function() {
    if(this.firstChild.hidden == false && this.classList.contains("selected")) {
		index++;
    	if(index == pieces.length) index = 0;
    }
     	setPiece(this,pieces[index]);
    };
  
    
    row.appendChild(cell);
  }
  t.appendChild(row);
  }
  boards.appendChild(t);
  }
  document.body.insertBefore(boards,document.body.firstChild);
}



function clearHighlighted() {
	var sel =  document.getElementsByClassName("highlighted");
     while(sel.length > 0) {
     	sel[0].classList.remove("highlighted");
     }
}

function setPiece(cell,piece) {
var s=document.getElementsByClassName("selected");
if(s.length > 0){ s[0].firstChild.hidden=true;s[0].classList.remove("selected");}
cell.classList.add("selected");
cell.firstChild.hidden = false;
cell.name = piece;
     	cell.firstChild.src = urls[index];
     clearHighlighted();
     	showMoves(cell,piece);
}

function showMoves(cell,piece) {
	if(piece=="K") selector(cell,kingTest)
	else if(piece=="N") selector(cell,knightTest);
	else if(piece=="Q") selector(cell,queenTest);
	else if(piece=="R") selector(cell,rookTest);
	else if(piece=="B") selector(cell,bishopTest);
}

function cellAt(col,row,board) {
	return document.body.firstChild.children[board].children[row].children[col];
}

function valid(col,row,board) {
	return 0<=col && col<size && 0<=row && row<size && 0<=board && board<size;
}

function select(cell) {
if(cell != null && cell.firstChild.hidden) cell.classList.add("highlighted");
}



function rookTest(dist) {
	var d = [].concat(dist).sort();
	return d[0] == 0 && d[1] == 0;
}

function knightTest(dist) {
	var d = [].concat(dist).sort();
	return d[0] == 0 && d[1] == 1 && d[2] == 2;
}

function kingTest(dist) {
	return dist[0] <= 1 && dist[1] <= 1 && dist[2] <= 1;
}

function bishopTest(dist) {
	return dist[0]==dist[1] && dist[1]==dist[2];
}

function queenTest(dist) {
	var d = [].concat(dist).sort();
	return rookTest(dist) || bishopTest(dist) || (d[0]==0 && d[1]==d[2]) ;
}

function dist(cell,x,y,z) {
	return [Math.abs(cell.pos[0]-x),Math.abs(cell.pos[1]-y),Math.abs(cell.pos[2]-z)];
}

function selector(cell,test) {
	for(var i = 0;i<size;i++) {
		for(var j = 0;j<size;j++) {
			for(var k = 0;k<size;k++) {
			if(test(dist(cell,k,j,i))) {
				var c = cellAt(k,j,i);
				if(c != cell) select(c);
			}
			}
			}
			}
	
}
table
{
	padding: 10px;
  display:inline-block;
}

table:after
{
  counter-increment: board-count -1;
  content: "("counter(board-count,upper-roman)")";
  float:right;
}

td
{
  width:28px;
  height:28px;
  border: 1px solid;
  cursor: pointer;
}

.black
{
  background-color: rgba(127,127,127,0.6);
}

.white
{
  background-color: white;
}


.start {
background-color: rgba(0,204,0,0.6);
}

.highlighted {
background-color: rgba(0,255,0,0.6);
}

.drag
{
background-color: rgba(0,204,255,0.6);
}


.selected {
background-color: green;
cursor: grab;
}

.selected img
{
  display:block;
}

.dragged {
  cursor: grabbing;
}
<body data-size=3 onload="start()"
<label for="n">Size: </label><select id="n">
<option>2</option>
<option selected>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
</select>
<div>Click or drag to place the piece. Click on the piece to change its type.</div>
</body>

ท้าทาย

รับn x n x nรีด, ตรวจสอบว่ากษัตริย์สีขาวอยู่ในรุกฆาต

อินพุต

  • (ไม่บังคับ) n ≥ 2 - ขนาดของบอร์ด
  • บอร์ดเกม
    • สามารถอยู่ในรูปแบบของ 1d- 2d- หรือ 3d- อาร์เรย์หรือรูปแบบอื่นที่คล้ายคลึงกัน สัญลักษณ์สามารถอยู่ในรูปแบบที่เรียบง่าย ตัวอย่างเช่น KQRBN (White) และ kqrbn (Black) ที่มี # สำหรับคิวบ์เปล่า หรือใช้ตัวเลขสำหรับค่าต่าง ๆ
    • ลองนึกถึงกระดานหมากรุกสามมิติโดยมีกระดานหลายกระดานเรียงซ้อนกันและเรียงลำดับจากบนลงล่าง จากนั้นแต่ละบอร์ดจะได้รับการจดบันทึกจากซ้ายไปขวากลับไปข้างหน้า (ด้านดำถึงด้านขาว)
    • ลองนึกภาพกรณี 2x2x2 ที่กำหนดเป็นอาร์เรย์ 3D:
 [
[[BQ] [##]]
[[BN] [KQ]]
]

บอร์ด "top": ป้อนคำอธิบายรูปภาพที่นี่"bottom" board:ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุต

  • บูลีน (ความจริง / ค่าเท็จ) - จริงถ้ากษัตริย์สีขาวอยู่ในรุกฆาตเป็นเท็จอย่างอื่น

รุกฆาต

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

สเปค

  • คุณจะไม่ได้รับบอร์ดที่กษัตริย์สีดำพยายามที่จะ "ตรวจสอบ" ราชาสีขาวหรือกระดานที่กษัตริย์ทั้งสองอยู่ในการตรวจสอบ (สถานการณ์ที่เป็นไปไม่ได้)

กรณีทดสอบ

  1. n = 3 [###,n##,#rr],[#b#,###,###],[###,###,bRK]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

    ผลลัพธ์: จริง

    คำอธิบาย: กษัตริย์กำลังได้รับเช็คจากคนโกงที่ชั้นบนสุด โกงสีขาวไม่สามารถปิดกั้นการโจมตีหรือจับโกงที่คุกคามดังนั้นกษัตริย์จะต้องพยายามที่จะย้ายออกจากทาง ลองพิจารณาตัวเลือกการย้ายของกษัตริย์:

    1. c2 (I) - ได้รับการคุ้มกันโดยบาทหลวงที่ b3 (II)
    2. b2 (I) - ได้รับการปกป้องโดยอัศวินที่ a2 (III)
    3. c1 (II) - ปกป้องโดย rook ที่ c1 (III)
    4. b1 (II) - เตรียมพร้อมโดย rook ที่ b1 (III)
    5. c2 (II) - ได้รับการปกป้องโดยอัศวินที่ a2 (III)
    6. b2 (II) - ปกป้องโดยอธิการที่ a1 (I)

เนื่องจากกษัตริย์ไม่สามารถหลบหนีการตรวจสอบมันเป็นรุกฆาต!

  1. n = 3 [b#b,###,###],[###,###,RNR],[#q#,###,#K#]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

    เอาท์พุท: คำอธิบายที่ผิด : กษัตริย์ได้รับเช็คจากราชินีและไม่มีท่าใดที่จะหลบหนีหรือขวางกั้นได้ อย่างไรก็ตามอัศวินสามารถจับราชินีได้

  2. n = 3 [#q#,#b#,###],[n##,###,###],[#k#,###,#KB]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: คำอธิบายที่ผิด : สีขาวไม่มีทางที่จะจับราชินีที่คุกคามหรือย้ายกษัตริย์ของเขาไปสู่ความปลอดภัย อย่างไรก็ตามโดยการย้ายอธิการของเขาไปที่ b2 (II) White สามารถสกัดกั้นการคุกคามของราชินีได้

  1. n = 4, [####,####,r###,####],[####,#q##,####,####],[##r#,###b,####,BRnn],[####,####,#N##,#KQ#]

    ป้อนคำอธิบายรูปภาพที่นี่(IV) ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

    เอาท์พุท: จริงคำอธิบาย: ในกรณีนี้กษัตริย์ได้รับเช็คจากหนึ่งในอัศวินและราชินี แม้ว่า White สามารถจับ / บล็อกหนึ่งในส่วนการตรวจสอบได้ แต่เขาไม่สามารถจับ / บล็อกทั้งสองอย่างได้ ดังนั้นไวท์ต้องพยายามย้ายกษัตริย์ออกจากเช็ค แต่เขาไม่มีทางเลือก

  2. n = 3 [###,##b,r#r],[###,###,###],[#k#,###,#K#]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: เท็จคำอธิบาย: สีขาวไม่ได้อยู่ในการตรวจสอบ แต่มีวิธีการเคลื่อนย้ายโดยไม่ได้รับการตรวจสอบ ดังนั้นจึงเป็นทางตัน แต่ไม่ใช่รุกฆาต

  1. n = 3 [##k,###,r#K],[###,n##,#N#],[###,###,#Q#]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: คำอธิบายที่แท้จริง : สีขาวต้องการที่จะโฉบเฉี่ยวกับราชินีของเขาเพื่อปกป้องกษัตริย์ของเขา แต่อัศวินของเขากำลังปิดกั้นเส้นทาง

  1. n = 3 [###,###,##q],[###,###,###],[#k#,###,rNK]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: คำอธิบายที่แท้จริง : สีขาวไม่สามารถนำราชินีกับอัศวินของเขาเพราะแล้วโกงจะตรวจสอบกษัตริย์ของไวท์

  1. n = 2 [#q,##],[##,K#]

    ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: เท็จคำอธิบาย: สีขาวสามารถจับราชินีกับกษัตริย์

  1. n = 2 [rq,##],[##,K#]

    ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: คำอธิบายที่แท้จริง : คราวนี้เกมโกงกำลังปกป้องดังนั้นกษัตริย์ไม่สามารถจับราชินีได้

  1. n = 3 [###,###,#q#],[###,###,###],[#k#,###,BKn]

    ป้อนคำอธิบายรูปภาพที่นี่(III) ป้อนคำอธิบายรูปภาพที่นี่(II) ป้อนคำอธิบายรูปภาพที่นี่(I)

เอาท์พุท: เท็จคำอธิบาย: กษัตริย์สีขาวสามารถหลบหนีได้โดยการจับอัศวิน


เพียงแค่รายละเอียด แต่จะไม่cell.className = (i + j)%2 == 0 ? "black" : "white"ดีกว่าในตัวอย่างหรือไม่
Arnauld

@Arnauld ฮ่า ๆ ลืมแก้ไขสิ่งที่ชัดเจนที่สุด
geokavel

ขนาดกระดานใหญ่ที่สุดที่เราต้องการสนับสนุนคืออะไร?
Weijun Zhou

1
@ WeijunZhou โดยทั่วไปคุณควรทำแบบทดสอบในเวลาที่เหมาะสมเพื่อดูว่ารหัสของคุณใช้งานได้หรือไม่ สำหรับจำนวนที่มากขึ้นมันก็แค่ต้องทำงานตามหลักทฤษฏีตามเวลาและความจำที่ไม่มีขีด จำกัด
geokavel

คำตอบ:


5

Ruby , 412 413 ไบต์

->b,w=2{n=b=~/\n/
g=->h{h[0]-~n*(h[1]-~n*h[2])} 
r=1
(n**6).times{|i|a=b*1     
m=[]
9.times{|j|m<<(j<6?i/n**j%n:m[j-6]-m[j-3])}
x,y,z=v=m[6,3].map{|j|j*j}
d=v.max
e=x+y+z
q=95&o=(t=a[p=g[m[3,3]]]).ord
k=a[s=g[m]].ord
o/32==w&&(o^k>31||k==75)&&((q%8==2&&q%9*d==e||q==81&&x%d+y%d+z%d<1)&&((1...c=d**0.5).map{|j|a[p+g[m[6,3]]/c*j]}+[?#]).max<?A||q==78&&e==5||q==75&&e<4)&&(a[p]=?0;a[s]=t;r&&=w>2?a=~/K/:!f[a,3])}
r}

ลองออนไลน์! ตรวจสอบตอนนี้ในกรณีทดสอบทั้งหมด รหัสเพิ่มขึ้น 1 ไบต์เพื่อแก้ไขข้อบกพร่องในกรณีที่ 5 (กรณีตัวจนมุม)

ฟังก์ชัน Llambda ที่ต้องการอินพุตเป็นสตริงในรูปแบบที่แสดงด้านล่าง สามารถกำหนดพารามิเตอร์ตัวที่สองที่เป็นทางเลือกซึ่งระบุกลุ่มของรหัส ASCII 32 ตัวที่จะนำมาพิจารณาในการย้ายครั้งต่อไป (โดยค่าเริ่มต้น 2 นี้สอดคล้องกับตัวอักษรตัวพิมพ์ใหญ่ / สีขาว แต่ฟังก์ชั่นเรียกตัวเองซ้ำโดยใช้ 3 )

ระดับการเรียกซ้ำ 1: พยายามย้ายที่เป็นไปได้ทั้งหมดสำหรับสีขาว (คิวบ์ใด ๆ ไปยังคิวบ์ใด ๆ ) และทำตามขั้นตอนที่ถูกกฎหมายทั้งหมด ระดับการเรียกซ้ำ 2: ในแต่ละกรณีมันจะเรียกตัวเองให้ก้าวผ่านการเคลื่อนไหวที่เป็นไปได้ทั้งหมดสำหรับสีดำ ผลตอบแทนนี้จะเป็นจริงถ้าราชาขาวรอดชีวิตจากการเคลื่อนไหวสีดำที่เป็นไปได้ทั้งหมด ระดับการเรียกซ้ำ 1: หากการเคลื่อนไหวสีขาวที่เป็นไปได้ทั้งหมดนำไปสู่สถานการณ์ที่ราชาสีขาวไม่รอดการเคลื่อนไหวสีดำที่เป็นไปได้ทั้งหมดให้ส่งคืนจริง (มิฉะนั้นเป็นเท็จ)

โดยทั่วไปแล้วชิ้นส่วนไม่สามารถย้ายไปยังสี่เหลี่ยมจัตุรัสที่ครอบครองโดยชิ้นส่วนที่เป็นมิตร เพื่อพิจารณากรณีที่สีขาวไม่ย้ายเลย (ด้วยเหตุนี้รุกฆาตไม่จนมุม) ในกรณีที่กษัตริย์ "ย้าย" ไปที่จัตุรัสที่เขาได้รับอนุญาต ด้วยเหตุผลของรหัสย่อชิ้นส่วนสีขาวอื่น ๆ ยังได้รับอนุญาตให้ย้ายไปยังจตุรัสที่ครอบครองโดยราชาสีขาว นี่เป็นการเคลื่อนไหวที่ไร้สาระ แต่การอนุญาตจะไม่ส่งผลกระทบต่อผลลัพธ์ดังนั้นจึงไม่ใช่ปัญหา

การทดสอบต่อไปนี้ใช้เพื่อตรวจสอบว่าการเคลื่อนไหวนั้นถูกต้องสำหรับแต่ละชิ้นหรือไม่ x,y,zคือกำลังสองของระยะทางที่เดินทางในแต่ละแกน eคือผลรวมของเหล่านี้ (ด้วยเหตุนี้กำลังสองของระยะยูคลิด) และdเป็นค่าสูงสุด ประเภทชิ้นส่วนคือ ANDed กับ 95 เพื่อแปลงค่า ASCII ตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่

Bishop and Rook (ASCII 66 and 82) For the rook e=1*d. For the bishop e=3*d. 
The same code is used for both with q%9 giving 1 and 3 respectively.

Queen (ASCII 81) x%d+y%d+z%d<1 Each axis must be 0 or d, so this sum must be 0.

For the above pieces, any cubes crossed must be checked to ensure they are empty.

Knight (ASCII 78) e=5

King (ASCII 75) e<4

แสดงความคิดเห็นรหัส

->b,w=2{                                                        #board, colour to move (default upcase/white)
  n=b=~/\n/                                                     #n=board size (index of first newline.)
  g=->h{h[0]-~n*(h[1]-~n*h[2])}                                 #Function to calculate position in string based on array of 3d coordinates.
  r=1                                                           #Return value = truthy.
  (n**6).times{|i|                                              #Iterate through n**6 moves (n**3 start cubes and n**3 end cubes.)
    a=b*1      
    m=[]                                                        #Make an empty array for coordinates.                                             
    9.times{|j|m<<(j<6?i/n**j%n:m[j-6]-m[j-3])}                 #Split i into six base n digits for the start and end coordinates. also derive 3 relative move distances.
    x,y,z=v=m[6,3].map{|j|j*j}                                  #v=array of relative distances squared. x,y,z are the 3 individual relative distances squared.
    d=v.max                                                     #Max of x,y,z                                     
    e=x+y+z                                                     #Square of euclidean distance
    q=95&o=(t=a[p=g[m[3,3]]]).ord                               #t=contents of cube to move from. o=ascii value, q=uppercase of o.
    k=a[s=g[m]].ord                                             #k=ascii value of contents of cube to move to.
    o/32==w&&(o^k>31||k==75)&&                                  #If o is in the right 32 byte range (uppercase or lowercase) AND the destination contains the white king or a character not in the same 32 byte range AND...
      ((q%8==2&&q%9*d==e||q==81&&x%d+y%d+z%d<1)&&               #the piece is a rook, bishop or queen with a valid move (as described in the text) AND..
      ((1...c=d**0.5).map{|j|a[p+g[m[6,3]]/c*j]}+[?#]).max<?A|| #the intervening squares are all empty, OR..
      q==78&&e==5||                                             #the piece is a knight and the move has euclidean distance sqrt(5) OR..
      q==75&&e<4)&&                                             #the piece is a king and the move has euclidean distance <4 THEN
      (a[p]=?0;a[s]=t;r&&=w>2?a=~/K/:!f[a,3])                   #put a 0 in the start cube and put the piece in the end cube. If moved piece is black, is the white king still there? AND with return value.
  }                                                             #If moved piece is white, recursively call the f to carry out the black moves. Does the white king NOT survive some black moves? AND with return value.
r}

คุณไม่สามารถตีสิ่งนี้โดยใช้ค่า ASCII 1 หลักใช่หรือไม่ นอกจากนี้คุณหมายถึง "stalemate not checkmate" ในย่อหน้าที่สามหรือไม่
geokavel

@geokavel การแสดงสั้นที่สุดของค่า ascii เดียวใน Ruby คือ ?A(มีตัวอย่างในโค้ด) ดังนั้นมันจึงยังคงเป็น 2 ไบต์ "A"ยังดีกว่าบางภาษาที่ต้องใช้ มีการปรับแต่งบางอย่างที่ทำได้ดีกว่าด้วยค่า ASCII มากกว่าตัวอักษร (โดยเฉพาะอย่างยิ่งo^k>31ซึ่งทำให้มั่นใจได้ว่าชิ้นส่วนสามารถย้ายไปยังจตุรัสที่ว่างหรือหนึ่งชิ้นที่ครอบครองโดยชิ้นส่วนที่เป็นมิตร แต่ไม่เป็นศัตรู)
Level River St

ฉันหมายถึงรุกฆาตไม่ได้จนมุม ทางตันคือสถานการณ์ที่พระราชาถูกคุกคามหากผู้เล่นเคลื่อนที่ รุกฆาตเป็นสถานการณ์ที่พระราชาถูกคุกคามหากผู้เล่นย้ายและถ้าเขาไม่ได้
เลเวลริเวอร์เซนต์

ถ้าคุณใช้ค่า int แทนค่า ascii (เช่นอาร์เรย์ของ ints แทนสตริง)
geokavel

@geokavel ints อาจจะสั้นลงและฉันอาจแก้ไขได้ในภายหลังเนื่องจากได้รับอนุญาตเป็นพิเศษโดยสเป็ค แต่ฉันไปกับรูปแบบที่เลือกส่วนหนึ่งเพราะมนุษย์อ่านได้ง่ายกว่า (พัฒนาได้ง่ายกว่า) และอีกส่วนหนึ่งเพราะฉันได้รับแรงบันดาลใจจากคำตอบของฉันที่มีอิทธิพลต่อความคิดของฉัน: codegolf.stackexchange.com/a/45544/15599
ระดับ River St
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.