Nie twierdzę, że mam najlepsze rozwiązanie problemu (lub że ta lista jest wyczerpująca), ale chcę nakreślić kilka możliwych podejść, które przychodzą mi na myśl i dlaczego one działają lub nie. Nie zajmę się również kwestiami stycznymi, takimi jak to, czy użycie bieżącego znacznika czasu jako źródła losowości jest wystarczająco „nieprzewidywalne” i jak wymusić pewne właściwości rozkładu prawdopodobieństwa - skupię się na unikaniu rozwiązań wykorzystujących kodowanie na twardo.
To nie rozwiązanie: nie zezwalaj na kodowanie w sposób jawny
To jest zły pomysł. Jest to wymóg, którego nie można zaobserwować (co oznacza, że nie można stwierdzić, czy jest on spełniony po prostu przez uruchomienie programu), co jest zdecydowanie odradzane na PPCG i może być całkowicie niemożliwe, jeśli program jest uruchamiany na jakiejkolwiek innej platformie, gdzie zgłoszenia są weryfikowane w sposób automatyczny. Problem z takim wymogiem polega na tym, że musisz zacząć od znalezienia obiektywnej definicji „twardego kodowania”. Ogólnie rzecz biorąc, jeśli spróbujesz tego, tylko pogorszysz sytuację.
Uczyń kodowanie niemożliwym
Jeśli nie możesz całkowicie tego zabronić, ale nie chcesz, aby ludzie z niego korzystali, możesz spróbować zaprojektować takie wyzwanie, aby kodowanie po prostu nie było podejściem konkurencyjnym. Jest to możliwe, jeśli obiekty, które powinny zostać wygenerowane, są wystarczająco duże i nieściśliwe, dlatego umieszczenie jednego przykładu w kodzie wymagałoby znacznie więcej bajtów niż napisanie algorytmu generującego losowo prawidłowe rozwiązania. W twoim konkretnym przykładzie tak nie jest, ponieważ macierze tożsamości są poprawne i generalnie są łatwe do wygenerowania, ale w przypadku innych problemów może tak nie być. Jeśli obiekty docelowe są wystarczająco nieregularne, po prostu wymagają, aby miały duży rozmiar, co prawdopodobnie nie wpłynie na liczbę bajtów rzeczywistego algorytmu, ale spowoduje wysadzenie zakodowanej części.
Sparametryzuj wyjście
Często problemy te mają jeden lub więcej parametrów naturalnych, takich jak rozmiar matrycy w twoim przykładzie. Jeśli tak, uczynienie z tego parametru danych wejściowych może być wystarczające, aby uniemożliwić lub przynajmniej niepraktyczne kodowanie na stałe. W niektórych przypadkach ustalenie jednego konkretnego rozwiązania dla danej wartości parametru, który został znaleziony ręcznie lub za pomocą szczegółowego wyszukiwania, może być łatwe, ale być może nie ma prostej formy zamkniętej dla danego rozwiązania, więc nie jest możliwe jest łatwe wygenerowanie wartości domyślnej dla dowolnych danych wejściowych. Ponownie, nie jest tak w przypadku wspomnianego przykładu, ponieważ macierz tożsamości działa w dowolnym rozmiarze, ale jest optymalnym rozwiązaniem dla tego pokrewnego problemujest zwykle bardzo nieregularna, więc nie można mieć wartości domyślnej bez aktywnego wyszukiwania prawidłowych wartości. Możesz połączyć to z limitem czasowym, aby uniknąć brutalnego poszukiwania wartości domyślnej.
Nałóż pewne ograniczenie na rozkład prawdopodobieństwa
Jeśli chcesz zrezygnować z całkowicie nieograniczonego rozkładu prawdopodobieństwa, możesz nałożyć na niego pewne ograniczenia, które nadal zapewniają odbiorcom dużą swobodę w wyborze ich rozkładu, ale które utrudniają lub utrudniają kodowanie na stałe:
- Najprostszym ograniczeniem, jakie przychodzi na myśl, jest wymaganie różnicy między minimalnym a maksymalnym prawdopodobieństwem, aby każdy możliwy wynik był poniżej pewnego progu. Podejście zakodowane prawdopodobnie będzie miało prawie zerowe prawdopodobieństwo dla prawie wszystkich wyników i prawdopodobieństwo zbliżone do 1 dla wartości domyślnej. Jeśli potrzebujesz, aby maksymalna różnica była mniejsza niż 0,1, powiedzmy, musiałoby być 10 (losowo wybranych) wartości domyślnych, aby podejście było opcją. Podobnie możesz również wymagać minimalnego prawdopodobieństwa dla każdego możliwego wyjścia, np. 1 / (2 * N *), gdzie N jest liczbą możliwych wyjść.
- Alternatywnie możesz wymagać, aby nie było żadnych (prawdopodobieństwa) luk w rozkładzie, aby nie było przedziału wielkości δ (wybranego przez ciebie) , tak aby istniały zarówno wyższe, jak i niższe prawdopodobieństwa. Oznacza to, że nie może być żadnych wartości odstających pod względem prawdopodobieństwa, które prawdopodobnie są generowane przez podejście kodujące.
Głównym problemem związanym z tymi podejściami jest to, że trudniej je uzasadnić, udowodnienie poprawności odpowiedzi jest trudne, a eksperymentalne sprawdzenie poprawności może być niemożliwe w przypadku dużych przestrzeni wyjściowych. Mimo to zapewniają one zasadniczo obserwowalne wymagania dla programu, które mogą uniemożliwić kodowanie na stałe.
Podejścia te mogą również wymagać ograniczenia czasowego, ponieważ jednym ze sposobów zwiększenia prawdopodobieństwa wartości innych niż domyślne byłoby kilkakrotne znalezienie losowego foo przed powrotem do wartości domyślnej.