Introduzione: logica combinatoria
La logica combinatoria (CL) si basa su cose chiamate combinatori , che sono fondamentalmente funzioni. Esistono due combinatori "incorporati" di base S
e K
, che verranno spiegati in seguito.
Sinistra-associatività
CL è associativo di sinistra , il che significa che le parentesi (contenenti elementi) che si trovano all'estrema sinistra di un'altra coppia di parentesi che lo contengono possono essere rimosse, rilasciandole. Ad esempio, qualcosa del genere:
((a b) c)
Può essere ridotto a
(a b c)
Dove si (a b)
trova all'estrema sinistra della staffa più grande ((a b) c)
, quindi può essere rimosso.
Un esempio molto più grande di associazione sinistra (le parentesi quadre sono spiegazioni):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
Le parentesi possono anche essere ridotte quando più di una coppia avvolge gli stessi oggetti. Esempi:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
builtins
CL ha due combinatori "incorporati" S
e K
, che possono scambiare oggetti (combinatori singoli o un gruppo di combinatori / gruppi racchiusi tra parentesi) in questo modo:
K x y = x
S x y z = x z (y z)
Dove x
, y
e z
può essere controfigure per qualsiasi cosa.
Un esempio di S
e K
sono i seguenti:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
Un altro esempio:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
Quanto sopra sono esempi di normali istruzioni CL, in cui l'istruzione non può essere ulteriormente valutata e ottiene un risultato finale in un tempo limitato. Esistono istruzioni non normali (che sono istruzioni CL che non terminano e continueranno a essere valutate per sempre), ma non rientrano nell'ambito della sfida e non dovranno essere coperte.
Se vuoi saperne di più su CL, leggi questa pagina di Wikipedia .
Compito:
Il tuo compito è creare combinatori extra, dato il numero di argomenti e ciò che valuta come input, che è dato in questo modo:
{amount_of_args} = {evaluated}
Dove {amount_of_args}
è un numero intero positivo uguale al numero di args ed è {evaluated}
composto da:
- argomenti fino alla quantità di argomenti, con
1
il primo argomento,2
il secondo, eccetera.- Hai la garanzia che i numeri degli argomenti al di sopra della quantità di arg (quindi solo
4
quando{amount_of_args}
è3
) non verranno visualizzati{evaluated}
.
- Hai la garanzia che i numeri degli argomenti al di sopra della quantità di arg (quindi solo
- parentesi
()
Quindi esempi di input sono:
3 = 2 3 1
4 = 1 (2 (3 4))
Il primo input richiede un combinatore (diciamo, R
) con tre argomenti ( R 1 2 3
), che quindi valuta in:
R 1 2 3 -> 2 3 1
Il secondo input richiede questo (con un nome combinatore A
):
A 1 2 3 4 -> 1 (2 (3 4))
Dato l'input in questo formato, è necessario restituire una stringa di S
, K
che ()
, quando sostituita con un nome combinatore ed eseguita con argomenti, restituisce la stessa istruzione valutata del {evaluated}
blocco quando il blocco comandi viene sostituito con quel nome combinatore.
L'istruzione combinatore di output può avere il suo spazio bianco rimosso e le parentesi esterne rimosse, quindi qualcosa di simile (S K K (S S))
può essere trasformato in SKK(SS)
.
Se si vuole testare le uscite del vostro programma, @aditsu ha fatto un parser logica combinatoria (che comprende S
, K
, I
e anche altri quelli come B
e C
) qui .
Punto:
Poiché si tratta di un metagolf , lo scopo di questa sfida è quello di ottenere il minor numero di byte nell'output possibile, dati questi 50 casi di test . Inserisci i risultati per i 50 casi di test nella risposta, oppure crea un pastebin (o qualcosa di simile) e pubblica un link a quel pastebin.
In caso di pareggio, vince la prima soluzione.
Regole:
- La tua risposta deve restituire un output CORRETTO - quindi, dato un input, deve restituire l'output corretto secondo la definizione nell'attività.
- La risposta deve essere emessa entro un'ora su un laptop moderno per ogni caso di test.
- Non è consentito alcun hard-coding di soluzioni. Tuttavia, è consentito codificare fino a 10 combinatori.
- Il tuo programma deve restituire la stessa soluzione ogni volta per lo stesso input.
- Il programma deve restituire un risultato valido per qualsiasi input fornito, non solo per i casi di test.
1
, puoi sottrarre 1
da tutto e quindi avvolgere la soluzione per quella risposta K()
. Esempio: soluzione per 2 -> 1
is K
, quindi soluzione per 3 -> 2
is KK
, soluzione per 4 -> 3
is K(KK)
etc.