Ṅ×ịß
Provalo online!
Il collegamento TIO aggiunge un piè di pagina per chiamare la funzione con il programma Tip di esempio mostrato nella pagina Esolang (il "wrapper automatico" di M per chiamare le funzioni come se fossero programmi che non possono gestire numeri razionali o a virgola fissa, o almeno non ho ho capito come dirlo come, quindi ho bisogno di trasformare la funzione in un programma completo a mano per poterlo eseguire.)
Questo in realtà stampa un utile output di debug; il programma non può essere scritto in 3 byte in M perché un programma composto esattamente da tre diadi innesca un caso speciale nel parser, quindi ho dovuto aggiungere un comando aggiuntivo per evitare il caso speciale. Farlo Ṅ
(stampare con newline) almeno gli dà uno scopo utile.
ı
i=−1−−−√
Non implementa l'I / O (diverso da halt / no-halt). L'I / O è un'estensione di Tip (non parte della lingua stessa) e non è necessaria per la completezza di Turing.
Spiegazione / sfondo
Ṅ×ịß
Ṅ Print {the left argument} and a newline; also resolves a parser ambiguity
ị {The left argument}th element of {the right argument}, wrapping on OoB
× Multiply {the left argument} by {the chosen element}
ß Recursive call; arguments: {the product} and {the same right argument}
[1,2,3]
[1,2,3,1,2,3,1,2,3,…]
rx+s, che è un polinomio, e la "conversione di base" incorporata in molte lingue del golf è in realtà un valutatore polinomiale per scopi generici sotto mentite spoglie. Quindi tutto ciò che dobbiamo fare è indicizzare in un elenco di elenchi di cifre, convertirli in base e abbiamo finito, giusto?
xx
ḅ
x⊕(x⊗y)x⊗y⊕. Certo, potremmo sovrascrivere il comportamento di concatenamento praticamente a tutto ciò che vogliamo, ma costerebbe un intero byte e le voci del linguaggio golf a questa domanda stanno diventando così brevi che un byte è molto.
Quindi ho guardato indietro e rivalutato un po '. Ci sono operazioni che potremmo usare al posto della valutazione polinomiale? Idealmente, quelli che sono commutativi, quindi non dobbiamo preoccuparci dell'ordine degli argomenti? Poco dopo, mi sono reso conto che le funzioni di Collatz sono più complesse di quanto debbano essere.
s
E, ovviamente, a differenza della conversione di base ( ḅ
), la moltiplicazione ( ×
) è commutativa, e quindi non importa in quale ordine sono collocati gli argomenti. Quindi tutto ciò di cui abbiamo bisogno è scrivere ×ị
, e quindi posizionare il programma in una ricorsione infinita con ß
, e abbiamo un linguaggio completo di Turing. Destra?
(x⊙y)⊕(x⊗y)¹×ịß
¹
¹
Ṅ
è una buona scelta perché produce un utile output di debug.
Sono possibili tre byte? A meno che non mi manchi qualcosa, non con questa specifica scelta di linguaggio implementativo e implementato, ma a questo punto sembra sicuramente che sarebbe possibile in qualche modo, poiché ci sono così tanti modi per farlo in quattro e così tanti Turing-complete lingue che potresti implementare.
eval
soluzioni banali .