BPS #21: Strings attached - Auswertung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #21: Strings attached - Auswertung

BeitragSo, Jun 24, 2012 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Legt Schere und Kleber nieder und zeigt, was ihr mit den Strings angestellt habt!

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzBasic: [AUSKLAPPEN]
Local Source$ = "Wozu sollte man das brauchen?"

Print("Original: " + Source)
Print("Rückwärts: " + Reverse(Source))
Print("Leerzeichen: " + Count(Source, " "))
Print("Fragezeichen: " + Count(Source, "?"))
Print("Ist 'Dormitory' ein Anagramm von 'Dirty Room' ?: ")
Print(WahrFalsch(IsAnagramm("Dormitory'", "Dirty Room")))
Print("Ist 'Reittier' ein Palindrom?: ")
Print(WahrFalsch(IsPalindrom("reittier")))
WaitKey()
End

Function Reverse$(txt$)
Local backwards$, i%, length% = Len(txt)

For i = length To 1 Step -1
backwards = backwards + Mid(txt,i,1)
Next

Return backwards
End Function

Function Count(txt$, symbol$)
Local p% = Instr(txt, symbol), n%
If p=0 Then Return 0

Repeat
p = Instr(txt, symbol, p+1)
n = n+1
Until p=0

Return n
End Function

Function IsAnagramm(txt1$, txt2$)
txt1 = Lower(txt1)
txt2 = Lower(txt2)

Local char[26]
Local c,i

For i = 1 To Len(txt1)
c = Asc(Mid(txt1, i, 1))

; a z
If c >= 97 And c <= 122
char[c - 97] = char[c - 97] + 1
EndIf
Next

For i = 1 To Len(txt2)
c = Asc(Mid(txt2, i, 1))

If c >= 97 And c <= 122
char[c - 97] = char[c - 97] - 1
EndIf
Next

For i = 0 To 25
If char[i] <> 0 Then
Return False
EndIf
Next

Return True
End Function

Function IsPalindrom(txt$)
If txt = Reverse(txt) Then
Return True
Else
Return False
EndIf
End Function

Function WahrFalsch$(value)
If value Then
Return "Wahr"
Else
Return "Falsch"
EndIf
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Jul 08, 2012 13:56, insgesamt 2-mal bearbeitet

ozzi789

BeitragSo, Jun 24, 2012 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim String umdrehen habe ich eine For Schleife gebastelt und mittels Step -1 einfach von hinten nach vorne alle Zeichen bearbeitet.

Die Zeichen zu zählen war ein einfacher durchlauf mittels Mid und einer lokalen Variablen die bei jedem Fund erhöht wird.
Ich habe hier bewusst nicht Instr verwendet, der einfachheit halber.

Beim Palindrom check habe ich zuerst geschaut ob der String eine gerade Anzahl von Zeichen hat, danach von dem ersten Zeichen bis zur mitte und von der Mitte bis zum letzen Zeichen in einzelne Strings gepackt.
Nun den zweiten mit meiner Umdreh funktion gedreht und beide Strings verglichen.

Beim Anagramm habe ich eine Quersumme aller ASCII Werte der Buchstaben erstellt, und diese dann verglichen Cool

BlitzBasic: [AUSKLAPPEN]
While 1
t_string$=Input("Enter a word/sentence > ")
Print ""
Print "----------"
Print ""
Print "Reverted string:"
Print revert$(t_string$)
Print ""
Print "----------"
Print ""


search$=Input ("Enter a character that you want to count in the provided string > ")
Print "Counting char's '"+search$+"':"
Print count_char(t_string$,search$)
Print ""
Print "----------"
Print ""


Print "Is it a palindrom?"
Print check_palindrom(t_string$)
Print ""
Print "----------"
Print ""


t_string_2$=Input("Enter a second word/sentence that shall be the counterpart > ")
Print "Is it a anagramm?"
Print check_anagramm(t_string$,t_string_2$)
Print ""
Print "----------"
Print ""


Print ""
Print ""
Print ""

Wend

Function revert$(strng$)
Local length%, newstrng$
length%=Len(strng$)
;Von hinten anfangen und dann zurücklaufen
For i=length% To 0 Step -1
newstrng$=newstrng$+Mid(strng$,i,1)
Next
Return newstrng$
End Function

Function count_char(strng$,char$)
Local length%, result%
length%=Len(strng$)
For i=0 To length%
;falls gesuchtes zeichen counter erhöhen
If Mid(strng$,i,1)=char$
result%=result%+1
EndIf
Next
Return result%
End Function

