Des Rätsels Lösung ???? Ich find sie nicht!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

dominik

Betreff: Des Rätsels Lösung ???? Ich find sie nicht!

BeitragMi, Jan 26, 2005 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nen Freund von mir hat mir vor ner Woche mal Folgendes Rätsel gestellt:
Code: [AUSKLAPPEN]
Verfolständige folgende Reihe:

1
11
21
1211

wobei eine Zeile immer die darüberstehende beschreibt. man kann nur die drei zahlen 1,2,3 verwenden. Man kann die Reihe unendlich vordsetzen.


[Damit die die wollen selber noch nen bischen Rätseln können schreib ich die Lösung erst ganz am Ende].

Zur Lösung des Rätsel (was ja eigentlich garnicht wirklich möglich ist) wollte ich ein kleines Progg schreiben. nur leider stimmt da irgentwas nicht und mein progg bricht immer nachdem es die ersten beiden Zeilen korrekt Vervollständigt hat ab.

Und das war mein Versuch:
Code: [AUSKLAPPEN]

datei = WriteFile("Raetsel.txt")                  ;Erstellen der ersten Zeile in einer Datei aus der dann immer wieder die letzte Zeile ausgelesen wird
WriteLine datei, "112213"                        ;Zu testzwecken hab ich nicht einfach nur mit einer eins in der ersten Zeile angefangen
CloseFile datei                                 ;die nächste Zeile müsste dann logischer weise 21221113 heisen


Repeat
  datei_sch = OpenFile("Raetsel.txt")               ;mit datei_sch wird in die Datei geschreiben
  datei_l = ReadFile("Raetsel.txt")                  ;und mit datei_l aus der datei gelsen
 
  Repeat
    a$ = ReadLine(datei_sch)                     ;ermitteln der Zeilenlänge um die Schleifendurchläufe zu bestimmen
    anzahl_zeile = Len(a$)
    Anzahl_alle_zeichen = Anzahl_alle_zeichen + anzahl_zeile
  Until Eof(datei_sch)
  SeekFile(datei_l, Anzahl_alle_zeichen - anzahl_zeile - 4)   ;Hier in den Zwei Zeilen muss jetzt irgentwo der Fehler sein
  SeekFile(datei_sch, Anzahl_alle_zeichen)               ;beim verschieben der Zeiger in der Datei
  WriteLine datei_sch, Chr$(10)
 
  vorherige_zeile = ReadLine(datei_l) 
  zeichen_anzahl = Len(vorherige_zeile)
  einzeln_vorher = ""
  aktuelles_zeichen = ""
  zeile$ = ""
  speicher$ = ""
  anzahl$ = ""

  For i = 1 To zeichen_anzahl + 1                  ;Für die anzahl der Zeichen in der in der Ausgelsenen Zeile jeweils ein Schleifendurvchlauf
    einzeln_vorher = aktuelles_zeichen
    aktuelles_zeichen = Mid$(vorherige_zeile, i, 1)    ;ein Zeichen aus der Zeile auslesen

    If aktuelles_zeichen <> 0 And aktuelles_zeichen = einzeln_vorher Then    ;Überprüfen ob das Aktuelle Zeichen mit dem letzen übereinstimmt
      speicher$ = speicher$ + aktuelles_zeichen                        ;wenn ja dann muss gespeichert werden wieviel gleiche zeichen hintereinander gefunden wurden
    Else
      anzahl$ = Len(speicher$)
      speicher$ = Left(speicher$, 1)
      If anzahl$ > 0 Then zeile$ = zeile$ + anzahl$ + speicher$   

      speicher$ = aktuelles_zeichen
    EndIf
  Next
  WriteLine datei_sch, zeile$

  CloseFile datei_l                           ;Schließen der Dateien
  CloseFile datei_sch
 
Until vorherige_zeile = 0

ich hoffe mein code ist halbweges verständlich. ich weiß es gib mit sicherheit bessere lösungen als jedesmal das ergebnis in eine datei zu schreiben und wieder auszulesen, z.B. Types.




[Lösung des Rätsels:]
1
11 <- in der ersten Zeile steht eine Eins
21 <- in der zweiten Zeile stehen zwei Einser
1211 <- in der dritten stehen eine Eins eine Zwei und zwei Einser

also die erste Zahl besagt immer wieviele der danach folgenden Zahl in der darüberstehende Zeile stehen.
BB+ 1.41|Sempron 2.8|geforce fx5200|1GB DDR|XP home SP2 / prof.
 

noir

BeitragMi, Jan 26, 2005 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
das rätsel is sehr bekannt.
aber beim ersten mal bekommen es die wenigstens sofort raus. Wink

warum schreibst du im topic: Ich find sie nicht! und hast sie doch schon??
Fragt und man wird euch helfen

