Questo è code-golf .
In questa sfida, scriveremo programmi / funzioni che risolvono enigmi " Knights and Knaves ".
sfondo
Ti ritrovi su un'isola ... ecc. ... Ogni persona sull'isola tranne te è un cavaliere o un furfante .
I cavalieri possono solo fare affermazioni vere .
I furfanti possono solo fare false dichiarazioni.
Non voglio definire rigorosamente "affermazione", ma diremo che un'affermazione è qualsiasi cosa che sia "vera" o "falsa". Si noti che ciò esclude frasi paradossali.
Ai fini di questa sfida, incontrerai gruppi di isolani; ti faranno delle dichiarazioni.
Il tuo compito è determinare chi è un cavaliere e chi è un furfante.
Ingresso:
Ti verranno fornite (in qualsiasi formato ragionevole) le seguenti informazioni:
Un elenco delle persone presenti. Verranno nominati con i caratteri alfabetici "AZ". Il limite al numero di persone imposto da questo non sarà superato.
Le dichiarazioni che ogni persona fa. Vedi sotto per dettagli importanti su questo.
Produzione
Verrà quindi emesso (in qualsiasi formato ragionevole) ciò che ogni persona è. Ad esempio, se ci fossero giocatori A B C Ded Aè un cavaliere, ma il resto sono furfanti, potresti produrre
A: 1
B: 0
C: 0
D: 0
Dettagli importanti:
I caratteri alfabetici in maiuscolo AZ si riferiscono agli isolani.
I caratteri
0(zero) e1(uno) si riferiscono rispettivamente a "Fante" e "Cavaliere". (Puoi specificare altri due caratteri non AZ, purché tu specifichi)Ogni isolano presente può fare qualsiasi numero naturale di affermazioni o può scegliere di non dire nulla.
I normali operatori logici possono essere utilizzati nelle istruzioni ( IS *, AND, OR, NOT ). Inoltre, possono essere utilizzate le leggi e le condizioni di De Morgan . I seguenti sono esempi di come potrebbero essere presentati in un puzzle parlato seguito da come potrebbero essere inseriti nel tuo programma.
(* su una nota più tecnica. L'operatore "IS" è veramente usato come contenimento (che non è un operatore logico). Quando dico "A è un cavaliere", intendo davvero "A è un membro dell'insieme di Knights ". Il vero operatore utilizzato sarebbe 'ϵ'. Per semplicità, useremo invece '='.)
Uso quanto segue (puoi usare qualunque cosa, purché sia ragionevole e coerente):
^EvO=È~NON=>IMPLICAX:La persona X afferma che ...
La persona Z potrebbe fare qualsiasi combinazione di uno dei seguenti tipi di affermazioni:
La persona Z dice che ...
La persona A è un cavaliere.
Z: A = 1La persona Q è un furfante.
Z: Q = 0Sono un cavaliere.
Z: Z = 1La persona A è un cavaliere O la persona B è un cavaliere.
Z: ( A = 1 ) v ( B = 1)La persona C è un cavaliere E io sono un furfante.
Z: ( C = 1 ) ^ ( Z = 0 )La persona R NON è un cavaliere.
Z: ~( R = 1 )
Inoltre, l'input può anche usare le leggi di De Morgan
NON è vero che sia la persona A che la persona B siano furfanti
Z: ~( ( A = 0 ) ^ ( B = 0 ) )È falso che una persona A o una persona B sia un cavaliere
Z: ~( ( A = 1 ) v ( B = 1) )
Infine, possono essere usati i condizionali e le loro negazioni
Se io sono un cavaliere, allora la persona B è un furfante
Z: ( Z = 1 ) => ( B = 0 )NON è vero che se la persona B è un cavaliere, allora la persona C è un furfante.
Z: ~( ( B = 1 ) => ( C = 0 ) )
Note sui condizionali
Dai un'occhiata a Wikipedia per maggiori informazioni.
Un'istruzione condizionale assume la forma p => q , dove p e q sono esse stesse istruzioni. p è l '"antecedente" e q è il "conseguente". Ecco alcune informazioni utili
La negazione di una condizione è simile alla seguente: ~ (p => q) è equivalente a p ^ ~ q
Una premessa errata implica qualcosa. Cioè: se p è falso, qualsiasi istruzione p => q è vera, indipendentemente da q . Ad esempio: "if 2 + 2 = 5 then I am Spiderman" è una vera affermazione.
Alcuni semplici casi di test
Questi casi sono indicati nel modo seguente (1) come potremmo porre il problema nel discorso (2) come potremmo porlo al computer (3) l'output corretto che il computer potrebbe fornire.
La persona A e la persona B ti avvicinano sulla strada e fanno le seguenti dichiarazioni:
A: B è un furfante o io sono un cavaliere.
B: A è un cavaliere.
Risposta:
B è un cavaliere e A è un cavaliere.
Ingresso:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
Produzione:
A = 1 B = 1
Le persone A, B e F ti avvicinano sulla strada e fanno le seguenti dichiarazioni:
A: Se sono un cavaliere, allora B è un furfante.
B: Se questo è vero, anche F è un furfante.
Risposta:
A è un cavaliere, B è un furfante, F è un cavaliere.
Ingresso
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
Produzione:
A = 1 B = 0 F = 1
Q, X e W si avvicinano alla strada e fanno le seguenti affermazioni:
W: Non è vero che sia Q sia X siano Knights.
D: Questo è vero.
X: Se ciò che dice W è vero, allora ciò che dice Q è falso.
Risposta:
W e Q sono cavalieri. X è un furfante.
Ingresso
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
Produzione
W = 1 Q = 1 X = 0
C'è una sfida simile di 3 anni fa che si concentra sull'analisi e non contiene condizionali o De Morgan. E quindi, direi, è abbastanza diverso nella messa a fuoco e nell'attuazione per evitare che questo sia un inganno.
Questa sfida è stata brevemente chiusa come un duplicato. Da allora è stato riaperto.
Sostengo che questa sfida sia, innanzitutto, diversa in primo piano. L'altra sfida si concentra sull'analisi dell'inglese, no. In secondo luogo utilizza solo AND e OR mentre questo utilizza condizionali e consente la risoluzione di molti più enigmi. Alla fine della giornata, la domanda è se le risposte a quella sfida possano essere sostituite banalmente a questa sfida, e credo che l'inclusione di condizionali e negazioni condizionali aggiunga una complessità sufficiente che sarebbe necessario apportare cambiamenti più solidi per per rispondere a questa sfida.
OR, potrebbe essere A:1 B:1o A:1 B:0perché B B=1potrebbe essere falso mentre A sarebbe ancora vero.
(B=1)^(C=1)secondo come vengono normalmente trattati i condizionali
(B=1)=>(C=0)?~((B=1)=>(C=0))o(B=1)=>(C=1)qualcos'altro?