Function check_anagramm(strng_orig$,strng_chk$)
Local length_orig%,length_chk%,value_orig%,value_chk%,add_value%
;leerzeichen rausnehmen
strng_orig$=Lower(strng_orig$)
strng_chk$=Lower(strng_chk$)
strng_orig$=Replace(strng_orig$," ","")
strng_chk$=Replace(strng_chk$," ","")
length_orig%=Len(strng_orig$)
length_chk%=Len(strng_chk$)
;falls die länge nicht passt, können wir uns die übung sparen
If length_orig% <> length_chk% Then Return 0
For i=0 To length_orig%
add_value%=Int(Asc(Mid(strng_orig$,i,1)))
value_orig%=value_orig%+add_value%
Next
For i=0 To length_chk%
add_value%=Int(Asc(Mid(strng_chk$,i,1)))
value_chk%=value_chk%+add_value%
Next
If value_orig%=value_chk%
Return 1
Else
Return 0
EndIf
End Function

Function check_palindrom(strng$)
Local lenght%,left_str$,right_str$,middle%
strng$=Lower (strng$)
length%=Len(strng$)
;falls es eine ungrade zahl von zeichen ist, übung abbrechen
If length% Mod 2 Then Return 0
;mitte berechnen
middle%=length%/2
;links und rechts rausschneiden und vergleichen
left_str$=Left(strng$,middle)
right_str$=Right(strng$,middle)
right_str$=revert(right_str$)
If left_str$=right_str$
Return 1
Else
Return 0
EndIf
End Function




Nachtrag :

Embarassed Embarassed
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
  • Zuletzt bearbeitet von ozzi789 am So, Jun 24, 2012 17:44, insgesamt einmal bearbeitet

SpionAtom

Betreff: Meine Lösung

BeitragSo, Jun 24, 2012 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hat sich noch ein paarmal der Fehlerteufel eingeschlichen, Ozzi.
Wenn du mit mid Zeichen durchgehst, musst du bei 1 anfangen und nicht bei 0.
Außerdem ist es für ein Palindrom nicht notwendig, aus einer geraden Anzahl von Zeichen zu bestehen: "Radar" ist doch ein klasse Palindrom!


Code: [AUSKLAPPEN]


   Local meinString$ = "Wozu sollte man das brauchen?"
   Local meinString_A$ = "Dormitory", meinString_B$ = "Dirty Room"
   Local meinString_P$ = "Die Liebe ist Sieger; stets rege ist sie bei Leid."


   Print "Original:     " + meinString
   Print "Rückwärts:    " + invertString(meinString)
   Print "Leerzeichen:  " + countChars(" ", meinString)
   Print "Fragezeichen: " + countChars("?", meinString)
   Print "Ist '" + meinString_A + "' ein Anagramm von '" + meinString_B + "'?"
   If isAnagram(meinString_A, meinString_B) Then
      Print "Ja sicher dat"
   Else
      Print "Nönö"
   End If
   Print "Ist '" + meinString_P + "' ein Palindrom?"
   If isPalindrome(meinString_P) Then
      Print "Ja sicher dat"
   Else
      Print "Nönö"
   End If


   WaitKey
   End



;Diese Funktion dreht einen Text um.
;Um das zu erreichen wird von hinten angefangen jedes Zeichen
;in einen neuen String angehängt
Function invertString$(txt$)
   Local i, output$ = "", l = Len(txt)
   For i = l To 1 Step -1
      output = output + Mid(txt, i, 1)
   Next
   Return output
End Function

;Diese Funktion zählt die Anzahl eines bestimmten Zeichens in
;einem String.
;Dazu wird in einer Schleife jedes Zeichen angeschaut und mit
;dem gesuchten Zeichen verglichen.
Function countChars(char$, txt$)
   Local i, count = 0, l = Len(txt)
   For i = 1 To l
      If Mid(txt, i, 1) = char Then count = count + 1
   Next
   Return count
End Function

;Prüft, ob zwei Strings buchstabendeckungsgleich sind :D.
Function isAnagram(txt_a$, txt_b$)

   ;Zunächst werden die Buchstaben alle in Großbuchstaben gesetzt,
   ;damit die Prüfung unabhängig davon wird. Außerdem werden Nicht-
   ;Buchstaben gelöscht.
   txt_a = cleanLetterString(Upper(txt_a))
   txt_b = cleanLetterString(Upper(txt_b))

   Local l = Len(txt_a), i, char$, checked_chars$ = ""
   For i = 1 To l
      char$ = Mid(txt_a, i, 1)
      ;Geprüft werden sollen nur die Buchstaben, die nicht schon
      ;geprüft wurden. Buchstaben, die schon geprüft wurden, werden
      ;in den String checked_chars geschrieben.
      If countChars(char, checked_chars) = 0 Then
         If countChars(char, txt_a) <> countChars(char, txt_b) Then
            Return False
         Else
            checked_chars = checked_chars + char
         End If
      End If
   Next

   Return True

