色々やってみたものを集めてみました。未だよく分かっていませんが、Wordpressの場合だと、Photoshop Elementsでつくったgifがレイアーの透過が、デフォルトみたいですね。
gifファイルのアップに関しては、WPの方が直接できるので楽かもしれません。
色々やってみたものを集めてみました。未だよく分かっていませんが、Wordpressの場合だと、Photoshop Elementsでつくったgifがレイアーの透過が、デフォルトみたいですね。
gifファイルのアップに関しては、WPの方が直接できるので楽かもしれません。
Module Program
Public Enum e_kind
Print
Lparen
Rparen
Plus
Minus
Multi
Divi
Assign
VarName
IntNum
Others
Endo
EofToken
End Enum
Structure Tokenset
Dim ele_kind As e_kind
Dim ss As String
End Structure
Dim STK_SIZ As Integer = 20
Dim stack(STK_SIZ + 1) As Integer
Dim stkct As Integer = 0
Dim token As Tokenset
Dim buf As String = ""
Dim chr_bufp As Integer = 0
Dim ch As Char
Dim vari(26) As Integer
Dim errflg As Boolean = False
Dim endflg As Boolean = False
Sub Main(args As String())
Console.WriteLine("printまたはピリオド(.)で値表示、endで終了")
While True
input()
next_token()
'以下のコメントはtoken解析の結果をデバッグするため
'While token.ele_kind <> e_kind.EofToken
' Console.Write(token.ss)
' Console.WriteLine(token.ele_kind)
' If token.ele_kind = e_kind.Endo Then
' GoTo mainbreak
' Else
' token.ss = ""
' End If
' next_token()
'End While
statement()
If endflg = True Then
GoTo mainbreak
End If
If errflg = True Then
Console.WriteLine("?")
End If
token.ss = ""
End While
mainbreak:
Console.WriteLine("終了")
End Sub
Sub input()
buf = Console.ReadLine
chr_bufp = 0
ch = next_char()
errflg = False
stkct = 0
End Sub
Function next_char()
If chr_bufp <= buf.Length - 1 Then
next_char = buf(chr_bufp)
Else
next_char = ""
End If
End Function
Function isalpha(a)
isalpha = If(a >= "a" And a <= "z", True, False)
End Function
Function isdigit(a)
isdigit = If(a >= "0" And a <= "9", True, False)
End Function
Function strcmp(a As String, b As String)
strcmp = If(a = b, True, False)
End Function
Function strlen(a As String)
strlen = a.Length
End Function
Sub strcpy(ByRef reseve As String, ByVal src As String)
reseve = src
End Sub
Sub next_token()
Dim chr_pp = 0
Do
ch = next_char()
If ch = " " Then
chr_bufp += 1
End If
Loop While ch = " "
If isalpha(ch) Then
While isalpha(ch)
token.ss = token.ss + ch
chr_pp += 1
chr_bufp += 1
If chr_bufp > buf.Length - 1 Then
token.ss = token.ss.Replace(vbNullChar, "")
GoTo token_kind
End If
ch = next_char()
End While
ElseIf isdigit(ch) Then
While isdigit(ch)
token.ss &= ch
chr_pp += 1
chr_bufp += 1
If chr_bufp > buf.Length - 1 Then
GoTo token_kind
End If
ch = next_char()
End While
Else
token.ss = ch
chr_pp = 0
chr_bufp += 1
ch = next_char()
End If
token_kind:
chr_pp = 0
If token.ss = vbNullChar Then
token.ele_kind = e_kind.EofToken
Return
End If
token.ss = token.ss.Replace(vbNullChar, "")
token.ele_kind = e_kind.Others
If strcmp(token.ss, "print") Then
token.ele_kind = e_kind.Print
token.ss = ""
ElseIf strcmp(token.ss, "end") Then
token.ele_kind = e_kind.Endo
ElseIf token.ss = vbNullChar Then
token.ele_kind = e_kind.EofToken
ElseIf isdigit(token.ss(0)) Then
token.ele_kind = e_kind.IntNum
ElseIf strlen(token.ss) = 1 Then
If isalpha(token.ss(chr_pp)) Then
token.ele_kind = e_kind.VarName
Else
Select Case token.ss(0)
Case "." : token.ele_kind = e_kind.Print
Case "(" : token.ele_kind = e_kind.Lparen
Case ")" : token.ele_kind = e_kind.Rparen
Case "+" : token.ele_kind = e_kind.Plus
Case "-" : token.ele_kind = e_kind.Minus
Case "*" : token.ele_kind = e_kind.Multi
Case "/" : token.ele_kind = e_kind.Divi
Case "=" : token.ele_kind = e_kind.Assign
End Select
End If
End If
End Sub
Sub statement()
Dim save As String = ""
Select Case token.ele_kind
Case e_kind.Print
next_token()
express()
If token.ele_kind <> e_kind.EofToken Then
errflg = True
End If
If Not errflg = True Then
Console.WriteLine(pop())
End If
Case e_kind.Endo
endflg = True
Case e_kind.VarName
strcpy(save, token.ss)
next_token()
If token.ele_kind <> e_kind.Assign Then
errflg = True
Return
End If
token.ss = ""
next_token()
express()
If token.ele_kind <> e_kind.EofToken Then
errflg = True
End If
If errflg = False Then
letvalue(save(0), pop()) '0607試し
End If
Case Else
errflg = True
End Select
End Sub
Sub express()
Call term()
While True
If token.ele_kind = e_kind.Plus Then
token.ss = "" 'tamesi
next_token()
term()
operate(e_kind.Plus)
ElseIf token.ele_kind = e_kind.Minus Then
token.ss = ""
next_token()
term()
operate(e_kind.Minus)
Else
Return
End If
End While
End Sub
Sub term()
Call factor()
While True
If token.ele_kind = e_kind.Multi Then
token.ss = ""
next_token()
term()
operate(e_kind.Multi)
ElseIf token.ele_kind = e_kind.Divi Then
token.ss = ""
next_token()
term()
operate(e_kind.Divi)
Else
Return
End If
End While
End Sub
Sub factor()
Select Case token.ele_kind
Case e_kind.Lparen
token.ss = ""
next_token()
express()
If token.ele_kind <> e_kind.Rparen Then
errflg = True
Return
End If
Case e_kind.IntNum
push(Int(token.ss))
Case e_kind.VarName
push(getvalue(token.ss)) '0607試験
Case Else
errflg = True
Return
End Select
next_token()
End Sub
Sub operate(ByVal Ope As e_kind)
Dim d1 As Integer
Dim d2 As Integer
d2 = pop()
d1 = pop()
Select Case Ope
Case e_kind.Plus
push(d1 + d2)
Case e_kind.Minus
push(d1 - d2)
Case e_kind.Multi
push(d1 * d2)
Case e_kind.Divi
If d2 = 0 Then
Console.WriteLine("divide by 0")
errflg = True
Else
push(d1 / d2)
End If
End Select
End Sub
Function getvalue(ByVal vname As Char)
getvalue = vari(Asc(vname) - Asc("a"c))
End Function
Sub letvalue(ByVal vname As Char, ByVal n As Integer)
vari(Asc(vname) - Asc("a"c)) = n
End Sub
Sub push(ByVal n As Integer)
If stkct + 1 > STK_SIZ Then
Console.WriteLine("stack over")
End
Else
stkct += 1
stack(stkct) = n
'stkct += 1
End If
End Sub
Function pop()
If errflg = True Then
pop = 1
Return pop
End If
If stkct < 1 Then
Console.WriteLine("stack under")
End
Else
pop = stack(stkct)
stkct -= 1
End If
End Function
End Module
Module Program
Public Enum e_kind
Print
Lparen
Rparen
Plus
Minus
Multi
Divi
Assign
VarName
IntNum
Others
Endo
EofToken
End Enum
Structure Tokenset
Dim ele_kind As e_kind
Dim ss As String
End Structure
Dim STK_SIZ As Integer = 20
Dim stack(STK_SIZ + 1) As Integer
Dim stkct As Integer = 0
Dim token As Tokenset
Dim buf As String = ""
Dim chr_bufp As Integer = 0
Dim ch As Char
Dim vari(26) As Integer
Dim errflg As Boolean = False
Dim endflg As Boolean = False
Sub Main(args As String())
Console.WriteLine("printまたはピリオド(.)で値表示、endで終了")
While True
input()
next_token()
'以下のコメントはtoken解析の結果をデバッグするため
'While token.ele_kind <> e_kind.EofToken
' Console.Write(token.ss)
' Console.WriteLine(token.ele_kind)
' If token.ele_kind = e_kind.Endo Then
' GoTo mainbreak
' Else
' token.ss = ""
' End If
' next_token()
'End While
statement()
If endflg = True Then
GoTo mainbreak
End If
If errflg = True Then
Console.WriteLine("?")
End If
token.ss = ""
End While
mainbreak:
Console.WriteLine("終了")
End Sub
Sub input()
buf = Console.ReadLine
chr_bufp = 0
ch = next_char()
errflg = False
stkct = 0
End Sub
Function next_char()
If chr_bufp <= buf.Length - 1 Then
next_char = buf(chr_bufp)
Else
next_char = ""
End If
End Function
Function isalpha(a)
isalpha = If(a >= "a" And a <= "z", True, False)
End Function
Function isdigit(a)
isdigit = If(a >= "0" And a <= "9", True, False)
End Function
Function strcmp(a As String, b As String)
strcmp = If(a = b, True, False)
End Function
Function strlen(a As String)
strlen = a.Length
End Function
Sub strcpy(ByRef reseve As String, ByVal src As String)
reseve = src
End Sub
Sub next_token()
Dim chr_pp = 0
Do
ch = next_char()
If ch = " " Then
chr_bufp += 1
End If
Loop While ch = " "
If isalpha(ch) Then
While isalpha(ch)
token.ss = token.ss + ch
chr_pp += 1
chr_bufp += 1
If chr_bufp > buf.Length - 1 Then
token.ss = token.ss.Replace(vbNullChar, "")
GoTo token_kind
End If
ch = next_char()
End While
ElseIf isdigit(ch) Then
While isdigit(ch)
token.ss &= ch
chr_pp += 1
chr_bufp += 1
If chr_bufp > buf.Length - 1 Then
GoTo token_kind
End If
ch = next_char()
End While
Else
token.ss = ch
chr_pp = 0
chr_bufp += 1
ch = next_char()
End If
token_kind:
chr_pp = 0
If token.ss = vbNullChar Then
token.ele_kind = e_kind.EofToken
Return
End If
token.ss = token.ss.Replace(vbNullChar, "")
token.ele_kind = e_kind.Others
If strcmp(token.ss, "print") Then
token.ele_kind = e_kind.Print
token.ss = ""
ElseIf strcmp(token.ss, "end") Then
token.ele_kind = e_kind.Endo
ElseIf token.ss = vbNullChar Then
token.ele_kind = e_kind.EofToken
ElseIf isdigit(token.ss(0)) Then
token.ele_kind = e_kind.IntNum
ElseIf strlen(token.ss) = 1 Then
If isalpha(token.ss(chr_pp)) Then
token.ele_kind = e_kind.VarName
Else
Select Case token.ss(0)
Case "." : token.ele_kind = e_kind.Print
Case "(" : token.ele_kind = e_kind.Lparen
Case ")" : token.ele_kind = e_kind.Rparen
Case "+" : token.ele_kind = e_kind.Plus
Case "-" : token.ele_kind = e_kind.Minus
Case "*" : token.ele_kind = e_kind.Multi
Case "/" : token.ele_kind = e_kind.Divi
Case "=" : token.ele_kind = e_kind.Assign
End Select
End If
End If
End Sub
Sub statement()
Dim save As String = ""
Select Case token.ele_kind
Case e_kind.Print
next_token()
express()
If token.ele_kind <> e_kind.EofToken Then
errflg = True
End If
If Not errflg = True Then
Console.WriteLine(pop())
End If
Case e_kind.Endo
endflg = True
Case e_kind.VarName
strcpy(save, token.ss)
next_token()
If token.ele_kind <> e_kind.Assign Then
errflg = True
Return
End If
token.ss = ""
next_token()
express()
If token.ele_kind <> e_kind.EofToken Then
errflg = True
End If
If errflg = False Then
letvalue(save, pop()) '試し
End If
Case Else
errflg = True
End Select
End Sub
Sub express()
Call term()
While True
If token.ele_kind = e_kind.Plus Then
token.ss = "" 'tamesi
next_token()
term()
operate(e_kind.Plus)
ElseIf token.ele_kind = e_kind.Minus Then
token.ss = ""
next_token()
term()
operate(e_kind.Minus)
Else
Return
End If
End While
End Sub
Sub term()
Call factor()
While True
If token.ele_kind = e_kind.Multi Then
token.ss = ""
next_token()
term()
operate(e_kind.Multi)
ElseIf token.ele_kind = e_kind.Divi Then
token.ss = ""
next_token()
term()
operate(e_kind.Divi)
Else
Return
End If
End While
End Sub
Sub factor()
Select Case token.ele_kind
Case e_kind.Lparen
token.ss = ""
next_token()
express()
If token.ele_kind <> e_kind.Rparen Then
errflg = True
Return
'GoTo factorbreak
End If
Case e_kind.IntNum
push(Int(token.ss))
'GoTo factorbreak
Case e_kind.VarName
push(getvalue(token.ss))
'GoTo factorbreak
Case Else
errflg = True
Return
End Select
next_token()
End Sub
Sub operate(ByVal Ope As e_kind)
Dim d1 As Integer
Dim d2 As Integer
d2 = pop()
d1 = pop()
Select Case Ope
Case e_kind.Plus
push(d1 + d2)
Case e_kind.Minus
push(d1 - d2)
Case e_kind.Multi
push(d1 * d2)
Case e_kind.Divi
If d2 = 0 Then
Console.WriteLine("divide by 0")
errflg = True
Else
push(d1 / d2)
End If
End Select
End Sub
Function getvalue(ByVal vname As String)
Select Case vname
Case "a"
getvalue = vari(0)
Case "b"
getvalue = vari(1)
Case "c"
getvalue = vari(2)
Case "d"
getvalue = vari(3)
Case "e"
getvalue = vari(4)
End Select
'getvalue = vari(Int(vname) - "a")
End Function
Sub letvalue(ByVal vname As Char, ByVal n As Integer)
Select Case vname
Case "a"
vari(0) = n
Case "b"
vari(1) = n
Case "c"
vari(2) = n
Case "d"
vari(3) = n
Case "e"
vari(4) = n
End Select
'w = vname
'vari(Int(vname) - "a") = n
End Sub
Sub push(ByVal n As Integer)
If stkct + 1 > STK_SIZ Then
Console.WriteLine("stack over")
End
Else
stkct += 1
stack(stkct) = n
'stkct += 1
End If
End Sub
Function pop()
If errflg = True Then
pop = 1
Return pop
End If
If stkct < 1 Then
Console.WriteLine("stack under")
End
Else
pop = stack(stkct)
stkct -= 1
End If
End Function
import scala.util.control.Breaks
object Main {
def main(args: Array[String]): Unit = {
val b1 = new Breaks
val msg: java.util.Hashtable[String, String] = new java.util.Hashtable[String, String]
msg.put("monument", "2つの数字は")
msg.put("answer", "答えは? ")
msg.put("good", " 正解!\n\n")
msg.put("no", " 残念!\n\n")
msg.put("cond", "%d と %d の、")
val jk: Array[Jyouken] = new Array[Jyouken](4)
jk(0) = new Jyouken("+", 1, 1)
jk(1) = new Jyouken("-", 1, 1)
jk(2) = new Jyouken("*", 1, 1)
jk(3) = new Jyouken("/", 1, 1)
val kekka = Array(0,0)
b1.breakable {
while (true) {
for (i <- 1 to 8) {
val env: Env = new Env(msg, jk((i - 1) / 2), kekka)
env.read.eval.print
if (kekka(1) >= 3) b1.break()
}
printf("レベルアップします!\n\n")
jk.foreach(x => x.levelup)
}
}
printf("正解数 %5d, 誤回答 %5d", kekka(0), kekka(1))
}
}
import java.util
import java.util.{Random, Scanner}
class Env(var msg:util.Hashtable[String, String],val jk:Jyouken, var kekka:Array[Int]){
private val scanner = new Scanner(System.in)
private var x :Int = 0
private var y :Int = 0
private var z :Int = 0
private var rVal: Boolean = false
def read: Env = {
val w1 = jk.getitibanme * 10
val w2 = jk.getnibanme * 10
val keisan =
jk.en match {
case "+" => "足し算 "
case "-" => "引き算 "
case "*" => "掛け算 "
case "/" => "割り算 "
}
printf("%s", keisan)
printf(this.msg.get("monument"))
val rnd2: Random = new Random()
y = rnd2.nextInt(w2)
val rnd: Random = new Random
x = rnd.nextInt(w1)
if (jk.en == "/"){
if (x == 0 || y == 0) {
x += 1; y += 1
}
}
if (jk.en == "-" || jk.en == "/"){
if (y > x){
val work = x; x = y; y = work
}
}
printf("%3d, %3d の", x, y)
this
}
def eval: Env = {
printf(this.msg.get("answer"))
z = scanner.nextInt()
rVal =
jk.en match {
case "+" => if (z == x + y) true else false
case "-" => if (z == x - y) true else false
case "*" => if (z == x * y) true else false
case "/" => if (z == x / y) true else false
}
this
}
def print:Env = {
printf(this.msg.get("cond"), x, y)
val siki =
jk.en match {
case "+" => "和は"
case "-" => "差は"
case "*" => "積は"
case "/" => "商は"
}
printf("%s %3d", siki, z)
if (rVal) {
printf(this.msg.get("good"))
kekka(0) += 1
} else {
printf(this.msg.get("no"))
kekka(1) += 1
}
this
}
}
class Jyouken(val en:String, val iti: Int, val ni: Int){
private val enzan: String = en
private var itibanme: Int = iti
private var nibanme: Int = ni
def levelup: Jyouken = {
if (enzan == "+" || enzan == "-" || enzan == "/") {
itibanme += 1; nibanme += 1
} else {
itibanme += 1; nibanme = 1
}
this
}
def getitibanme: Int = itibanme
def getnibanme: Int = nibanme
}
Module Program
Sub Main(args As String())
Dim a(4), i, j, k, imax, nn As Integer
Dim my_flag As Boolean
Dim dmyss As String
For i = 1 To 3
Console.Write(i & "番目の石の数? ")
dmyss = Console.ReadLine()
a(i) = Int(dmyss)
If a(i) <= 0 Then End
Next
my_flag = True
While True
Console.WriteLine()
Console.WriteLine(String.Format("現在の石 {0}, {1}, {2}", a(1), a(2), a(3)))
imax = 1
For i = 2 To 3
If a(imax) < a(i) Then
imax = i
End If
Next
If a(imax) = 0 Then Exit While
If my_flag = True Then
For i = 1 To 3
j = i + 1
If j > 3 Then j -= 3
k = i + 2
If k > 3 Then k -= 3
If a(i) > (a(j) Xor a(k)) Then
nn = a(j) Xor a(k)
Exit For
End If
Next
If i = 4 Then
i = imax
nn = a(imax) - 1
End If
Console.WriteLine("コンピュータ: {0}の山から{1}個取りました。", i, a(i) - nn)
a(i) = nn
Else
Do
Console.Write("何番目の山から取りますか(1-3)? ")
dmyss = Console.ReadLine()
i = Int(dmyss)
Loop While (i < 1 Or 3 < i Or a(i) = 0)
Do
Console.Write("何個取りますか? ")
dmyss = Console.ReadLine()
nn = Int(dmyss)
Loop While (nn <= 0 Or a(i) < nn)
a(i) -= nn
End If
my_flag = Not my_flag
End While
If my_flag = True Then
Console.WriteLine("--- あなたの勝ち ---")
Else
Console.WriteLine("--- コンピュータの勝ち ---")
End If
'Console.WriteLine("Hello World!")
End Sub
End Module
下はMain.scalaです。ハイライターがScala無かったので、JavaScriptになってます。
import java.util.Random
object Main {
def main(args: Array[String]): Unit = {
val msg: java.util.Hashtable[String, String] = new java.util.Hashtable[String, String]
//val msg = collection.mutable.HashMap.empty[String, String]
//msg.put("yama","山は")
msg.put("you", "あなた")
msg.put("comp", "コンピュータ")
msg.put("took", "%sが,山 %d から%d個取った\n")
msg.put("take", "石を取って!(1〜%d) > ")
msg.put("cond", "現在の石の数: %d, %d, %d\n\n")
msg.put("win", "%sの勝ち\n")
val rnd: Random = new Random
val bVal: Boolean = rnd.nextBoolean
val env: Env = new Env(Array[Int](2, 4, 5), bVal, msg)
env.print
System.out.printf("%sが先攻\n", if (bVal) {
msg.get("you")
}
else {
msg.get("comp")
})
while (env.num(0) > 0 || env.num(1) > 0 || env.num(2) > 0) {
env.read
env.eval
env.print
}
System.out.printf(msg.get("win"), if (env.turn) {
msg.get("you")
}
else {
msg.get("comp")
})
}
}
下はEnv.scalaですが、やはりJavaScriptになってます。
import java.util
import java.util.{Random, Scanner}
import scala.util.control.Breaks
class Env(var num: Array[Int], var turn: Boolean, var msg:util.Hashtable[String, String]) {
this.msg = msg
private val scanner = new Scanner(System.in)
private var x: Int = -1
private var y: Int = -1
def read: Env = {
val b1 = new Breaks
if (!this.turn) {
this
} else {
b1.breakable {
while (true) {
System.out.printf("山は?(1~3) > ")
this.y = scanner.nextInt() - 1
System.out.printf(this.msg.get("take"), if (this.num(this.y) > 3) 3
else this.num(this.y))
this.x = scanner.nextInt
if (this.x > 0 && this.x <= this.num(this.y))
b1.break()
}
}
this
}
}
def eval: Env = {
val b1 = new Breaks
if (!this.turn) {
b1.breakable {
while (true) {
val rnd2: Random =new Random()
this.y = rnd2.nextInt(3)
val rnd: Random = new Random
this.x = rnd.nextInt(3) + 1
if (this.x <= this.num(this.y))
b1.break()
}
}
}
this.num(this.y) -= this.x
this.turn = !this.turn
this
}
def print: Env = {
if (this.turn && !(this.y == -1)) System.out.printf(this.msg.get("took"), this.msg.get("comp"), this.y + 1, this.x)
System.out.printf(this.msg.get("cond"), this.num(0),this.num(1), this.num(2))
this
}
}
module Tour10_BPipelines
/// Square the odd values of the input and add one, using F# pipe operators.
let squareAndAddOdd values =
values
|> List.filter (fun x -> x % 2 <> 0)
|> List.map (fun x -> x * x + 1)
let numbers = [ 1; 2; 3; 4; 5 ]
let result = squareAndAddOdd numbers
printfn $"{result}"
let function1 x = x + 1
let ans = function1 100
let res = 100 |> function1 |> function1
printfn $"{res}"
Public Class Node
Public Property LeftNode As Node = Nothing
Dim a As Node = _LeftNode
Public Property RightNode As Node = Nothing
Dim b As Node = _RightNode
Public Property Value As Int32 = 0
Dim c As Int32 = _Value
Public Sub New(ByVal value As Int32)
'-- new nodes don't have children yet, just a value
_LeftNode = Nothing
_RightNode = Nothing
_Value = value
End Sub
Public Sub insert(data As Node)
If data.Value <> 0 Then
If data.Value < _Value Then
If _LeftNode Is Nothing Then
_LeftNode = data
Else
_LeftNode.insert(data)
End If
ElseIf data.Value > _Value Then
If _RightNode Is Nothing Then
_RightNode = data
Else
_RightNode.insert(data)
End If
End If
Else
_Value = data.Value
End If
End Sub
Public Sub PrintTree()
If Not (_LeftNode Is Nothing) Then
_LeftNode.PrintTree()
End If
Console.WriteLine(_Value)
If Not (_RightNode Is Nothing) Then
_RightNode.PrintTree()
End If
End Sub
Imports System
Module Program
Public Function Change2Node(ByVal v) As Node
Dim w As Node = New Node(v)
Return w
End Function
Sub Main(args As String())
Dim root As Node = New Node(10)
root.insert(Change2Node(6))
root.insert(Change2Node(14))
root.insert(Change2Node(3))
root.PrintTree()
Console.ReadLine()
End Sub
End Module
Public Class Node
Private _leftNode As Node = Nothing
Private _rightNode As Node = Nothing
Private _lValue As Int32 = 0
Public Property LeftNode As Node
Get
Return _leftNode
End Get
Set(value As Node)
_leftNode = value
End Set
End Property
Public Property RightNode As Node
Get
Return _rightNode
End Get
Set(value As Node)
_rightNode = value
End Set
End Property
Public Property Value As Int32
Get
Return _lValue
End Get
Set(value As Int32)
_lValue = value
End Set
End Property
Public Sub New(ByVal value As Int32)
'-- new nodes don't have children yet, just a value
_leftNode = Nothing
_rightNode = Nothing
_lValue = value
End Sub
End Class
Public Class BinTree
Private _root As Node = Nothing '-- tree has to have a root.ツリーにはルートが必要です
Public Sub New(ByVal value As Int32)
_root = New Node(value) '-- create our nodeノードを作成します
Console.WriteLine(String.Format("Root Inserting: {0}", value)) '-- output what we have done.行ったことを出力します
End Sub
'-- Inserting takes two nodes. The current node we want to do the insert on, and a next node for the loop.
'--挿入には2つのノードが必要です。挿入を実行する現在のノードと、ループの次のノード
Public Sub InsertNode(ByVal input As Int32)
Dim currentNode As Node = _root
Dim nextNode As Node = _root
'-- loop through all the nodes left to right based on our rule of greater than/less than.
'--より大きい/より小さいというルールに基づいて、すべてのノードを左から右にループします
'-- When we find a node who doesn't have any more children we know we have found spot to insert!
'--子がもうないノードを見つけると、挿入する場所が見つかりました。
'-- (because we have been filtered down here by our rules to this point)
'--(これまでのルールによってここでフィルタリングされているため)
'-- Side note - this could probably be done recursively but doing EVERYTHING recursively might be boring.
'--補足-これはおそらく再帰的に実行できますが、すべてを再帰的に実行するのは退屈かもしれません。
While currentNode.Value <> input AndAlso nextNode IsNot Nothing
currentNode = nextNode
If nextNode.Value < input Then
nextNode = nextNode.RightNode
Else
nextNode = nextNode.LeftNode
End If
End While
'-- Once we find our node with no children that follow our rules check our rules one last time to figure out
'--ルールに従っている子がないノードを見つけたら、最後にもう一度ルールをチェックして把握します
'-- which side to tack on our node.
'--どちら側をノードにタックするか。
'-- Oh, and no duplicates! They screw up the order of things!
'--ああ、重複はありません!彼らは物事の順序を台無しにします!
If currentNode.Value = input Then
Console.WriteLine("Can't insert duplicates!")
ElseIf currentNode.Value < input Then
currentNode.RightNode = New Node(input)
Console.WriteLine(String.Format("Inserting: {0}", input))
Else
currentNode.LeftNode = New Node(input)
Console.WriteLine(String.Format("Inserting: {0}", input))
End If
End Sub
'-- Printing is loads of recursive fun. I have two basic types here: Inorder and PreOrder.
'--印刷は再帰的な楽しみの山です。ここには、InorderとPreOrderの2つの基本的なタイプがあります。
Public Sub Print(ByVal doInOrder As Boolean)
If doInOrder Then
InOrder(_root)
Else
PreOrder(_root, 0, "")
End If
End Sub
'-- InOrder follows a depth first run. check left, print, check right.
'--InOrderは、深さ優先実行に従います。左をチェックし、印刷し、右をチェックします。
'-- It attempts to find a right node. If found it goes to the right node and then searches all the left nodes, prints, and goes to the right node.
'--適切なノードを見つけようとします。見つかった場合は、右側のノードに移動し、次に左側のすべてのノードを検索して印刷し、右側のノードに移動します。
'-- The joys of recursion are over floweth here.
'--再帰の喜びはここに溢れています
Private Sub InOrder(ByVal myNode As Node)
If myNode.LeftNode IsNot Nothing Then InOrder(myNode.LeftNode)
Console.WriteLine(myNode.Value)
If myNode.RightNode IsNot Nothing Then InOrder(myNode.RightNode)
End Sub
'-- PreOrder I decided to take some liberties and make it pretty. I added a hyphen to signify the level, and
'--事前注文私はいくつかの自由を取り、それをきれいにすることにしました。レベルを示すためにハイフンを追加し、
'-- also visual indicators on which node (left or right) the value is from.
'--また、値がどのノード(左または右)からのものであるかを視覚的に示します。
'-- The idea here is we print which node we are on, check left, check right.
'--ここでの考え方は、現在のノードを印刷し、左をチェックし、右をチェックすることです。
'--
'-- The level As Int32 is only needed for printing the hyphen.. you can remove it and it still works (sans printing hyphens).
'--レベルAsInt32は、ハイフンを印刷するためにのみ必要です。それを削除しても、引き続き機能します(ハイフンの印刷はありません)。
Private Sub PreOrder(ByVal myNode As Node, ByVal level As Int32, ByVal side As String)
Dim sVal As String = String.Empty
For i As Int32 = 0 To level - 1
sVal += "-"
Next
'-- Actual meat of the method. '--メソッドの実際の肉。
Console.WriteLine(String.Format("{0}{1} {2}", sVal, side, myNode.Value))
If myNode.LeftNode IsNot Nothing Then PreOrder(myNode.LeftNode, level + 1, "L")
If myNode.RightNode IsNot Nothing Then PreOrder(myNode.RightNode, level + 1, "R")
End Sub
'-- Here we will take in a value and attempt to find the path to that value.
'--ここでは、値を取り込んで、その値へのパスを見つけようとします。
Public Sub FindPathToNode(ByVal input As Int32)
Console.WriteLine(String.Format("Finding value: {0}", input))
Dim path As New List(Of Int32) '-- instead of printing the path we will have it saved to a list. '--パスを印刷する代わりに、リストに保存します。
Dim bFound As Boolean = False '-- helps us determine if was found or not. '--見つかったかどうかを判断するのに役立ちます。
Dim sPath As String = String.Empty
'-- basic check to make sure the root wasn't it!
'--ルートがそれではなかったことを確認するための基本的なチェック!
If _root.Value = input Then
Console.WriteLine("root is input!")
Else
'-- Dive into the recursion. '--再帰に飛び込みます。
bFound = PostOrder(_root, input, path)
If bFound Then
'-- print our the path - from the root to the searched node
'--ルートから検索されたノードまでのパスを出力します'-
'-- (the path is in the order of found node then it exits each itteration to the root)
'--(パスは見つかったノードの順序であり、ルートへの各イテレーションを終了します)
For i As Int32 = path.Count - 1 To 0 Step -1
sPath += path(i).ToString + " "
Next
Console.WriteLine("Path: " + sPath)
Else
Console.WriteLine("No found!")
End If
End If
End Sub
'-- A modification of the post order. We take in a node, the value we are looking for, and the path from the node back up to the root.
'--ポストオーダーの変更。ノード、探している値、およびノー??ドからルートに戻るパスを取り込みます。
'-- The trick with this one is we evaluate the nodes first then interact with our current node. In this case we look left, we look right, and then
'--これの秘訣は、最初にノードを評価してから、現在のノードと対話することです。この場合、左を見て、右を見て、次に
'-- evaluate if we are the node in question. If we are record our value on the list and exit with a 'return true'. The calling iteration then receives this "true"
'--問題のノードであるかどうかを評価します。リストに値を記録し、「returntrue」で終了する場合。次に、呼び出し元の反復はこの「真」を受け取ります
'-- and record's its value, and return true. This trickles up to the root and out we go.
'--して、その値を記録し、trueを返します。これは根元まで滴り落ち、私たちは出て行きます。
'-- If the value isn't found returning false let's everyone know this.
'--値がfalseを返すことが見つからない場合は、誰もがこれを知ってみましょう。
Private Function PostOrder(ByVal myNode As Node, ByVal input As Int32, ByVal thePath As List(Of Int32)) As Boolean
'-- check the l
If myNode.LeftNode IsNot Nothing Then
If PostOrder(myNode.LeftNode, input, thePath) Then
thePath.Add(myNode.Value)
Return True
End If
End If
If myNode.RightNode IsNot Nothing Then
If PostOrder(myNode.RightNode, input, thePath) Then
thePath.Add(myNode.Value)
Return True
End If
End If
If myNode.Value = input Then
thePath.Add(myNode.Value)
Return True
End If
Return False
End Function
End Class
Imports System
Module Program
Sub Main(args As String())
Dim bar As New BinTree(5)
bar.InsertNode(2)
bar.InsertNode(1)
bar.InsertNode(8)
bar.InsertNode(3)
bar.InsertNode(10)
bar.InsertNode(7)
bar.InsertNode(12)
Console.WriteLine("------------------")
bar.Print(False)
Console.WriteLine("------------------")
bar.Print(True)
Console.WriteLine("------------------")
bar.FindPathToNode(12)
Console.WriteLine("------------------")
bar.FindPathToNode(13)
Console.ReadLine()
End Sub
End Module
上がメインです。
Imports System
Module Program
Class elem
Public ope As String
Public lev As Integer
End Class
Sub Main(args As String())
'Dim inpstr As String = "6.1 + 5.2 * 4.3 - 3.4 / 2.5 * 1.6 " '答え 6.1 5.2 4.3 * + 3.4 2.5 / 1.6 * -
'Dim inpstr As String = "( a + b ) * c " '答え a b + c *
'Dim inpstr As String = "3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3 " '答え 3 4 2 * 1 5 - 2 3 ^ ^ / + =>X
'Dim inpstr As String = "3 + 4 * 2 / ( 1 - 5 ) ^ ( 2 ^ 3 ) " '答え 3 4 2 * 1 5 - 2 3 ^ ^ / +
'Dim inpstr As String = "3 + 4 * 2 / ( 4 - 2 ) " '答え 3 4 2 * 4 2 - / +
'Dim inpstr As String = "( a + b ) ^ 2 " '答え a b + 2 ^
'Dim inpstr As String = "a + b ^ 2 " '答え a b 2 ^ +
'Dim inpstr As String = "a ^ b ^ c " '答え a b c ^ ^ => X
'Dim inpstr As String = "a ^ ( b ^ c ) " '答え a b c ^ ^
Dim inpstr As String = "a / b / c " '答え a b / c /
Dim rpnstr As String = ""
Dim opeStack As New Stack
Dim aelem As New elem
While True
If inpstr.Length = 0 Then
GoTo owari
End If
Dim fSpacePosition As Integer = inpstr.IndexOf(" ")
Dim fstr As String = inpstr.Substring(0, fSpacePosition)
Dim nstr As String = Strings.Right(inpstr, inpstr.Length - fSpacePosition - 1)
If Not (fstr = "+" Or fstr = "-" Or fstr = "*" Or fstr = "/" Or
fstr = "^" Or fstr = "(" Or fstr = ")" Or fstr = "^") Then
'演算子以外の数値は出力する
rpnstr += fstr + " "
Else
If opeStack.Count >= 1 Then
Dim wope As elem = opeStack.Peek
Dim currentlev As Integer
Select Case fstr
Case "^" : currentlev = 3
Case "*" : currentlev = 2
Case "/" : currentlev = 2
Case "+" : currentlev = 1
Case "-" : currentlev = 1
Case ")" : DoPopUntilLeftPara(rpnstr, opeStack)
GoTo nextread
Case "(" : currentlev = 4
Case Else : currentlev = 0
End Select
Do While wope.lev >= currentlev And opeStack.Count >= 1
If wope.ope = "(" Then GoTo pass
rpnstr += wope.ope + " "
opeStack.Pop()
If opeStack.Count > 0 Then
wope = opeStack.Peek
End If
Loop
pass:
Dim belem As New elem
belem.ope = fstr
belem.lev = currentlev
opeStack.Push(belem)
Else
'最初のスタックへの積上げ
Select Case fstr
Case "^" : aelem.lev = 3
Case "*" : aelem.lev = 2
Case "/" : aelem.lev = 2
Case "+" : aelem.lev = 1
Case "-" : aelem.lev = 1
Case Else : aelem.lev = 0
End Select
aelem.ope = fstr
opeStack.Push(aelem)
End If
End If
nextread:
inpstr = nstr
End While
owari:
Dim welem As elem
Do While opeStack.Count > 0
welem = opeStack.Pop
rpnstr += welem.ope + " "
Loop
Console.WriteLine(rpnstr)
Console.WriteLine("Hello World!")
End Sub
Public Function DoPopUntilLeftPara(ByRef rpnstr As String, ByRef opeStack As Stack) As String
Dim w As elem
While True
w = opeStack.Pop
If w.ope = "(" Then
Return rpnstr
Else
rpnstr += w.ope + " "
End If
End While
Return rpnstr
End Function
End Module