commit 03c3bcaa7f74498427c4e39599f86f00705f8bba
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Mar 24 16:25:41 2023 +0100

    Dino6 solver: skeleton.

diff --git a/src/main/java/org/distorted/solvers/SolverDino6.java b/src/main/java/org/distorted/solvers/SolverDino6.java
index b73a6339..b01c222b 100644
--- a/src/main/java/org/distorted/solvers/SolverDino6.java
+++ b/src/main/java/org/distorted/solvers/SolverDino6.java
@@ -21,12 +21,19 @@ import org.distorted.objectlib.tablebases.TablebasesAbstract;
 
 public class SolverDino6 extends SolverTablebase
 {
-  private static final int ERROR_EDGE_MISSING  = -1;
-  private static final int ERROR_EDGE_CANNOT   = -2;
-  private static final int ERROR_EDGE_TWISTED  = -3;
+  private static final int ERROR_EDGE_MISSING        = -1;
+  private static final int ERROR_EDGE_CANNOT         = -2;
+  private static final int ERROR_EDGE_TWISTED        = -3;
+  private static final int ERROR_EDGE_MONOCHROMATIC  = -4;
+
+  int[][] EDGE_MAP = {
+                      {4,2},{0,4},{4,3},{1,4},
+                      {2,0},{3,0},{3,1},{2,1},
+                      {5,2},{0,5},{5,3},{1,5}
+                     };
 
   private TablebasesAbstract mSolver;
-  private int[] mFaceColors;
+  private final int[] mFaceColors;
   private int mErrorColor1, mErrorColor2;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -34,6 +41,209 @@ public class SolverDino6 extends SolverTablebase
   public SolverDino6(Resources res, TwistyObject object)
     {
     super(res,object);
+    mFaceColors = new int[6];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void getEdges(TwistyObject object, int[][] edges)
+    {
+    for(int i=0; i<12; i++)
+      {
+      edges[i][0] = object.getCubitFaceStickerIndex(i,0);
+      edges[i][1] = object.getCubitFaceStickerIndex(i,1);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int computeOpposite(int color, int[][] edges, boolean[] buffer)
+    {
+    for(int i=0; i<6; i++) buffer[i] = false;
+
+    for(int i=0; i<12; i++)
+      {
+      int[] edge = edges[i];
+      if( edge[0]==color ) buffer[edge[1]]=true;
+      if( edge[1]==color ) buffer[edge[0]]=true;
+      }
+
+    int total = 0;
+
+    for(int i=0; i<6; i++)
+      if( buffer[i] )
+        {
+        if( i!=color) total++;
+        else
+          {
+          mErrorColor1 = i;
+          return ERROR_EDGE_MONOCHROMATIC;
+          }
+        }
+
+    if( total==4 )
+      for(int i=0; i<6; i++)
+        if( !buffer[i] && i!=color ) return i;
+
+    return ERROR_EDGE_CANNOT;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int fillUpRemainingFaceColors(boolean[] buffer)
+    {
+    for(int i=0; i<6; i++)
+      {
+      buffer[i] = false;
+      }
+    for(int i=0; i<6; i++)
+      {
+      int color = mFaceColors[i];
+      if( color>=0 ) buffer[color] = true;
+      }
+
+    int total = 0;
+    for(int i=0; i<6; i++)
+      if( buffer[i] ) total++;
+
+    if( total==4 )
+      {
+      for(int i=0; i<6; i++)
+        if( !buffer[i] )
+          {
+          buffer[i]=true;
+          mFaceColors[0] = i;
+          break;
+          }
+      for(int i=0; i<6; i++)
+        if( !buffer[i] )
+          {
+          buffer[i]=true;
+          mFaceColors[1] = i;
+          break;
+          }
+
+      return 0;
+      }
+
+    return ERROR_EDGE_CANNOT;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int figureOutFaceColors(int[][] edges)
+    {
+    boolean[] present = new boolean[6];
+
+    for(int i=0; i<6; i++) mFaceColors[i] = -1;
+
+    for(int i=0; i<12; i++)
+      {
+      int[] edge = edges[i];
+      int c0 = edge[0];
+      int c1 = edge[1];
+
+      if( c0>=0 && c0<6 ) present[c0] = true;
+      if( c1>=0 && c1<6 ) present[c1] = true;
+      }
+
+    for(int i=0; i<6; i++)
+      if( !present[i] )
+        {
+        mErrorColor1 = i;
+        mErrorColor2 = (i<5 ? i+1 : 4 );
+        return ERROR_EDGE_MISSING;
+        }
+
+    if( edges[0][0]==edges[0][1] ) return ERROR_EDGE_CANNOT;
+
+    mFaceColors[4] = edges[0][0];
+    mFaceColors[2] = edges[0][1];
+    mFaceColors[5] = computeOpposite(mFaceColors[4], edges, present);
+    if( mFaceColors[5]<0 ) return ERROR_EDGE_CANNOT;
+
+    mFaceColors[3] = computeOpposite(mFaceColors[2], edges, present);
+    if( mFaceColors[3]<0 ) return ERROR_EDGE_CANNOT;
+
+    int success = fillUpRemainingFaceColors(present);
+    if( success<0 ) return success;
+
+    return 0;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private boolean notPresent(int face0, int face1, int[][] edges)
+    {
+    int c0=mFaceColors[face0];
+    int c1=mFaceColors[face1];
+
+    for(int i=0; i<12; i++)
+      {
+      int[] edge = edges[i];
+      if( edge[0]==c0 && edge[1]==c1 ) return false;
+      if( edge[0]==c1 && edge[1]==c0 ) return false;
+      }
+    return true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int checkAllPresent(int[][] edges)
+    {
+    for(int i=0; i<12; i++)
+      {
+      int[] map = EDGE_MAP[i];
+      int m1 = map[0];
+      int m2 = map[1];
+
+      if( notPresent(m1,m2,edges) )
+        {
+        android.util.Log.e("D", "edge missing i="+i+" m1="+m1+" m2="+m2);
+
+        mErrorColor1 = mFaceColors[m1];
+        mErrorColor2 = mFaceColors[m2];
+        return ERROR_EDGE_MISSING;
+        }
+      }
+
+    return 0;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private boolean wrongTwist(int face0, int face1, int[][] edges)
+    {
+    int c0=mFaceColors[face0];
+    int c1=mFaceColors[face1];
+
+    for(int i=0; i<12; i++)
+      {
+      int[] edge = edges[i];
+      if( edge[1]==c0 && edge[0]==c1 ) return true;
+      }
+    return false;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int checkTwist(int[][] edges)
+    {
+    for(int i=0; i<12; i++)
+      {
+      int[] map = EDGE_MAP[i];
+      int m1 = map[0];
+      int m2 = map[1];
+
+      if( wrongTwist(m1,m2,edges) )
+        {
+        mErrorColor1 = mFaceColors[m1];
+        mErrorColor2 = mFaceColors[m2];
+        return ERROR_EDGE_TWISTED;
+        }
+      }
+
+    return 0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -41,6 +251,22 @@ public class SolverDino6 extends SolverTablebase
   public int tablebaseIndex(TwistyObject object)
     {
     int[][] edges = new int[12][2];
+    getEdges(object,edges);
+
+    int result1 = figureOutFaceColors(edges);
+    if( result1<0 ) return result1;
+
+for(int i=0; i<6; i++)
+  {
+  android.util.Log.e("D", "face "+i+" : "+mFaceColors[i]);
+  }
+
+    int result2 = checkAllPresent(edges);
+    if( result2<0 ) return result2;
+
+    int result3 = checkTwist(edges);
+    if( result3<0 ) return result3;
+
     return 0;
     }
 
@@ -104,15 +330,28 @@ public class SolverDino6 extends SolverTablebase
     return res.getString(R.string.solver_generic_twisted_edge,c0,c1);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String edgeMonoError(Resources res, int color)
+    {
+    int j0 = getColorIndex3(color);
+    int j1 = getColorIndex6(color);
+    String c0 = res.getString(j0);
+    String c1 = res.getString(j1);
+
+    return res.getString(R.string.solver_generic_edge_mono,c0,c1);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public String error(int index, Resources res)
     {
     switch(index)
       {
-      case ERROR_EDGE_MISSING  : return edgeMissingError(res,mErrorColor1,mErrorColor2);
-      case ERROR_EDGE_TWISTED  : return edgeTwistedError(res,mErrorColor1,mErrorColor2);
-      case ERROR_EDGE_CANNOT   : return res.getString(R.string.solver_generic_edges_cannot);
+      case ERROR_EDGE_MISSING      : return edgeMissingError(res,mErrorColor1,mErrorColor2);
+      case ERROR_EDGE_TWISTED      : return edgeTwistedError(res,mErrorColor1,mErrorColor2);
+      case ERROR_EDGE_MONOCHROMATIC: return edgeMonoError(res,mErrorColor1);
+      case ERROR_EDGE_CANNOT       : return res.getString(R.string.solver_generic_edges_cannot);
       }
 
     return null;
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 29ee385a..471ebc39 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">Oktaederstücke können nicht so verdreht werden, sodass alle Seiten einfarbig sind!</string>
     <string name="solver_generic_edges_cannot">Kanten können nicht verdreht werden, sodass alle Seiten einfarbig sind!</string>
     <string name="solver_generic_c_v_dont_match">Oktaederstücke und Tetraederecken passen nicht zusammen!</string>
+    <string name="solver_generic_edge_mono">%1$s-%2$s Kante?</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 09958d63..cb1e61d0 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">¡Las piezas octaédricas no se pueden torcer para que todos los lados sean monocromáticos!</string>
     <string name="solver_generic_edges_cannot">¡Los bordes no se pueden torcer para que todos los lados sean monocromáticos!</string>
     <string name="solver_generic_c_v_dont_match">¡Las piezas octaédricas y las esquinas tetraédricas no coinciden!</string>
+    <string name="solver_generic_edge_mono">Borde %1$s-%2$s?</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 88a9feed..ca0e6bbe 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">Les pièces octaédriques ne peuvent pas être tordues afin que tous les côtés soient monochromes !</string>
     <string name="solver_generic_edges_cannot">Les bords ne peuvent pas être tordus pour que tous les côtés soient monochromes !</string>
     <string name="solver_generic_c_v_dont_match">Les pièces octaédriques et les coins tétraédriques ne correspondent pas !</string>
+    <string name="solver_generic_edge_mono">Bord %1$s-%2$s?</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 911747fc..93b2b41e 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">すべての面が単色になるように、八面体のピースをねじることはできません。</string>
     <string name="solver_generic_edges_cannot">すべての面が単色になるようにエッジをねじることはできません。</string>
     <string name="solver_generic_c_v_dont_match">八面体のピースと四面体の角が一致しません!</string>
+    <string name="solver_generic_edge_mono">%1$s%2$s エッジ?</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 b7ec4314..884bd389 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">팔면체 조각은 뒤틀릴 수 없으므로 모든면이 단색입니다!</string>
     <string name="solver_generic_edges_cannot">모든 면이 단색이 되도록 가장자리를 비틀 수 없습니다!</string>
     <string name="solver_generic_c_v_dont_match">팔면체 조각과 사면체 모서리가 일치하지 않습니다!</string>
+    <string name="solver_generic_edge_mono">%1$s%2$s 에지?</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 a981ef52..1aa9641e 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">Części ośmiościennych nie da się skręcić tak, aby wszystkie boki były monochromatyczne!</string>
     <string name="solver_generic_edges_cannot">Krawędzi nie da się skręcić tak, aby wszystkie boki były monochromatyczne!</string>
     <string name="solver_generic_c_v_dont_match">Części ośmiościenne i czworościenne rogi nie pasują do siebie!</string>
+    <string name="solver_generic_edge_mono">%1$s-%2$s krawędz?</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 50f92201..ea44171b 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">Восьмигранные фигуры нельзя скрутить так, чтобы все стороны были однотонными!</string>
     <string name="solver_generic_edges_cannot">Ребр нельзя скрутить так, чтобы все стороны были однотонными!</string>
     <string name="solver_generic_c_v_dont_match">Восьмигранные фигуры и четырехгранные углы не совпадают!</string>
+    <string name="solver_generic_edge_mono">%1$s-%2$s ребрo?</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 1ae662fd..af215248 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -104,6 +104,7 @@
     <string name="solver_generic_vertices_cannot">八面体块不能扭曲，所以所有面都是单色的！</string>
     <string name="solver_generic_edges_cannot">边缘不能扭曲，所以所有的面都是单色的！</string>
     <string name="solver_generic_c_v_dont_match">八面体块和四面体角不匹配！</string>
+    <string name="solver_generic_edge_mono">%1$s%2$s 边缘？</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 745aec85..71cfb0ec 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -98,6 +98,7 @@
     <string name="solver_generic_vertices_cannot">八面體塊不能扭曲，所以所有面都是單色的！</string>
     <string name="solver_generic_edges_cannot">邊緣不能扭曲，所以所有的面都是單色的！</string>
     <string name="solver_generic_c_v_dont_match">八面體塊和四面體角不匹配！</string>
+    <string name="solver_generic_edge_mono">%1$s%2$s 邊緣？</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 b92f2ad8..562a54b4 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -118,6 +118,7 @@
     <string name="solver_generic_vertices_cannot">Octahedral pieces cannot be twisted so that all faces are monochromatic!</string>
     <string name="solver_generic_edges_cannot">Edges cannot be twisted so that all faces are monochromatic!</string>
     <string name="solver_generic_c_v_dont_match">Octahedral pieces and tetrahedral corners do not match!</string>
+    <string name="solver_generic_edge_mono">%1$s-%2$s edge?</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>
