| Autor |
Nachricht |
314159265358979
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
|
314159265358979 Mitglied
20:55:59 16.05.2012 Titel: |
|
Zitieren |
Und ich habe keine Ahnung von Calling Conventions.
@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: 5771
|
camper Mitglied
21:26:11 16.05.2012 Titel: |
|
Zitieren |
| 314159265358979 schrieb: | *push*
Na, wie siehts aus?  | 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
|
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? |
Zuletzt bearbeitet von Unregistrierter am 21:27:18 16.05.2012, insgesamt 1-mal bearbeitet |
|
 |
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16032
|
hustbaer Mitglied
21:53:06 16.05.2012 Titel: |
|
Zitieren |
|
 |
314159265358979
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
|
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?
(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
|
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  |
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
|
314159265358979 Mitglied
23:26:59 17.05.2012 Titel: |
|
Zitieren |
|
 |
314159265358979
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
|
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? |
Zuletzt bearbeitet von 314159265358979 am 18:40:25 22.05.2012, insgesamt 1-mal bearbeitet |
|
 |
Unregistrierter
|
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  |
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
|
314159265358979 Mitglied
19:42:04 22.05.2012 Titel: |
|
Zitieren |
Zeig doch mal her den Matheparser. |
|
|
|
 |
|
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.
|
|
|
|
|