Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  brainfuck-Compiler TMP style  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 20:55:59 16.05.2012   Titel:              Zitieren

Und ich habe keine Ahnung von Calling Conventions. :D

@Hacker: Hier mal eine schnell hingefrickelte Version eines "normalen" BF-Interpreters.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
void bf_run(char const* codeptr, unsigned char* memptr)
{
    while(*codeptr)
    {
        switch(*codeptr)
        {
        case '.':
            std::cout << static_cast<char>(*memptr);
            break;
 
        case ',':
            std::cin.read(reinterpret_cast<char*>(memptr), 1);
            break;
 
        case '>':
            ++memptr;
            break;
 
        case '<':
            --memptr;
            break;
 
        case '+':
            ++*memptr;
            break;
 
        case '-':
            --*memptr;
            break;
 
        case '[':
            ++codeptr;
 
            while(*memptr)
                bf_run(codeptr, memptr);
 
            while(*codeptr && *codeptr != ']')
                ++codeptr;
 
            break;
 
        case ']':
            return;
 
        default:
            break;
        }
 
        ++codeptr;
    }
}
 
int main()
{
    // Hello, World!\r\n
    char const source[] =
    "++++++++++"
    "["
    ">+++++++>++++++++++>+++>+<<<<-"
    "]"
    ">++."
    ">+."
    "+++++++."
    "."
    "+++."
    ">++."
    "<<+++++++++++++++."
    ">."
    "+++."
    "------."
    "--------."
    ">+."
    ">."
    "+++.";
 
    unsigned char memory[1024] = {};
 
    bf_run(source, memory);
}

http://ideone.com/EVnTV


Zuletzt bearbeitet von 314159265358979 am 20:58:26 16.05.2012, insgesamt 1-mal bearbeitet
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5802
Beitrag camper Mitglied 21:26:11 16.05.2012   Titel:              Zitieren

314159265358979 schrieb:
*push*

Na, wie siehts aus? :p
Mach ich, wenn mir mal wieder langweilig genug ist.

Wenn du Probleme zum Lösen brauchst, hab ich ein paar (Schwierigkeitsgrad variiert, und einige Lösungen sind bekannt):

Jedes Pack-Problem lässt sich in ein Problem mit Indexlisten (eine Templateklasse, deren Templateargumente ein einziges Pack aus Integern darstellen) umformulieren, also stelle ich die Probleme auch so:

  • 1. Erstelle eine Templatemetafunktion, die aus einer Indexliste zwei Listen erzeugt, in der jeweils die erste und die zweite Hälfte der Indizes enthalten ist F<0,1,2,3> -> <0,1>, <2,3>
  • 2. Erstelle eine Templatemetafunktion, die aus einer Indexliste zwei Listen erzeugt, in der jeweils die erste N und der Rest der Indizes getrennt werden F<<0,1,2,3,4,5>,2> -> <0,1>, <2,3,4,5>
  • 3. Erstelle eine Templatemetafunktion, die das letzte Element zurückgibt: F<0,1,2,3> -> 3
  • 4. Erstelle eine Templatemetafunktion, die das N-te Element zurückgibt: F<<5,6,7,8>,2> -> 7
  • 5. Erstelle eine Templatemetafunktion, die zwei Listen mischt, so dass die Elemente aus beiden Listen jeweils abwechseln: F<<0,1,2,3>,<6,7,8,9>> -> <0,6,1,7,2,8,3,9>
  • 6. Erstelle eine Templatemetafunktion, die zwei Listen mischt, so dass jedes Element der einen Liste mit jedem der anderen Liste verknüft, Bonuspunkte, wenn die Verknüpfung selbst ein Parameter ist
    z.B. F<<0,1,2>, <10,11,12>> -> <0+10,0+11,0+12,1+10,1+11,1+12,2+10,2+11,2+12>
  • 7. Erstelle eine Templatemetafunktion, die eine Liste erzeugt, in der die Elemente der ersten Liste sooft wiederholt werden, wie das korrespondierende Element der zweiten Liste vorgibt
    F<<0,1,2>,<3,1,2>> -> <0,0,0,1,2,2>
Die Lösung sollte optimal in Hinblick auf Tiefe der rekursiven Instantiierung, algorithmische Komplexität und Speicherverbrauch sein. Bonuspunkte, wenn diese Kriterien gleichzeitig vorliegen (es kann durchaus mehrere Lösungen je nach Schwerpunkt geben).


Zuletzt bearbeitet von camper am 22:05:07 16.05.2012, insgesamt 5-mal bearbeitet
Unregistrierter





Beitrag Unregistrierter 21:26:39 16.05.2012   Titel:              Zitieren

314159265358979 schrieb:

