Skip to content

Instantly share code, notes, and snippets.

@zinntikumugai
Created October 29, 2017 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zinntikumugai/f9c90a7b51775d374a59233e77e882df to your computer and use it in GitHub Desktop.
Save zinntikumugai/f9c90a7b51775d374a59233e77e882df to your computer and use it in GitHub Desktop.
サクラエディタで行をシャッフルする by http://moritora.seesaa.net/article/409483699.html
Option Explicit
Function DV(A, B)
DV = Fix(A / B)
End Function
Function RD(A, B)
RD = DV(A, B) * B
End Function
Function MD(A, B)
MD = A - RD(A, B)
End Function
Function XR(A, B)
Const N = &H10000
XR = (DV(A, N) Xor DV(B, N)) * N + (MD(A, N) Xor MD(B, N))
End Function
Function SL(A, B)
SL = MD(A, 2 ^ (32 - B)) * (2 ^ B)
End Function
Function SR(A, B)
SR = DV(A, 2 ^ B)
End Function
Function Step1(Y)
Step1 = XR(Y, SL(Y, 13))
End Function
Function Step2(Y)
Step2 = XR(Y, SR(Y, 17))
End Function
Function Step3(Y)
Step3 = XR(Y, SL(Y, 5))
End Function
Function XRS(Y)
XRS = Step3(Step2(Step1(Y)))
End Function
Class Random
Dim Y
Sub Class_Initialize()
Y = 2463534242
End Sub
Function GetValue()
Y = XRS(Y)
GetValue = Y
End Function
Function InInRange(V, R)
If V < R Then
InInRange = V
Else
InInRange = InInRange(GetValue(), R)
End If
End Function
Function InRange(R)
Const X = 4294967295
InRange = MD(InInRange(GetValue(), RD(X, R)), R)
End Function
Function Range(N, X)
Range = InRange(X - N + 1) + N
End Function
End Class
Sub Swap(A, X, Y)
Dim T
T = A(X)
A(X) = A(Y)
A(Y) = T
End Sub
Sub Shuffle(A, R)
Dim I
For I = UBound(A) To LBound(A) + 1 Step -1
Swap A, I, R.Range(0, I)
Next
End Sub
Function GetLineCode()
Dim A
A = Array(vbCrLf, vbCr, vbLf)
GetLineCode = A(Editor.GetLineCode())
End Function
Sub SelectLines(LineStart, LineEnd)
Editor.Jump LineStart
Editor.BeginSelect
Editor.Jump LineEnd
Editor.GoLineEnd
Editor.BeginSelect
End Sub
Sub Main()
Dim LineFrom
LineFrom = Editor.GetSelectLineFrom()
Dim LineTo
LineTo = Editor.GetSelectLineTo()
If Editor.GetSelectColmTo() = 1 Then
SelectLines LineFrom, LineTo - 1
Else
SelectLines LineFrom, LineTo
End If
Dim Text
Text = Editor.GetSelectedString(0)
Text = Replace(Text, vbCrLf, vbLf)
Text = Replace(Text, vbCr, vbLf)
Dim A
A = Split(Text, vbLf)
Shuffle A, New Random
Editor.InsText Join(A, GetLineCode())
SelectLines LineFrom, LineTo
End Sub
Main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment