Решение на Piece table от Йоан Петров

Обратно към всички решения

Към профила на Йоан Петров

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 5 успешни тест(а)
  • 3 неуспешни тест(а)

Код

package main
type Editor interface {
// Insert text starting from given position.
Insert(position uint, text string) Editor
// Delete length items from offset.
Delete(offset, length uint) Editor
// Undo reverts latest change.
Undo() Editor
// Redo re-applies latest undone change.
Redo() Editor
// String returns complete representation of what a file looks
// like after all manipulations.
String() string
}
type MyEditor struct {
pieceTable []piece
originBuffer string
addBuffer string
text string
}
type piece struct {
origin bool
offset int
length int
}
// Insert text starting from given position.
func (e *MyEditor) Insert(position uint, text string) Editor {
if position > uint(len(e.text)) {
position = uint(len(e.text))
}
e.text = e.text[:position] + text + e.text[position:]
//makeTable(e)
var p []piece
copy(e.pieceTable, p)
for i := 0; i < len(e.pieceTable); i++ {
if int(position) > /*=*/ e.pieceTable[i].offset && int(position) < e.pieceTable[i].offset+e.pieceTable[i].length {
p1 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset, length: int(position) - e.pieceTable[i].offset}
p2 := piece{origin: false, offset: len(e.addBuffer), length: len(text)}
p3 := piece{origin: e.pieceTable[i].origin, offset: int(position),
length: e.pieceTable[i].offset + e.pieceTable[i].length - int(position)}
p = append(p, p1, p2, p3)
e.addBuffer += text
} else {
p = append(p, e.pieceTable[i])
}
}
e.pieceTable = p
return e
}
// Delete length items from offset.
func (e *MyEditor) Delete(offset, length uint) Editor {
if offset < uint(len(e.text)) {
if offset+length >= uint(len(e.text)) {
e.text = e.text[:offset]
} else {
e.text = e.text[:offset] + e.text[offset+length:]
}
}
var p []piece
copy(e.pieceTable, p)
for i := 0; i < len(e.pieceTable); i++ {
if e.pieceTable[i].offset < int(offset) && e.pieceTable[i].offset+e.pieceTable[i].length > int(offset)+int(length) {
p1 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset, length: int(offset) - e.pieceTable[i].offset}
p2 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset + p1.length + int(length), length: e.pieceTable[i].length - p1.length - int(length)}
p = append(p, p1, p2)
} else {
p = append(p, e.pieceTable[i])
}
}
e.pieceTable = p
return e
}
// Undo reverts latest change.
func (e *MyEditor) Undo() Editor {
return e
}
// Redo re-applies latest undone change.
func (e *MyEditor) Redo() Editor {
return e
}
// String returns complete representation of what a file looks
// like after all manipulations.
func (e *MyEditor) String() string {
return e.text
}
func (e *MyEditor) originString() string {
return e.originBuffer
}
func (e *MyEditor) addString() string {
return e.addBuffer
}
func NewEditor(str string) Editor {
e := new(MyEditor)
e.originBuffer = str
e.text = str
p := piece{origin: true, length: len(str)}
e.pieceTable = make([]piece, 0)
e.pieceTable = append(e.pieceTable, p)
return e
}

Лог от изпълнението

PASS
ok  	_/tmp/d20181107-53-1a3qcb4	0.002s
PASS
ok  	_/tmp/d20181107-53-1a3qcb4	0.002s
--- FAIL: TestUndo (0.00s)
    solution_test.go:75: Expect: "A large span of English text"; got "A span of English text"
FAIL
exit status 1
FAIL	_/tmp/d20181107-53-1a3qcb4	0.002s
--- FAIL: TestSeveralUndos (0.00s)
    solution_test.go:75: Expect: "A large span of text"; got "A span of text"
FAIL
exit status 1
FAIL	_/tmp/d20181107-53-1a3qcb4	0.003s
PASS
ok  	_/tmp/d20181107-53-1a3qcb4	0.002s
--- FAIL: TestSeveralRedos (0.00s)
    solution_test.go:75: Expect: "A large span of text"; got "A span of text"