@Hacker: Hier mal eine schnell hingefrickelte Version eines "normalen" BF-Interpreters.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
void bf_run(char const* codeptr, unsigned char* memptr)
{
    while(*codeptr)
    {
        switch(*codeptr)
        {
        case '.':
            std::cout << static_cast<char>(*memptr);
            break;
 
        case ',':
            std::cin.read(reinterpret_cast<char*>(memptr), 1);
            break;
 
        case '>':
            ++memptr;
            break;
 
        case '<':
            --memptr;
            break;
 
        case '+':
            ++*memptr;
            break;
 
        case '-':
            --*memptr;
            break;
 
        case '[':
            ++codeptr;
 
            while(*memptr)
                bf_run(codeptr, memptr);
 
            while(*codeptr && *codeptr != ']')
                ++codeptr;
 
            break;
 
        case ']':
            return;
 
        default:
            break;
        }
 
        ++codeptr;
    }
}
 
int main()
{
    // Hello, World!\r\n
    char const source[] =
    "++++++++++"
    "["
    ">+++++++>++++++++++>+++>+<<<<-"
    "]"
    ">++."
    ">+."
    "+++++++."
    "."
    "+++."
    ">++."
    "<<+++++++++++++++."
    ">."
    "+++."
    "------."
    "--------."
    ">+."
    ">."
    "+++.";
 
    unsigned char memory[1024] = {};
 
    bf_run(source, memory);
}

http://ideone.com/EVnTV


Schnell-hingefrickelt...
Nicht Turing-Vollständig, aber abgesehen davon - kannst du Schleifen verschachteln? Und nebeneinander stehen können sie auch? :p


Zuletzt bearbeitet von Unregistrierter am 21:27:18 16.05.2012, insgesamt 1-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16057
Beitrag hustbaer Mitglied 21:53:06 16.05.2012   Titel:              Zitieren

Bei der Gelegenheit...

Hier findet man sehr hübsche, schnelle und vor allem übersichtlich implementierte BF Interpreter:

http://www.c-plusplus.de/forum/p2120628#2120628

:o)

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 22:37:08 16.05.2012   Titel:              Zitieren

@camper: Beispiel 1:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename, typename, int, int>
struct split_half_impl;
 
template <int HA, int... TA, int HB, int... TB, int NA, int NB>
struct split_half_impl<intlist<HA, TA...>, intlist<HB, TB...>, NA, NB>
    : split_half_impl<intlist<HA, TA..., HB>, intlist<TB...>, NA + 1, NB - 1>
{};
 
template <int HA, int... TA, int HB, int... TB, int N>
struct split_half_impl<intlist<HA, TA...>, intlist<HB, TB...>, N, N>
{
    typedef intlist<HA, TA...> first;
    typedef intlist<HB, TB...> second;
};
 
template <typename>
struct split_half;
 
template <int H, int... T>
struct split_half<intlist<H, T...>>
    : split_half_impl<intlist<H>, intlist<T...>, 1, sizeof...(T)>
{};

Wie lieg ich so? :o)

(Für leere Listen sowie Listen mit ungerader Anzahl an Elementen hab ich mir die Implementierung erstmal erspart.)


Zuletzt bearbeitet von 314159265358979 am 22:38:19 16.05.2012, insgesamt 2-mal bearbeitet
xyz123
Unregistrierter




Beitrag xyz123 Unregistrierter 02:13:24 17.05.2012   Titel:              Zitieren

Hacker schrieb:
Ethon schrieb:
Also nur 'pseudo'.
Trotzdem interessant, mach mal. ;)


Was gibts eig. noch interessantes in der Richtung? Hab da grad voll Bock drauf :D


Hab grad einen Vortrag zu genau dem gleichen Thema gehört. Dort wurde ein Haskell Interpreter zur compile-Zeit gebaut: http://cppnow.org/files/2012/04/Sinkovics.Porkol%C3%A1b.pdf
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 23:26:59 17.05.2012   Titel:              Zitieren

..
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 18:15:33 22.05.2012   Titel:              Zitieren

Hey camper, sag doch mal was! :(

@Ethon: Ich finde deine Projektidee zwar interessant, aber ich kann damit immer noch nicht wirklich viel anfangen. Wie und wozu verwendet man sowas? :o)


Zuletzt bearbeitet von 314159265358979 am 18:40:25 22.05.2012, insgesamt 1-mal bearbeitet
Unregistrierter





Beitrag Unregistrierter 19:21:35 22.05.2012   Titel:              Zitieren

314159265358979 schrieb:
Hacker schrieb:
Ethon schrieb:
Also nur 'pseudo'.
Trotzdem interessant, mach mal. ;)


Was gibts eig. noch interessantes in der Richtung? Hab da grad voll Bock drauf :D

Unendlich viel. Schreib nen Mathe-Parser. Schreib einen Mergesort für Wert-Parameter. etc.


So, mit dem Mathe-Parser bin ich praktisch fertig. Mergesort für Wertparameter - was ist daran so "aufregend" (ich habe glaub' ich nicht ganz verstanden was gefragt ist)?
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 19:42:04 22.05.2012   Titel:              Zitieren

Zeig doch mal her den Matheparser.
c++.de :: C++ (auch C++0x und C++11) ::  brainfuck-Compiler TMP style  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.