Posted by : Belajar Mengelola Keuangan Feb 22, 2018

Apakah Anda tahu bagaimana membuat satu kalimat menjadi banyak kalimat yang berbeda? Di sini saya akan memberikan sebuah fungsi tersebut agar sebuah kata/kalimat/paragraf bisa menjadi unik.

Biasanya teknik ini digunakan oleh para blogger kere atau malas. :)
Tidak perlu berlama-lama lagi, ini kodenya dalam bahasa VB.NET.



 Function GetRandomSequence(ByVal sample As String) As String
        GetRandomSequence = Nothing
        Try
            Static R As New Random
            Dim SB As New System.Text.StringBuilder
            Dim InSet As Boolean = False
            Dim Values As New List(Of List(Of String))
            Dim CurSet As New List(Of String)

            For i As Integer = 0 To sample.Length - 1
                Select Case sample.Substring(i, 1)
                    Case "{"
                        If Not InSet Then
                            If SB.Length > 0 Then
                                CurSet.Add(SB.ToString)
                                Values.Add(CurSet)
                                CurSet = New List(Of String)
                                SB.Clear()
                            End If

                            InSet = True
                        Else
                            ' Reached an Open Set Marker but we were ALREADY in a Set
                            Return "Duplicate Opening Marker Found: " & sample
                        End If

                    Case "}"
                        If InSet Then
                            If SB.Length > 0 Then
                                CurSet.AddRange(SB.ToString.Split("|"))
                                Values.Add(CurSet)
                                CurSet = New List(Of String)
                                SB.Clear()
                            Else
                                ' Reached a Close Set Marker but NOTHING was BETWEEN the Markers
                                Return "Empty Set Between Markers Found: " & sample
                            End If

                            InSet = False
                        Else
                            ' Reached a Close Set Marker but we were NOT in a Set
                            Return "Missing Opening Marker: " & sample
                        End If

                    Case Else
                        SB.Append(sample.Substring(i, 1))
                End Select
            Next

            If SB.Length > 0 Then
                If Not InSet Then
                    CurSet.Add(SB.ToString)
                    Values.Add(CurSet)
                Else
                    ' End of Sample Reached and Set was NOT closed
                    Return "Missing Closing Marker: " & sample
                End If
            End If

            Dim output As New List(Of String)
            For Each valueSet As List(Of String) In Values
                output.Add(valueSet(R.Next(0, valueSet.Count)))
            Next
            Return String.Join("", output.ToArray)
        Catch ex As Exception
            Debug.Print(Date.Now & " GetRandomSequence error " & ex.Message)
        End Try
    End Function
Cara pakainya, kalimat yang mau di spin katanya harus diapit oleh tanda { dan }. Jadi {kata 1|kata 2|kata 3|kata ...}.

Contohnya
Dijual {cepat|BU|Butuh Uang}, Rumah {LB:36m|Luas Bangunan 36m|Tipe 36} {LT:50m|luas tanah 50m} Harga {Murah|Nego|Bersahabat}

Nanti fungsi di atas bisa membuat variasi kalimat seperti di bawah ini:
- Dijual cepat, Rumah Tipe 36 LT:50m Harga Nego
- Dijual BU, Rumah LB:36m Luas tanah 50m Harga Murah
- Dijual Butuh Uang, Rumah Luas Bangunan 36m LT: 50m Harga bersahabat
- dst

OK sekarang ke bagian kedua. Bagaimana bila Anda ingin membuat kalimat tersebut lebih unik lagi? Salah satu caranya adalah dengan menambahkan tanda { dan } di dalam { dan }. Hal ini biasanya disebut dengan nested spin.

Contohnya
Dijual {cepat|BU|Butuh Uang}, Rumah {{LB|Luas Bangunan}:36{m|m2|meter persegi}|{LB|Luas Bangunan} 36{m|m2|meter persegi}|Tipe 36} {LT:50m|luas tanah 50m} Harga {Murah|Nego|Bersahabat}.

Bila Anda memakai fungsi di atas, maka tidak akan berhasil dan akan keluar pesan error:
Duplicate Opening Marker Found

Lalu bagaimana cara menyiasatinya?

Gunakan kode di bawah ini, tetapi kode ini tidak memusingkan soal performa ya..
Imports System.Text.RegularExpressions
Private rand As New Random()

Function RandomReplacement(ByVal m As Match) As String
        Dim matchedText As String = m.Value.Substring(1, m.Value.Length - 2) ' Skip { and }
        Dim delimiter() As Char = {"|"c}
        Dim choices() As String = matchedText.Split(delimiter)
        Dim randomIndex As Integer = rand.Next(choices.Length)

        Return choices(randomIndex)
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim pattern As String = "\{[^{}]*\}"  ' Any set of braces that do not contain other braces
Dim m As Match = Regex.Match(TextBox1.Text, pattern)
Dim result As String = TextBox1.Text


While m.Success
  result = Regex.Replace(result, pattern, AddressOf RandomReplacement)
  m = Regex.Match(result, pattern)
End While
 
Label1.Text = result

End Sub

Kode kedua, memakai fungsi regex untuk memanipulasi string. Nanti kalau ada waktu saya akan membahas tentang regex ini. Jadi sampai jumpa di artikel berikutnya.

Apakah kamu ingin mendapatkan perberitahuan tentang artikel yang baru dari catatanvbnet.blogspot.com langsung ke emailmu?

Masukan email kamu di sini dan klik Subscribe:


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © 2025 Yuk Belajar VB.NET Bersama-Sama ^^ - Hatsune Miku - Powered by Blogger - Designed by Johanes Djogan -