Brainf * ck Problema ad anello


19

Ho un problema con un cyber club che ti chiede di stampare:

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

Usare Brainf ** k in 29 byte o meno senza usare il carattere ','.

Ho un codice funzionante:

++++++++++[>++++++>+++++++++<<-]>-->.<[>-.<-]

Comunque il mio loop è troppo lungo, mandandomi 16 byte oltre il limite.

C'è un modo più efficiente per impostare la seconda e la terza cella su 58 e 90 in modo da poter eseguire il mio secondo ciclo? O c'è un modo migliore per fare tutto questo insieme che non vedo?


1
Per quanto riguarda la tua domanda, mentre salva solo quattro byte, in realtà è meglio generare 59 e 90 e cambiare il carattere -.in .-, rilasciando il >.<.
Martin Ender,

Ho ottenuto +[--->++<]>++++[.-]19 byte, ma stampa anche i caratteri di controllo ...
Timtech,

@MartinEnder Sì, mi dispiace, ho visto il tuo commento sull'altro post e ho trovato questo gruppo che sembrava molto più appropriato, eliminerò quello su SO poiché non ha generato molte risposte.
Nick Rod,

2
Sono sinceramente curioso di sapere cos'è questo "cyber club", perché devono avere dei golfisti davvero bravi!
Sp3000,

Risposte:


23

27 24 byte

++[<++[++<]>>>+]<[-<-.>]

Ho trascorso un'intera giornata fondamentalmente scrivendo un bruto forcer e guardando i risultati arrivare. Ora posso tornare a fare un po 'di lavoro reale ... Un altro giorno di forzatura bruta più tardi ...

Provalo online!

Il componente ++[<++[++<]>>>+]inizializza il nastro su

[130, 0, 0, 0, 91, 59, 0]
                       ^

che è semplicemente perfetto per ciò di cui abbiamo bisogno!


8
Magia. (∩`-´) ⊃━ ☆ ゚. * ・。 ゚
primo

@primo Per essere onesti, non ho idea di cosa stia succedendo dal punto di vista strutturale nel primo semestre, e penso che il fatto che tu sia in grado di elaborare i tuoi algoritmi / tecniche sia incredibile :)
Sp3000,

Nastro alla fine di ogni ciclo: codepad.org/ZoJUlQ8M . Non è affatto intuitivo che terminerebbe ai valori che fa, o addirittura a tutti;)
primo

1
Un'alternativa 24:+[[>++<<]>->+>+]<[-<-.>]
primo

15

30 byte

-<-[>+>-[---<]>]>++>+[---<.->]

Provalo online!

85 e 171 sono abbastanza facili da generare in brainfuck (inversioni modulari di 3 e -3 ). 85 è abbastanza vicino a 90 e 171 è abbastanza vicino a 177 ( 59 · 3 ), che viene utilizzato qui. Con un po 'di hacker, sono invece in grado di produrre 88 e 176 .

Ancora un byte in meno rispetto al bersaglio, però.

Altri suggerimenti

In generale, è più breve iterare su un elenco, moltiplicando per una costante, piuttosto che nell'altro modo. Ciò è particolarmente vero per 3 o più valori. Ad esempio, questo:

++++++++++[>++++++>+++++++++<<-]

può essere scritto come:

+>++++[+++++[>++++++++++<-]<]>

C'erano solo due valori interiori, quindi non è molto un miglioramento in questo caso. In effetti, solo il refactoring è più corto di un byte:

+++++[>++++++[>++>+++<<-]<-]>

Moltiplicare 30 per 2 e 3 , anziché 10 per 6 e 9 . Con il suggerimento di Martin Büttner, questo è già fino a 38 byte, senza molte modifiche all'originale:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]

Non avrei mai pensato di moltiplicare il 58 e iterare per un numero maggiore, è molto più efficiente.
Nick Rod,

4

34 byte

Ti ho salvato 11 byte, ma ancora 5 byte troppo a lungo ...

+[--->++<]>++++<+[--------->.-<]>.

Ho già passato ore, spero che qualcuno possa migliorare su questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.