FAIL
exit status 1
FAIL	_/tmp/d20181107-53-1a3qcb4	0.002s
PASS
ok  	_/tmp/d20181107-53-1a3qcb4	0.002s
PASS
ok  	_/tmp/d20181107-53-1a3qcb4	0.002s

История (1 версия и 0 коментара)

Йоан обнови решението на 05.11.2018 00:33 (преди 9 месеца)

+package main
+
+type Editor interface {
+ // Insert text starting from given position.
+ Insert(position uint, text string) Editor
+
+ // Delete length items from offset.
+ Delete(offset, length uint) Editor
+
+ // Undo reverts latest change.
+ Undo() Editor
+
+ // Redo re-applies latest undone change.
+ Redo() Editor
+
+ // String returns complete representation of what a file looks
+ // like after all manipulations.
+ String() string
+}
+
+type MyEditor struct {
+ pieceTable []piece
+ originBuffer string
+ addBuffer string
+ text string
+}
+
+type piece struct {
+ origin bool
+ offset int
+ length int
+}
+
+// Insert text starting from given position.
+func (e *MyEditor) Insert(position uint, text string) Editor {
+ if position > uint(len(e.text)) {
+ position = uint(len(e.text))
+ }
+ e.text = e.text[:position] + text + e.text[position:]
+ //makeTable(e)
+ var p []piece
+ copy(e.pieceTable, p)
+ for i := 0; i < len(e.pieceTable); i++ {
+ if int(position) > /*=*/ e.pieceTable[i].offset && int(position) < e.pieceTable[i].offset+e.pieceTable[i].length {
+ p1 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset, length: int(position) - e.pieceTable[i].offset}
+ p2 := piece{origin: false, offset: len(e.addBuffer), length: len(text)}
+ p3 := piece{origin: e.pieceTable[i].origin, offset: int(position),
+ length: e.pieceTable[i].offset + e.pieceTable[i].length - int(position)}
+ p = append(p, p1, p2, p3)
+ e.addBuffer += text
+ } else {
+ p = append(p, e.pieceTable[i])
+ }
+ }
+ e.pieceTable = p
+ return e
+}
+
+// Delete length items from offset.
+func (e *MyEditor) Delete(offset, length uint) Editor {
+ if offset < uint(len(e.text)) {
+ if offset+length >= uint(len(e.text)) {
+ e.text = e.text[:offset]
+ } else {
+ e.text = e.text[:offset] + e.text[offset+length:]
+ }
+ }
+ var p []piece
+ copy(e.pieceTable, p)
+ for i := 0; i < len(e.pieceTable); i++ {
+ if e.pieceTable[i].offset < int(offset) && e.pieceTable[i].offset+e.pieceTable[i].length > int(offset)+int(length) {
+ p1 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset, length: int(offset) - e.pieceTable[i].offset}
+ p2 := piece{origin: e.pieceTable[i].origin, offset: e.pieceTable[i].offset + p1.length + int(length), length: e.pieceTable[i].length - p1.length - int(length)}
+ p = append(p, p1, p2)
+ } else {
+ p = append(p, e.pieceTable[i])
+ }
+ }
+ e.pieceTable = p
+ return e
+}
+
+// Undo reverts latest change.
+func (e *MyEditor) Undo() Editor {
+ return e
+}
+
+// Redo re-applies latest undone change.
+func (e *MyEditor) Redo() Editor {
+ return e
+}
+
+// String returns complete representation of what a file looks
+// like after all manipulations.
+func (e *MyEditor) String() string {
+ return e.text
+}
+
+func (e *MyEditor) originString() string {
+ return e.originBuffer
+}
+
+func (e *MyEditor) addString() string {
+ return e.addBuffer
+}
+
+func NewEditor(str string) Editor {
+ e := new(MyEditor)
+ e.originBuffer = str
+ e.text = str
+ p := piece{origin: true, length: len(str)}
+ e.pieceTable = make([]piece, 0)
+ e.pieceTable = append(e.pieceTable, p)
+ return e
+}