Brainf * ck Problem z pętlą

19

Mam problem z cyber klubem, który prosi o wydrukowanie:

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

Używanie Brainf ** k w 29 bajtach lub mniej bez użycia znaku „,”.

Mam działający kod:

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

Jednak moja pętla jest za długa, wysyłając mi 16 bajtów ponad limit.

Czy istnieje bardziej skuteczny sposób na ustawienie drugiej i trzeciej komórki na 58 i 90, aby móc uruchomić drugą pętlę? Czy jest lepszy sposób, aby zrobić to wszystko razem, czego po prostu nie widzę?

Nick Rod
źródło
1
Co do Twojego pytania, podczas gdy tylko oszczędza cztery bajty, to faktycznie lepiej, aby wygenerować 59 i 90 i zmienić -.się .-, upuszczając >.<.
Martin Ender
Mam +[--->++<]>++++[.-]19 bajtów, ale drukuje również znaki kontrolne ...
Timtech
@MartinEnder Tak przepraszam za to, widziałem twój komentarz do drugiego postu i stwierdziłem, że ta grupa wydaje się bardziej odpowiednia, usunę tę w SO, ponieważ nie wygenerowała wielu odpowiedzi.
Nick Rod
2
Jestem szczerze ciekawy, czym jest ten „cyber klub”, ponieważ chłopcy muszą mieć naprawdę dobrych golfistów!
Sp3000,

Odpowiedzi:

23

27 24 bajtów

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

Spędziłem cały dzień w zasadzie na pisaniu brutalnego forcerka i obserwowaniu wyników. Teraz mogę wrócić do prawdziwej pracy ... Kolejny dzień brutalnego zmuszania później ...

Wypróbuj online!

Komponent ++[<++[++<]>>>+]inicjuje taśmę do

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

który jest po prostu idealny do tego, czego potrzebujemy!

Sp3000
źródło
8
Czary. (∩`-´) ⊃━ ☆ ゚. * ・。 ゚
primo
@primo Aby być uczciwym, nie mam pojęcia, co się dzieje pod względem struktury w pierwszej połowie, i myślę, że fakt, że jesteś w stanie wymyślić własne algorytmy / techniki, jest niesamowity :)
Sp3000
Taśma na końcu każdej pętli: codepad.org/ZoJUlQ8M . To wcale nie jest intuicyjne, że zakończyłoby się na wartościach, które robi, a nawet w ogóle;)
primo
1
Alternatywa 24:+[[>++<<]>->+>+]<[-<-.>]
primo
15

30 bajtów

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

Wypróbuj online!

85 i 171 są dość łatwe do wygenerowania w przelotnym mózgu (modułowe odwrotności 3 i -3 ). 85 jest dość bliskie 90 , a 171 jest dość bliskie 177 ( 59,3 ), który jest tutaj używany. Przy odrobinie włamań jestem w stanie wyprodukować 88 i 176 .

Jednak wciąż brakuje o jeden bajt celu.

Inne sugestie

Ogólnie rzecz biorąc, krótsze jest iterowanie po liście, mnożenie przez stałą, a nie w drugą stronę. Jest to szczególnie prawdziwe w przypadku 3 lub więcej wartości. Na przykład:

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

można zapisać jako:

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

Były tylko dwie wartości wewnętrzne, więc w tym przypadku nie jest to duża poprawa. W rzeczywistości tylko refaktoryzacja jest o jeden bajt krótsza:

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

Mnożenie 30 przez 2 i 3 , a nie 10 przez 6 i 9 . Zgodnie z sugestią Martina Büttnera jest to już 38 bajtów, bez większych zmian w oryginale:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]
primo
źródło
Nigdy nie pomyślałbym o pomnożeniu 58 i iteracji przez większą liczbę, to jest o wiele bardziej wydajne.
Nick Rod
4

34 bajty

Zapisałem ci 11 bajtów, ale wciąż o 5 bajtów za długo ...

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

Spędziłem już godziny, mam nadzieję, że ktoś może to poprawić.

Timtech
źródło