Rainer Rosenthal schrieb:
> Bevor Du Dich schaudernd abwendest, kannst Du ja mal schauen, ob ich was
> übersehen habe (oder in meinem Rechner ein Bit gekippt ist).
> Such doch mal den oder die Schüler, die bei dem Muster
> [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
> sagen können: "hab ich!".
Mache ich gerne, aber im Moment sehe ich nicht, wie so eine
Prüfroutine, ob eine "Schülerliste" für jede mögliche Antwortliste
Gewinner enthält, mir zu Erkenntnissen hinsichtlich der kürzest
möglichen Schülerliste verhelfen könnte.
Ich habe ausserdem ein technisches Problem:
Ich kann grade nur Google-Groups als Zugang zum Usenet
nutzen, und das zerstört mir systematisch in meinen
Programmquelltexten alle Einrückungen von links, die durch
mehrere aufeinanderfolgende Leerzeichen erzeugt sind.
Das sollte der Compilierbarkeit keinen Abbruch tun.
Ich kann aber nicht garantieren, dass der Code, den ich
abschicke, in lesbarer Form im Usenet ankommt.
Man kann ja eine mögliche Antwortliste als 11-stellige Binärzahl
mit ggfs führenden Nullen auffassen.
Damit könnte die Sache leicht mit bitweise-Und-Vergleichen
erledigt werden.
Aus Langeweile habe ich mal mit LaTeX ein Progrämmchen geschrieben,
welches in einer Schleife die natürlichen Zahlen von 0 bis 2047 in
Binärnotation mit führenden Nullen umrechnet und überprüft, ob
Deine Schülerliste mit dieser Binärnotation als möglicher
Antwortliste Gewinner enthält. Die Umrechnungsroutine stammt aus
dem binhex-Paket von David Kastrup.
Die Anzahl der maximal erlaubten Falschantworten ist nicht hart
codiert.
Aus Faulheit habe ich aber darauf verzichtet, die Länge der
Antwortliste und damit den nötigen Zahlenbereich aus der
Benutzereingabe ermitteln zu lassen und diese Dinge mit 11 bzw
0 bis 2047 hart codiert.
Das folgende kleine Progrämmlein für LaTeX (eine Engine mit
eTeX-extensions, aber meinetwegen ohne expl3 ist vorausgesetzt)
erzeugt beim Complieren mit LaTeX eine externe Textdatei
"Preisgewinner.txt", die zuerst Deine Frage beantwortet und dann,
abgetrennt davon eine Auflistung aller mit Deiner Schülerliste
möglichen Gewinnerkonstellationen liefert.
Preisgewinner.txt ist von der Form:
With pattern
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}
the following prize-winners are in list:
{0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0}/Schueler 01
////////////////////////////////////////
With pattern
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
the following prize-winners are in list:
{0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0}/Schueler 01
{1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}/Schueler 12
With pattern
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
the following prize-winners are in list:
{0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1}/Schueler 07
{1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}/Schueler 12
[...]
With pattern
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
the following prize-winners are in list:
{1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1}/Schueler 17
{1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1}/Schueler 20
There seem do be no patterns without prize-winners.
------------------------ Schnippel --------------------------------------------
\makeatletter
%%=============================================================================
%% PARAPHERNALIA:
%% \UD@firstoftwo, \UD@secondoftwo, \UD@PassFirstToSecond, \UD@Exchange,
%% \UD@stopromannumeral, \UD@CheckWhetherNull,
%%=============================================================================
\newcommand\UD@firstoftwo[2]{#1}%
\newcommand\UD@secondoftwo[2]{#2}%
\newcommand\UD@PassFirstToSecond[2]{#2{#1}}%
\newcommand\UD@Exchange[2]{#2#1}%
\@ifdefinable\UD@stopromannumeral{\chardef\UD@stopromannumeral=`\^^00}%
%%-----------------------------------------------------------------------------
%% Check whether argument is empty:
%%.............................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <
https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
\romannumeral\expandafter\UD@secondoftwo\string{\expandafter
\UD@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
\UD@secondoftwo\string}\expandafter\UD@firstoftwo\expandafter{\expandafter
\UD@secondoftwo\string}\expandafter\UD@stopromannumeral\UD@secondoftwo}{%
\expandafter\UD@stopromannumeral\UD@firstoftwo}%
}%
%%=============================================================================
% \nbinary, delivering result after two hits with `\expandafter`,
% derived from \nbinary in David Kastrup's binhex-package,
% see
https://www.ctan.org/pkg/binhex
\def\nbinary#1#2{\romannumeral\expandafter\bb@dobinary\number\number#2%
\romannumeral\number\number#1 000+}
\def\bb@dobinary#1#2{\if#10\if m\string#2\else\bb@endbinary\fi\fi
\expandafter\bb@dobinary\number\csname bb@0#1\endcsname#2}
\def\next#1#2#3{\expandafter \def \csname bb@#1\endcsname##1%
{#2\csname bb@#3##1\endcsname}}
\next{00}00 \next{01}01 \next{02}10 \next{03}11
\next{04}20 \next{05}21 \next{06}30 \next{07}31
\next{08}40 \next{09}41 \next{10}50 \next{11}51
\next{12}60 \next{13}61 \next{14}70 \next{15}71
\next{16}80 \next{17}81 \next{18}90 \next{19}91
\expandafter \def \csname bb@0+\endcsname {+0}
\expandafter \def \csname bb@1+\endcsname {+1}
\def\bb@endbinary#1+{\expandafter\expandafter\expandafter\UD@stopromannumeral\fi\fi}
\expandafter \def \csname bb@0-\endcsname {0+-\bb@dobinary}
\expandafter\def\csname bb@0m\endcsname#1+{#1+0}
\expandafter\def\csname bb@1m\endcsname#1+{#1+1}
%%=============================================================================
\@ifdefinable\UD@gobbleToSentinel{%
\long\def\UD@gobbleToSentinel#1\Sentinel{}%
}%
\newcommand\UD@CheckWhetherNotSentinel[1]{%
\expandafter\UD@CheckWhetherNull\expandafter{\UD@gobbleToSentinel#1\Sentinel}%
}%
\newcommand\removecommata[1]{%
\romannumeral\removecommataloop{}#1,\Sentinel,%
}%
\@ifdefinable\removecommataloop{%
\long\def\removecommataloop#1#2,{%
\UD@CheckWhetherNotSentinel{#2}{\removecommataloop{#1#2}}{\UD@stopromannumeral#1}%
}%
}%
%%=============================================================================
\newcommand\CheckIfPrize[3]{%
\romannumeral
\expandafter\CheckIfPrizeLoop\expandafter{\romannumeral\number\number#1 000}#2\Sentinel#3\Sentinel
}%
\@ifdefinable\CheckIfPrizeLoop{%
\long\def\CheckIfPrizeLoop#1#2#3\Sentinel#4#5\Sentinel{%
\if#2#4\expandafter\UD@firstoftwo\else\expandafter\UD@secondoftwo\fi
{%
\expandafter\UD@CheckWhetherNull\expandafter{\UD@firstoftwo#3{}{}}%
{\expandafter\UD@stopromannumeral\UD@firstoftwo}{%
\CheckIfPrizeLoop{#1}#3\Sentinel#5\Sentinel
}%
}{%
\UD@CheckWhetherNull{#1}{%
\expandafter\UD@stopromannumeral\UD@secondoftwo
}{%
\expandafter\UD@CheckWhetherNull\expandafter{\UD@firstoftwo#3{}{}}%
{\expandafter\UD@stopromannumeral\UD@firstoftwo}{%
\expandafter\CheckIfPrizeLoop\expandafter{\UD@firstoftwo{}#1}#3\Sentinel#5\Sentinel
}%
}%
}%
}%
}%
\newcommand\CreatePrizeWinnerList[4]{%
\romannumeral
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{\removecommata{#3}}{%
\CheckIfPrizeWinnerInListLoop{}{#1}{#4}%
}#2\Sentinel\Sentinel
}%
\newcommand\CheckIfPrizeWinnerInListLoop[6]{%
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{\removecommata{#6}}{%
\CheckIfPrizeWinnerInListLoopB{#1}{#2}{#3}{#4}{#5}%
}%
}%
\newcommand\CheckIfPrizeWinnerInListLoopB[6]{%
\UD@CheckWhetherNotSentinel{#6}{%
\CheckIfPrize{#2}{#4}{#6}%
{\CheckIfPrizeWinnerInListLoop{#1\Printlist{#6}/#5^^J}}%
{\CheckIfPrizeWinnerInListLoop{#1}}{#2}{#3}{#4}%
}{%
\UD@stopromannumeral#3{#1}{#4}%
}%
}%
\newcommand\PrintPrizeWinnerList[2]{%
% #1 - Prize-Winner-List
% #2 - Pattern
\UD@CheckWhetherNull{#1}%
{%
With pattern^^J\Printlist{#2}^^J%
there are no prize-winners in list.%
}%
{%
With pattern^^J\Printlist{#2}^^J%
the following prize-winners are in list:^^J#1%
}%
}%
\newcommand\Printlist[1]{\romannumeral\Printlistloop{}{}#1\Sentinel}%
\@ifdefinable\Printlistloop{%
\long\def\Printlistloop#1#2#3{%
\UD@CheckWhetherNotSentinel{#3}{%
\expandafter\Printlistloop\expandafter{\UD@Exchange#3{#1#2}}{, }%
}{\UD@stopromannumeral{#1}}%
}%
}%
\newcommand\CreatePrizeWinnerListsForPatterns[4]{%
% #1 - Anzahl an erlaubten Fehlern
% #2 - Schülerliste
% #3 - Untere Grenze
% #4 - Obere Grenze
\CreatePrizeWinnerListsForPatternsLoop{#3}{}{#1}{#2}{#4}%
}%
\newcommand\CreatePrizeWinnerListsForPatternsLoop[5]{%
% #1 - Untere Grenze
% #2 - Liste der Patterns ohne Gewinner
% #3 - Anzahl an erlaubten Fehlern
% #4 - Schülerliste
% #5 - Obere Grenze
\ifnum#1>#5 \expandafter\UD@firstoftwo\else\expandafter\UD@secondoftwo\fi
{%
\immediate\write\Prizewinners{%
^^J%
\UD@CheckWhetherNull{#2}{%
There seem do be no patterns without prize-winners.%
}{%
With the following patterns there are no prize-winners:^^J#2%
}%
}%
}{%
\message{Doing pattens for value #1^^J}%
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{\nbinary{11}{#1}}{\CreatePrizeWinnerList{#3}{#4}}{%
\expandafter\nextCreatePrizeWinnerListsForPatternsLoop\expandafter{\number\numexpr#1+1\relax}{#2}{#3}{#4}{#5}%
}%
}%
}%
\newcommand\nextCreatePrizeWinnerListsForPatternsLoop[7]{%
% #1 - Untere Grenze
% #2 - Liste der Patterns ohne Gewinner
% #3 - Anzahl an erlaubten Fehlern
% #4 - Schülerliste
% #5 - Obere Grenze
% #6 - This Prize-Winner-List
% #7 - This Pattern
\UD@CheckWhetherNull{#7}{%
\immediate\write\Prizewinners{With pattern^^J\Printlist{#7}^^Jno prize-winners are in list.^^J}%
\CreatePrizeWinnerListsForPatternsLoop{#1}{#2^^J\Printlist{#7}}{#3}{#4}{#5}%
}{%
\immediate\write\Prizewinners{With pattern^^J\Printlist{#7}^^Jthe following prize-winners are in list:^^J#6}%
\CreatePrizeWinnerListsForPatternsLoop{#1}{#2}{#3}{#4}{#5}%
}%
}%
\newwrite\Prizewinners
\immediate\openout\Prizewinners Preisgewinner.txt
\immediate\write\Prizewinners{%
\CreatePrizeWinnerList{3}{
{Schueler 01}{0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0}
{Schueler 02}{0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1}
{Schueler 03}{0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1}
{Schueler 04}{0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1}
{Schueler 05}{0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1}
{Schueler 06}{0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0}
{Schueler 07}{0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1}
{Schueler 08}{0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0}
{Schueler 09}{0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1}
{Schueler 10}{0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0}
{Schueler 11}{0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1}
{Schueler 12}{1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}
{Schueler 13}{1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0}
{Schueler 14}{1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}
{Schueler 15}{1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1}
{Schueler 16}{1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1}
{Schueler 17}{1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1}
{Schueler 18}{1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1}
{Schueler 19}{1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0}
{Schueler 20}{1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1}
{Schueler 21}{1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0}
}{
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0
}{\PrintPrizeWinnerList}%
}%
\immediate\write\Prizewinners{////////////////////////////////////////^^J}%
\CreatePrizeWinnerListsForPatterns{3}{
{Schueler 01}{0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0}
{Schueler 02}{0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1}
{Schueler 03}{0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1}
{Schueler 04}{0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1}
{Schueler 05}{0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1}
{Schueler 06}{0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0}
{Schueler 07}{0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1}
{Schueler 08}{0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0}
{Schueler 09}{0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1}
{Schueler 10}{0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0}
{Schueler 11}{0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1}
{Schueler 12}{1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}
{Schueler 13}{1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0}
{Schueler 14}{1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}
{Schueler 15}{1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1}
{Schueler 16}{1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1}
{Schueler 17}{1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1}
{Schueler 18}{1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1}
{Schueler 19}{1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0}
{Schueler 20}{1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1}
{Schueler 21}{1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0}
}{0}{2047}%
\immediate\closeout\Prizewinners
\stop
------------------------ Schnappel --------------------------------------------
Da das Programm kein Dokument, sonden nur ein paar
Messages für die Konsole und eine externe Textdatei erstellt,
habe ich auf \documentclass und die document-Umgebung
verzichtet, mich aber fröhlich der \romannumeral-Expansion
bedient.
Mit freundlichem Gruß
Ulrich