End Function

;Prüft, ob ein String ein Palindrom. Dies ist genau dann der Fall, wenn
;das Wort rückwärts genau wieder das Wort ergibt.
Function isPalindrome(txt$)

   txt = Upper(cleanLetterString(txt))
   Return txt = invertString(txt)

End Function

;Säubert einen String, sodass nur die Buchstaben übrigbleiben.
;Dazu wird jedes Zeichen auf seinen Ascii-Wert überprüft.
;Befindet sich dieser Wert in einem bestimmten Bereich, so
;handelt es sich bei dem Zeichen um einen Buchstaben
Function cleanLetterString$(txt$)
   Local a, i, output$ = "", l = Len(txt), char$
   For i = 1 To l
      char = Mid(txt, i, 1)
      a = Asc(char)
      ;  (Großbuchstaben     )    (Kleinbuchstaben     )
      If (a >= 65 And a <= 90) Or (a >= 97 And a <= 122) Then
         output = output + char
      End If
   Next
   Return output
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

KnorxThieus

BeitragSo, Jun 24, 2012 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mein Werk:
BlitzBasic: [AUSKLAPPEN]
Global inp$
Global fnd$
Dim characterstxt(30)
Dim charactersoth(30)

Function WordBackward$(txt$)
For a = -Len(txt$) To -1
ret$ = ret$ + Mid$(txt$, Abs(a), 1)
Next
Return ret$
End Function

Function CountInstrs$(txt$, find$)
If Len(find$) > 1
fnd$ = "character"
inp$ = "your entry"
Return "too much"
EndIf
For a = 1 To Len(txt$)
If Mid$(txt$, a, 1) = find$ Then b = b + 1
Next
Return b
End Function

Function Anagramm(txt$, other$)
For a = 1 To Len(txt$)
If Mid$(txt$, a, 1) <> " "
characterstxt(Asc(Lower$(Mid$(txt$, a, 1))) - 96) = characterstxt(Asc(Lower$(Mid$(txt$, a, 1))) - 96) + 1
EndIf
Next
For a = 1 To Len(other$)
If Mid$(other$, a, 1) <> " "
charactersoth(Asc(Lower$(Mid$(other$, a, 1))) - 96) = charactersoth(Asc(Lower$(Mid$(other$, a, 1))) - 96) + 1
EndIf
Next
ret = 1
For a = 1 To 30
If characterstxt(a) <> charactersoth(a) Then ret = 0
Next
Return ret
End Function

Function Palindrom(txt$)
fp$ = Lower$(Left$(txt$, Len(txt$) / 2))
sp$ = WordBackward$(Lower$(Right$(txt$, Len(txt$) / 2)))
If fp$ = sp$ Then Return True
End Function

fnd$ = "e"

Repeat
inp$ = Input$("Word= ")

If Trim$(Lower$(inp$)) = "exit 0" Then End
If Trim$(Lower$(inp$)) = "exit" Then RuntimeError "Backward: " + WordBackward$(inp$) + Chr$(10) + "There are " + CountInstrs$(inp$, fnd$) + " " + Chr$(34) + fnd$ + Chr$(34) + "s in " + Chr$(34) + inp$ + Chr$(34) + "." + Chr$(10) + "Anagramm: " + Anagramm(inp$, "rot") + Chr$(10) + "Palindrom: " + Palindrom(inp$) + Chr$(10) + Chr$(10) + Chr$(10) + "© KnorxThieus"

Print "Backward: " + WordBackward$(inp$)
fnd$ = Input$("Enter the characater I have to find! ")
Print "There are " + CountInstrs$(inp$, fnd$) + " " + Chr$(34) + fnd$ + Chr$(34) + "s in " + Chr$(34) + inp$ + Chr$(34) + "."
fnd$ = Input$("Enter the word I have to control if it is anagrammilly to " + inp$ + "! ")
Print "Anagramm: " + Anagramm(inp$, fnd$)
Print "Palindrom: " + Palindrom(inp$)
Print ""
Forever

Bitte verzeiht mein Englisch! Embarassed

Tschüüüß!
Version: BlitzPlus / Blitz+

BladeRunner

Moderator

BeitragSo, Jun 24, 2012 23:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich muss aber auch drauf hinweisen dass die Quersumme kein sicheres Zeichen für ein Anagramm ist.
ABD hat die gleiche Quersumme wie BBC, aber ein Anagramm ist es deswegen nicht Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group