Seite 2 von 2
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Montag 2. Februar 2026, 07:17
von Dennis89
@Dennis89: Du änderst da ja nur das zweite Wort. Meine 107 Bytes beziehen sich auf alle Änderungen.
Ja, das habe ich verstanden, deswegen das "Mist".
44? Alleine ` R='Das licht des Mondes beleuchtet DIE Nacht.'` hat schon 47
Bitte zeige mal deine Lösung. Bestimmt wieder irgendwelhe Bitoperationen, auf die normal sterbliche nicht kommen
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Montag 2. Februar 2026, 14:19
von __blackjack__
@Dennis89: *Das* wäre doch nur ``R=S``, ich gehe ja davon aus, dass die Eingabedaten ``S="... der Satz ..."`` schon existieren und zähle nur die Bytes die für das erstellen von `R` aus `S` notwendig sind. Und nur den ersten Buchstaben vom zweiten Wort ”vergrössern”, kann man in 44 Bytes so machen:
Also nix exotisches. Das entspricht vom Vorgehen meinem ersten BASIC-Programm, das dafür 239 Bytes braucht. Wobei ich da nicht auf Bytes sparen geachtet habe. Da kommt man leicht auf 206 runter (Null-Bytes nicht mitgezählt):
Code: Alles auswählen
1 S$="Das licht des Mondes beleuchtet DIE Nacht.":I=1
2 IFMID$(S$,I,1)<>" "THENI=I+1:GOTO2
3 PRINTLEFT$(S$,I);:C$=MID$(S$,I+1,1)
4 IFC$>"`"ANDC$<"{"THENC$=CHR$(ASC(C$)-32)
5 PRINTC$;:PRINTMID$(S$,I+2)
Edit: Die Zeilen 3 und 4 habe ich nicht zusammengefasst, weil die voreingestellte Terminalbreite, und damit die Längenbegrenzung für eine Zeile, bei Altair BASIC 72 Zeichen beträgt. Wegen den weit verbreiteten TeleType 33 die als Terminals verwendet wurden, und die nur 72 Zeichen pro Zeile haben.
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Montag 2. Februar 2026, 14:28
von Kudde
Moin zusammen, vielen Dank für Eure Mühe. Das Problem bei der Aufgabe war, das ich nur die Sachen benutzen sollte, welche wir bis dahin gelernt hatten.
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Montag 2. Februar 2026, 15:03
von __blackjack__
@Kudde: Dann ergibt sich daraus für uns natürlich das Problem, dass wir nicht wissen was ihr bis dahin schon gelernt hattet.
Wobei sich `capitalize()` ja durch Sachen ersetzen lässt, die auch bei den anderen Teillösungen von Dir verwendet werden, also wäre das kein Problem es richtig zu machen. Die Aufgabenformulierung spricht IMHO auch stark gegen `capitalize()`, das heisst der Aufgabensteller hat das wahrscheinlich bewusst _so_ formuliert, weil das keine der vorhandenen `str`-Methoden leistet.
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Montag 2. Februar 2026, 18:21
von noisefloor
Hallo,
@Kudde: die Frage zum Wissensstand hatte ich genau deshalb
hier bereits gestellt. Wenn du nochmal eine Frage zu einer Kursaufgabe hast am besten kurz noch beschreiben, was ihr schon könnt bzw. schreiben, was ihr verwenden dürft.
Gruß, noisefloor
Re: Greife auf das erste Zeichen des zweiten Wortes zu und ändere es in Großbuchstaben (licht -> Licht).
Verfasst: Freitag 3. April 2026, 08:35
von __blackjack__
Oh, Reiter im Browser ist noch offen und ich habe da auch noch einen Quelltext. In C. Läuft unter anderem auch auf einem VIC-20 mit 3½ KiB freiem RAM. Und auch der Zeilenumbruch macht auf dem Gerät total Sinn, wie man an der Ausgabe auf dem nur 23 Zeichen breiten Textbildschirm sehen kann:
Code: Alles auswählen
**** cbm basic v2 ****
3583 bytes free
ready.
load"test",8
searching for test
loading
ready.
run
Das licht des Mondes b
eleuchtet DIE Nacht.
DAS Licht des Mondes
beleuchtet die Nacht.
ready.
█
Der Umbruch ist an der genau passenden Stelle um den Text auf zwei Zeilen aufzuteilen.
Hier der Code:
Code: Alles auswählen
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
/**
* The program assumes the sentence is shorter than 255 characters, this
* constant can be used to mean the word start index is unset.
*/
#define NO_WORD_START 0xff
char sentence[] = "Das licht des Mondes beleuchtet DIE Nacht.";
/**
* The number of valid `word_starts` values.
*/
uint8_t word_starts_count;
/**
* The index of each of the `word_starts_count` words first character in the
* `sentence`.
*
* There can be at most half the length of the sentence words if each word is
* just one character long.
*/
uint8_t word_starts[sizeof sentence / 2];
/**
* Analyse the `sentence` and set `word_starts_count` and `word_starts`
* accordingly.
*/
void init_word_starts()
{
uint8_t i = 0, word_start = NO_WORD_START;
char c;
word_starts_count = 0;
while ((c = sentence[i])) {
if (word_start == NO_WORD_START) {
if (c != ' ') word_start = i;
} else {
if (c == ' ') {
word_starts[word_starts_count] = word_start;
++word_starts_count;
word_start = NO_WORD_START;
}
}
++i;
}
if (word_start != NO_WORD_START) {
word_starts[word_starts_count] = word_start;
++word_starts_count;
}
}
int main(void)
{
uint8_t i;
puts(sentence);
putchar('\n');
init_word_starts();
/* Upcase the first character of the second word. */
i = word_starts[1];
sentence[i] = toupper(sentence[i]);
/* Upcase the first word. */
i = word_starts[0];
while (sentence[i] != ' ') {
sentence[i] = toupper(sentence[i]);
++i;
}
/* Lowcase the next to last word. */
i = word_starts[word_starts_count - 2];
while (sentence[i] != ' ') {
sentence[i] = tolower(sentence[i]);
++i;
}
/* Insert a line break between the fourth and fifth word. */
i = word_starts[4] - 1;
sentence[i] = '\n';
puts(sentence);
return 0;
}