Das Alternativ BlitzBasic-Forum: FreeCoder
Einfach chatten: BlitzChat
Code&Text schnell und einfach pasten: FreePasting
  • Zuletzt bearbeitet von noir am So, März 06, 2005 13:07, insgesamt einmal bearbeitet

Rob_

BeitragDo, Jan 27, 2005 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist doch ganz einfach:

Code: [AUSKLAPPEN]


1
11
21
1211 ...
21111

AMD Athlon 64 3500+ | Infineon 1 GB DDR RAM | nVidia Geforce 7800 GTX
 

noir

BeitragDo, Jan 27, 2005 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Rob_ hat Folgendes geschrieben:
Ist doch ganz einfach:

Code: [AUSKLAPPEN]


1
11
21
1211 ...
21111 <---is total falsch



dominik hat doch doch die lösung schon erklärt.
richtig wäre:
1
11
21
1211
111221 <- richtig
Fragt und man wird euch helfen

Das Alternativ BlitzBasic-Forum: FreeCoder
Einfach chatten: BlitzChat
Code&Text schnell und einfach pasten: FreePasting
  • Zuletzt bearbeitet von noir am So, März 06, 2005 13:07, insgesamt einmal bearbeitet

Clonker

BeitragDo, Jan 27, 2005 1:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessante Sache.
Hier mal meine Lösung:

Code: [AUSKLAPPEN]

dim zahlen$(0)

anfang$ = "1" ;Anfangszahl

For i = 1 to 10
  print anfang$
  anfang$ = raetsel_loesen(anfang$)
next

waitkey() : End


function raetsel_loesen$(a$)
   Dim zahlen$(len(a$))
   
   for i = 1 to len(a$)
      ;Für 1
      if mid(a$,i,1) = "1" then
        If Mid(a$,i+1,1) <> "1" Then
          zahlen(i) = "11"
        Else
          If Mid(a$,i+2,1) <> "1" Then
            zahlen(i) = "21"
            i = i + 1
          else
            zahlen(i) = "31"
            i = i + 2
          Endif
        Endif
      Endif
      ;Für 2
      if mid(a$,i,1) = "2" then
        If Mid(a$,i+1,1) <> "2" Then
          zahlen(i) = "12"
        Else
          If Mid(a$,i+2,1) <> "2" Then
            zahlen(i) = "22"
            i = i + 1
          else
            zahlen(i) = "32"
            i = i + 2
          Endif
        Endif
      Endif
      ;Für 3
      if mid(a$,i,1) = "3" then
        If Mid(a$,i+1,1) <> "3" Then
          zahlen(i) = "13"
        Else
          If Mid(a$,i+2,1) <> "3" Then
            zahlen(i) = "23"
            i = i + 1
          else
            zahlen(i) = "33"
            i = i + 2
          Endif
        Endif
      Endif
   next
   
   
   x = Len(a$)
   a$ = ""
   
   for i = 1 to x
      a$ = a$ + zahlen(i)
   next
   
   a$ = replace(a$,"0","")
   
   Return a$
End Function
Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte
 

David

BeitragDo, Jan 27, 2005 8:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Meins:

Code: [AUSKLAPPEN]

Graphics 800, 600, 32

PrintReihe( "1", 0 )
WaitKey
End

Function PrintReihe( val$, cnt% )
   If cnt% = 10 Then Return
   Print val$
   cnt%     = cnt% + 1
   PrintReihe( Raetsel( val$ ), cnt% )
End Function

Function Raetsel$( value$ )
   Local temp$   = ""
   Local lastC$  = ""
   Local result$ = ""
   Local cnt%    = 0
   
   For i% = 1 To Len( value$ )   + 1
      temp$ = Mid( value$, i%, 1 )

      If ( i% = 1 ) Then lastC$ = temp$
       
      If ( temp$ <> lastC$ )
         result$ = result$ + Str( cnt% ) + lastC$
         lastC$  = temp$
         cnt%    = 1
      Else
         cnt% = cnt% + 1
      EndIf
   Next
   
   Return result$
End Function


Edit:

Zitat:

[Lösung des Rätsels:]
1
11 <- in der ersten Zeile steht eine Eins
21 <- in der zweiten Zeile stehen zwei Einser
1211 <- in der dritten stehen eine Eins eine Zwei und zwei Einser

also die erste Zahl besagt immer wieviele der danach folgenden Zahl in der darüberstehende Zeile stehen.


Da steht ja sogar die Lösung... Rolling Eyes Wobei ich mit dieser Zeile nicht einverstanden bin:

Zitat:

1211 <- in der dritten stehen eine Eins eine Zwei und zwei Einser


In der 3. Zeile stehen nämlich: eine zwei und eine eins!

grüße

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group