Java - 522 434 228 213 ตัวอักษร
แก้ไขโดยการตรวจสอบจำนวนเต็ม n-tuples ทั้งหมดที่เป็นไปได้อย่างเป็นระบบโดยการคูณโดยตรงจนกว่าจะพบว่าใช้ได้
ฟังก์ชั่นใช้เมทริกซ์ยิ่ง, A, เวกเตอร์โซลูชันทดลอง, x และมิติ, n, เป็นเวกเตอร์โซลูชันอินพุต - เอาท์พุต, x โปรดทราบว่าเวกเตอร์ x มีขนาดใหญ่กว่ามิติหนึ่งเพื่อช่วยในการแก้ไขปัญหาที่อาจเกิดขึ้น (ถ้าฉันประกาศตัวแปร A, x, n, j, k, s เป็นตัวแปรอินสแตนซ์ฟังก์ชันจะสั้นลง 31 ตัวอักษร - รวม 182 ตัว แต่รู้สึกเหมือนก้มกฎมากเกินไป)
int[]Z(int[][]A,int[]x,int n){int j,k,s;for(;;){for(j=0;j<n;j++){for(k=s=0;k<n;s+=A[j][k]*x[k++]);if(s!=A[j][n])j+=n;}if(j==n)return x;for(j=0;j<=n;j++)if(x[j]!=x[n]||j==n){x[j]++;for(k=0;k<j;x[k++]=-x[n]);j=n;}}}
โปรแกรมสำหรับการทดสอบ (ค่อนข้าง ungolfed):
import java.util.*;
class MatrixSolver{
public MatrixSolver() {
Scanner p=new Scanner(System.in); //initialize everything from stdin
int j,k,n=p.nextInt(),A[][]=new int[n][n+1],x[]=new int[n+1];
for(j=0;j<n;j++)for(k=0;k<=n;A[j][k++]=p.nextInt());
x=Z(A,x,n); //call the magic function
for(j=0;j<n;j++) System.out.print(x[j]+" "); //print the output
}
public static void main(String[]args){
new MatrixSolver();
}
int[]Z(int[][]A,int[]x,int n){
int j,k,s;
for(;;){
for(j=0;j<n;j++){ //multiply each row of matrix by trial solution and check to see if it is correct
for(k=s=0;k<n;s+=A[j][k]*x[k++]);
if(s!=A[j][n])j+=n;
}
if(j==n)return x; //if it is correct return the trial solution
for(j=0;j<=n;j++)if(x[j]!=x[n]||j==n){//calculate the next trial solution
x[j]++;
for(k=0;k<j;x[k++]=-x[n]);
j=n;
}
}
}
}
โปรแกรมรับอินพุตจาก stdin เป็นจำนวนเต็มคั่นด้วยช่องว่างดังนี้: ก่อนมิติของปัญหาที่สองรายการของเมทริกซ์ที่เพิ่มขึ้นตามแถว
วิ่งตัวอย่าง:
$java -jar MatrixSolver.jar
3 2 1 -1 8 -3 -1 2 -11 -2 1 2 -3
2 3 -1
ฉันโกนตัวละครหลายตัวโดยทำตามคำแนะนำของวิกเตอร์เกี่ยวกับลูปและ "สาธารณะ" โดยเก็บ RHS ในเมทริกซ์ที่เพิ่มขึ้นแทนที่จะแยกจากกันและเพิ่มรายการพิเศษลงในโซลูชันทดลองใช้ของฉัน OP ยังกล่าวอีกว่าฟังก์ชั่นเพียงพอ - ไม่จำเป็นต้องนับโปรแกรมทั้งหมด