Algorytm kolorujący liter - wordle

0

Cześć, dla treningu próbuje napisać własną grę Wordle, same zasady gry są proste. Musimy odgadnąć 5 literowe słowo, mamy na to 6 prób.
W trakcie gry dostajemy 2 różne podpowiedzi, literę na żółto - jeżeli jest ona w słowie, ale na innym miejscu oraz zieloną literę jeżeli jest ona na dobrym miejscu.
Udało mi się napisać wszystko, jedynie algorytm kolorowania liter szwankuje :/

image

Jak widać na załączonym obrazku, w przypadku 3 pierwsze dwa b powinno być na szaro, ponieważ 3 ostatnie b są w dobrym miejscu i w haśle nie ma więcej b do odgadnięcia,
lub tak jak w przypadku drugim, jeszcze jedno a powinno być na żółto. Chętnie przyjmę każdą radę :)

1

Masz jakiś kod?

0

są na żółto ponieważ spełniają warunek który podałeś "literę na żółto - jeżeli jest ona w słowie, ale na innym miejscu oraz zieloną literę jeżeli jest ona na dobrym miejscu." - prawdopodobnie, bez kodu ciężko stwierdzić

jeżeli jest tak jak pisze to dodaj if-a która sprawdza czy już wszystkie 'b' są już odgadnięte żeby nie malował innych.

1
  1. GreenCount=0
  2. Tworzysz histogram liter w słowie oryginal, oraz histogram liter w słowie given
  3. Dla każdej pozycji w słowach oryginal i given jeżeli mamy taką samą literę to zmniejszamy odpowiednie pozycje w histogramach oraz ++GreenCount
  4. YellowCount=Sum(Min(hist_oryginal[i],hist_given[i])

... Proste jak drut lub jak mawiają rosjanie - Просто как два пальца об асфальт

0
Wylluzowany napisał(a):

są na żółto ponieważ spełniają warunek który podałeś "literę na żółto - jeżeli jest ona w słowie, ale na innym miejscu oraz zieloną literę jeżeli jest ona na dobrym miejscu." - prawdopodobnie, bez kodu ciężko stwierdzić

jeżeli jest tak jak pisze to dodaj if-a która sprawdza czy już wszystkie 'b' są już odgadnięte żeby nie malował innych.

Właśnie tak chciałem do tego podejść, ale chyba sam się pogubiłem jak zrobić sprawdzanie czy już wszystkie b są odgadnięte, ponieważ słowa do zgadnięcia będą różne, więc też i będą inne ilości powtórzeń

_13th_Dragon napisał(a):
  1. GreenCount=0
  2. Tworzysz histogram liter w słowie oryginal, oraz histogram liter w słowie given
  3. Dla każdej pozycji w słowach oryginal i given jeżeli mamy taką samą literę to zmniejszamy odpowiednie pozycje w histogramach oraz ++GreenCount
  4. YellowCount=Sum(Min(hist_oryginal[i],hist_given[i])

... Proste jak drut lub jak mawiają rosjanie - Просто как два пальца об асфальт

A jak w takim przypadku później odnieść się do mojego słowa żeby wiedzieć dokładnie które litery pokolorować na żółto? Nie za bardzo wiem jak sam licznik ma mi pomóc.

Może kawałek mojego kodu pomoże. Tutaj jest samo liczenie koloru "g" jako green, 'y' jako żółty i 'n' jako brak koloru.
guessFromPlayer - pobiera ostatnie wpisane słowo przez gracza
secretWord - hasło do odgadnięcia

        String guessFromPlayer = listOfAttempts.get(listOfAttempts.size() - 1);
        String secretWord = this.secretWord;
        String[] guessWordInTab = guessFromPlayer.split("");
        String[] secretWordInTab = secretWord.split("");
        String[] coloredWordlePassword = new String[secretWordInTab.length];
        for (int i = 0; i < secretWordInTab.length; i++) {
            for (int j =0;j < secretWordInTab.length; j++) {
                if (guessWordInTab[i].equals(secretWordInTab[j]) && i == j) {
                    coloredWordlePassword[i] = "G";
                    break;
                } else if (guessWordInTab[i].equals(secretWordInTab[j]) && i != j) {
                    coloredWordlePassword[i] = "Y";
                    continue;
                } else {
                    coloredWordlePassword[i] = "N";
                }
            }
        }
        printColoredWord(coloredWordlePassword, guessWordInTab);
    }

0

Na zielono te pozycje co zwiększyli GreenCount co do pozostałych na żółto jeżeli Min(hist_oryginal[i],hist_given[i])>0

0

Okej, zrobiłem dwa histogramy, jako dwie mapy które zliczają ilość powtórzonych liter w hasłach oryginal oraz given, wyszło dość sporo tego kodu, ale działa :) Dzięki bardzo

1
Jakub Łanoszka napisał(a):

Okej, zrobiłem dwa histogramy, ... wyszło dość sporo tego kodu

Doprawdy?

package histogram;

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Histogram
{
   private static Map<Integer,Long> histogram(final String source)
   {
      return source.toUpperCase().codePoints().boxed().collect
      (
         Collectors.groupingBy(Function.identity(),Collectors.counting())
      );
   }

   public static void main(String[] args)
   {
      histogram("Kakao").forEach((k,v)->System.out.format("%c: %d\n",k,v));
   }
}
0

Jeszcze nie mam aż takiego doświadczenia, więc nie wiedziałem że można w tak łatwy sposób to zapisać :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1