commit d7e2f77805b0d8047987d187faf79a50c10eedcd
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Feb 15 18:22:32 2023 +0100

    Pyraminx Duo solver: initial error cases should be finished.

diff --git a/src/main/java/org/distorted/solvers/pduo/SolverPyraminxDuo.java b/src/main/java/org/distorted/solvers/pduo/SolverPyraminxDuo.java
index 5536f14c..09d0edbf 100644
--- a/src/main/java/org/distorted/solvers/pduo/SolverPyraminxDuo.java
+++ b/src/main/java/org/distorted/solvers/pduo/SolverPyraminxDuo.java
@@ -32,12 +32,8 @@ public class SolverPyraminxDuo extends SolverTablebase
   private static final int ERROR_TWO_CENTERS_SWAP = -9;
   private static final int ERROR_CORNER_TWISTED   = -10;
 
-  private static final int ERROR_EDGE_GY = -11;
-  private static final int ERROR_EDGE_GB = -12;
-  private static final int ERROR_EDGE_GR = -13;
-  private static final int ERROR_EDGE_YB = -14;
-  private static final int ERROR_EDGE_YR = -15;
-  private static final int ERROR_EDGE_BR = -16;
+  private static final int ERROR_CORNERS_CANNOT   = -11;
+
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -102,9 +98,56 @@ public class SolverPyraminxDuo extends SolverTablebase
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int computeCornerTwist(int index, int[][] corners)
+  private int[] computeMissingCornerColor(int[][] corners)
+    {
+    int[] ret = new int[4];
+
+    for(int i=0; i<4; i++)
+      for(int j=0; j<4; j++)
+        if( corners[i][0]!=j && corners[i][1]!=j && corners[i][2]!=j ) ret[i]=j;
+
+    return ret;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int computeCornerTwist(int index, int[] corner, int[] missing)
     {
-    return 0; // TODO
+    int twist1=0, twist2=0, twist3=0;
+
+    switch(index)
+      {
+      case 0: if( corner[1]==missing[1] ) twist1=1;
+              if( corner[2]==missing[1] ) twist1=2;
+              if( corner[0]==missing[2] ) twist2=2;
+              if( corner[2]==missing[2] ) twist2=1;
+              if( corner[0]==missing[3] ) twist3=1;
+              if( corner[1]==missing[3] ) twist3=2;
+              break;
+      case 1: if( corner[1]==missing[0] ) twist1=1;
+              if( corner[2]==missing[0] ) twist1=2;
+              if( corner[0]==missing[2] ) twist2=1;
+              if( corner[1]==missing[2] ) twist2=2;
+              if( corner[0]==missing[3] ) twist3=2;
+              if( corner[2]==missing[3] ) twist3=1;
+              break;
+      case 2: if( corner[1]==missing[0] ) twist1=1;
+              if( corner[2]==missing[0] ) twist1=2;
+              if( corner[0]==missing[1] ) twist2=2;
+              if( corner[2]==missing[1] ) twist2=1;
+              if( corner[0]==missing[3] ) twist3=1;
+              if( corner[1]==missing[3] ) twist3=2;
+              break;
+      case 3: if( corner[1]==missing[0] ) twist1=1;
+              if( corner[2]==missing[0] ) twist1=2;
+              if( corner[0]==missing[1] ) twist2=1;
+              if( corner[1]==missing[1] ) twist2=2;
+              if( corner[0]==missing[2] ) twist3=2;
+              if( corner[2]==missing[2] ) twist3=1;
+              break;
+      }
+
+    return ( twist1!=twist2 || twist1!=twist3 ) ? ERROR_CORNERS_CANNOT : twist1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -182,10 +225,11 @@ public class SolverPyraminxDuo extends SolverTablebase
     if( (twist_ry-twist_gr+1)%3 != 0 ) return ERROR_TWO_CENTERS_SWAP;
 
     int total_twist=0;
+    int[] missing = computeMissingCornerColor(corners);
 
     for(int i=0; i<4; i++)
       {
-      corner_twist[i] = computeCornerTwist(i,corners);
+      corner_twist[i] = computeCornerTwist(i,corners[i],missing);
       if( corner_twist[i]<0 ) return corner_twist[i];
       total_twist += corner_twist[i];
       }
@@ -229,24 +273,7 @@ public class SolverPyraminxDuo extends SolverTablebase
                                      return res.getString(R.string.solver_generic_missing_center,colorR);
       case ERROR_TWO_CENTERS_SWAP  : return res.getString(R.string.solver_generic_two_centers);
       case ERROR_CORNER_TWISTED    : return res.getString(R.string.solver_generic_corner_twist);
-      case ERROR_EDGE_GY           : String c41 = res.getString(R.string.color_green3);
-                                     String c42 = res.getString(R.string.color_yellow5);
-                                     return res.getString(R.string.solver_generic_two_corners,c41,c42);
-      case ERROR_EDGE_GB           : String c51 = res.getString(R.string.color_green3);
-                                     String c52 = res.getString(R.string.color_blue5);
-                                     return res.getString(R.string.solver_generic_two_corners,c51,c52);
-      case ERROR_EDGE_GR           : String c61 = res.getString(R.string.color_green3);
-                                     String c62 = res.getString(R.string.color_red5);
-                                     return res.getString(R.string.solver_generic_two_corners,c61,c62);
-      case ERROR_EDGE_YB           : String c71 = res.getString(R.string.color_yellow3);
-                                     String c72 = res.getString(R.string.color_blue5);
-                                     return res.getString(R.string.solver_generic_two_corners,c71,c72);
-      case ERROR_EDGE_YR           : String c81 = res.getString(R.string.color_yellow3);
-                                     String c82 = res.getString(R.string.color_red5);
-                                     return res.getString(R.string.solver_generic_two_corners,c81,c82);
-      case ERROR_EDGE_BR           : String c91 = res.getString(R.string.color_blue3);
-                                     String c92 = res.getString(R.string.color_red5);
-                                     return res.getString(R.string.solver_generic_two_corners,c91,c92);
+      case ERROR_CORNERS_CANNOT    : return res.getString(R.string.solver_generic_corners_cannot);
       }
 
     return null;
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 8debf9f0..440f70f5 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">Zwei Zentren müssen ausgetauscht werden!</string>
     <string name="solver_generic_missing_center">Die %1$s Mitte fehlt!</string>
     <string name="solver_generic_missing_corner">Die %1$s-%2$s-%3$s Ecke fehlt!</string>
-    <string name="solver_generic_two_corners">Zwei Ecken passen nicht zusammen (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">Ecken können nicht verdreht werden, sodass alle Flächen einfarbig sind!</string>
 
     <string name="solver_cube3_error1">Es gibt nur %1$d %2$s Facelets.</string>
     <string name="solver_cube3_error2">Nicht alle 12 Kanten gibt es genau einmal!</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 61869de5..8eb5d9ac 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">¡Hay que cambiar dos centros!</string>
     <string name="solver_generic_missing_center">¡Falta el centro %1$s!</string>
     <string name="solver_generic_missing_corner">¡Falta la esquina %1$s-%2$s-%3$s!</string>
-    <string name="solver_generic_two_corners">Dos esquinas no coinciden (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">¡Las esquinas no se pueden torcer para que todos los lados sean monocromáticos!</string>
 
     <string name="solver_cube3_error1">Solo hay %1$d facetas %2$s.</string>
     <string name="solver_cube3_error2">¡No todos los 12 bordes existen exactamente una vez!</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 676488ad..398b4e8e 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">Deux centres doivent être échangés !</string>
     <string name="solver_generic_missing_center">Centre %1$s manquant !</string>
     <string name="solver_generic_missing_corner">Coin %1$s-%2$s-%3$s manquant !</string>
-    <string name="solver_generic_two_corners">Deux coins ne correspondent pas (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">Les coins ne peuvent pas être tordus afin que tous les côtés soient monochromes !</string>
 
     <string name="solver_cube3_error1">Il n\'y a que %1$d facettes %2$s.</string>
     <string name="solver_cube3_error2">Les 12 arêtes n\'existent pas exactement une fois !</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 4e30e3b4..950eb11e 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -85,7 +85,7 @@
     <string name="solver_generic_two_centers">2つのセンターを交換しなければならない!</string>
     <string name="solver_generic_missing_center">%1$sのセンターが欠けてる！</string>
     <string name="solver_generic_missing_corner">%1$s%2$s%3$sのコーナーがない!</string>
-    <string name="solver_generic_two_corners">2 つの角が一致しません (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">すべての面がモノクロになるようにコーナーをねじることはできません。</string>
 
     <string name="solver_cube3_error1">%2$s小顔は%1$dつだけ</string>
     <string name="solver_cube3_error2">12 のエッジすべてが 存在するわけではありません。</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index da0567fe..019be6ab 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">두 개의 센터를 교환해야 합니다!</string>
     <string name="solver_generic_missing_center">%1$s 중앙이 사라졌습니다!</string>
     <string name="solver_generic_missing_corner">%1$s-%2$s-%3$s 모서리 금지!</string>
-    <string name="solver_generic_two_corners">두 모서리가 일치하지 않음 (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">모든면이 단색이되도록 모서리를 비틀 수 없습니다!</string>
 
     <string name="solver_cube3_error1">%2$s작은 얼굴은  %1$d개뿐입니다.</string>
     <string name="solver_cube3_error2">12개의 가장자리 모두가 정확하게 한 번 존재하지 않습니다!</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index c26cb4b2..1f5ca40e 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">Dwa środki muszą być wymienione!</string>
     <string name="solver_generic_missing_center">Brakuje %1$s środka!</string>
     <string name="solver_generic_missing_corner">Brakuje %1$s-%2$s-%3$s rogu!</string>
-    <string name="solver_generic_two_corners">Dwa rogi nie zgadzają się ze sobą (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">Narożników nie można skręcić tak, aby wszystkie boki były monochromatyczne!</string>
 
     <string name="solver_cube3_error1">Jest tylko %1$d %2$s ścian.</string>
     <string name="solver_cube3_error2">Któraś z 12 krawędzi nie istnieje!</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index e36aa253..c5e5a949 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">Два центра должны быть обменены!</string>
     <string name="solver_generic_missing_center">Нет %1$s центра!</string>
     <string name="solver_generic_missing_corner">Нет %1$s-%2$s-%3$s угла!</string>
-    <string name="solver_generic_two_corners">Два угла не совпадают (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">Углы нельзя скручивать так, чтобы все стороны были однотонными!</string>
 
     <string name="solver_cube3_error1">Всего %1$d %2$s граней!</string>
     <string name="solver_cube3_error2">Не все 12 ребер существуют в единичном экземпляре!</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 630abf1e..a631053d 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -90,7 +90,7 @@
     <string name="solver_generic_two_centers">必须要交换两个中心！</string>
     <string name="solver_generic_missing_center">%1$s中心不見了！</string>
     <string name="solver_generic_missing_corner">没有%1$s-%2$s-%3$s的角落!</string>
-    <string name="solver_generic_two_corners">两个角不匹配 (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">角不能扭曲，这样所有的面都是单色的！</string>
 
     <string name="solver_cube3_error1">只有%1$d个%2$s小面</string>
     <string name="solver_cube3_error2">并非所有12条边都只存在一次！</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 0908013f..13c8faee 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -84,7 +84,7 @@
     <string name="solver_generic_two_centers">兩個中鋒要互換！</string>
     <string name="solver_generic_missing_center">%1$s的中心不见了！</string>
     <string name="solver_generic_missing_corner">沒有%1$s-%2$s-%3$s的角落!</string>
-    <string name="solver_generic_two_corners">兩個角不匹配 (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">角不能扭曲，這樣所有的面都是單色的！</string>
 
     <string name="solver_cube3_error1">只有%1$d個%2$s小臉</string>
     <string name="solver_cube3_error2">並非所有12條邊都只存在一次！</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 4e0578d6..daf069fd 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -104,7 +104,7 @@
     <string name="solver_generic_two_centers">Two centers have to be exchanged!</string>
     <string name="solver_generic_missing_center">The %1$s center missing!</string>
     <string name="solver_generic_missing_corner">The %1$s-%2$s-%3$s corner missing!</string>
-    <string name="solver_generic_two_corners">Two corners do not match (%1$s-%2$s)</string>
+    <string name="solver_generic_corners_cannot">Corners cannot be twisted so that all faces are monochromatic!</string>
 
     <string name="solver_cube3_error1">There are only %1$d %2$s facelets.</string>
     <string name="solver_cube3_error2">Not all 12 edges exist exactly once!</string>
