Created
October 12, 2011 17:30
-
-
Save vaclavbohac/1281913 to your computer and use it in GitHub Desktop.
Solution to the 337 UVa Judge problem
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Solution to the UVa Online Judge problem no. 337 */ | |
#include <stdio.h> | |
#include <stdlib.h> | |
int row, column, insmode = 0, ctrlseq = 0; | |
char display[10][10]; | |
void display_reset() { | |
int i, j; | |
for (i = 0; i < 10; i++) { | |
for (j = 0; j < 10; j++) { | |
display[i][j] = ' '; | |
} | |
} | |
row = column = 0; | |
} | |
void display_print() { | |
int i, j; | |
printf("+----------+\n"); | |
for (i = 0; i < 10; i++) { | |
printf("|"); | |
for (j = 0; j < 10; j++) { | |
printf("%c", display[i][j]); | |
} | |
printf("|\n"); | |
} | |
printf("+----------+\n"); | |
} | |
void writechar(char c) { | |
if (c == '\n') { | |
return; | |
} | |
if (insmode) { | |
int i; | |
for (i = 9; i > column; i--) { | |
display[row][i] = display[row][i-1]; | |
} | |
} | |
display[row][column] = c; | |
if (column < 9) { | |
column += 1; | |
} | |
} | |
void action(char c) { | |
int i, j; | |
switch (c) { | |
case 'r': | |
if (column < 9) { | |
column += 1; | |
} | |
break; | |
case 'l': | |
if (column > 0) { | |
column -= 1; | |
} | |
break; | |
case 'd': | |
if (row < 9) { | |
row += 1; | |
} | |
break; | |
case 'u': | |
if (row > 0) { | |
row -= 1; | |
} | |
break; | |
case 'b': | |
column = 0; | |
break; | |
case 'h': | |
row = 0; | |
column = 0; | |
break; | |
case 'c': | |
i = row; | |
j = column; | |
display_reset(); | |
row = i; | |
column = j; | |
break; | |
case 'e': | |
for (i = column; i < 10; i++) { | |
display[row][i] = ' '; | |
} | |
break; | |
case 'i': | |
insmode = 1; | |
break; | |
case 'o': | |
insmode = 0; | |
break; | |
} | |
} | |
int main(void) { | |
int i, n, casenum = 1; | |
char sign; | |
while (scanf("%d\n", &n) == 1) { | |
if (n == 0) { /* Last line */ | |
return 0; | |
} | |
display_reset(); | |
for (i = 0; i < n; i++) { | |
for (;;) { | |
sign = getchar(); | |
if ((sign != '^' && !ctrlseq) || (sign == '^' && ctrlseq)) { | |
if (sign == '\n') { | |
break; | |
} | |
writechar(sign); | |
ctrlseq = 0; | |
} else if (sign == '^') { | |
ctrlseq = 1; | |
} else if (ctrlseq && sign >= '0' && sign <= '9') { | |
row = sign - '0'; | |
column = getchar() - '0'; | |
ctrlseq = 0; | |
} else { | |
action(sign); | |
ctrlseq = 0; | |
} | |
} | |
} | |
printf("Case %d\n", casenum++); | |
display_print(); | |
} | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
class Display | |
attr_accessor :data, :row, :col, :insertmode | |
def initialize | |
reset | |
end | |
def reset | |
@data = Array.new(10) { Array.new(10) {' '} } | |
@insertmode = false | |
@row = @col = 0 | |
end | |
def print_display | |
puts "+----------+" | |
@data.each do |row| | |
print "|" | |
row.each do |value| | |
print value | |
end | |
puts "|" | |
end | |
puts "+----------+" | |
end | |
def write(sign) | |
return if sign.include?("\n") | |
if @insertmode | |
i = 9 | |
until i == @col do | |
@data[@row][i] = @data[@row][i - 1] | |
i -= 1 | |
end | |
end | |
@data[@row][@col] = sign | |
@col += 1 if @col < 9 | |
end | |
end | |
def action(display, key) | |
case key | |
when 'r' | |
display.col += 1 if display.col < 9 | |
when 'l' | |
display.col -= 1 if display.col > 0 | |
when 'd' | |
display.row += 1 if display.row < 9 | |
when 'u' | |
display.row -= 1 if display.row > 0 | |
when 'b' | |
display.col = 0 | |
when 'h' | |
display.col = 0 | |
display.row = 0 | |
when 'c' | |
col = display.col | |
row = display.row | |
display.reset | |
display.col = col | |
display.row = row | |
when 'e' | |
for i in (display.col..9) | |
display.data[display.row][i] = ' ' | |
end | |
when 'i' | |
display.insertmode = true | |
when 'o' | |
display.insertmode = false | |
when '^' | |
display.write '^' | |
end | |
end | |
def process_line(display, line) | |
rowset = control = false | |
line.each_char do |c| | |
unless control | |
control = c == "^" | |
unless control | |
display.write c | |
end | |
else | |
if '0' <= c and c <= '9' | |
unless rowset | |
display.row = c.to_i | |
rowset = true | |
next # skip iteration | |
else | |
display.col = c.to_i | |
rowset = false | |
end | |
else | |
action display, c | |
end | |
control = false | |
end | |
end | |
end | |
def line_nums | |
begin | |
l = gets.strip! | |
end while l.empty? | |
l.to_i | |
end | |
def create_print_case | |
i = 1 | |
lambda { | |
puts "Case #{i}" | |
i += 1 | |
} | |
end | |
if __FILE__ == $0 | |
display = Display.new | |
f = create_print_case | |
loop do | |
lines = line_nums | |
break if lines.zero? | |
lines.times do | |
process_line display, gets | |
end | |
display.print_display | |
display.reset | |
f.call | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 | |
This is bad^h^c | |
^05^^ | |
^14/ \^d^b / \ | |
^u^d^d^l^l^l^l^l^l^l^l^l | |
^r^r< ACM >^l^l^d/^b \ | |
^b^d \ / | |
^d^l^lv | |
7 | |
^i9^l8^l7^l6^l5^l4^l3^l2^l1^l0 | |
^o^d^lThis is #1^d^bThis is #2 | |
^d^bThis is #3^d^bThis is #4 | |
^d^bThis is #5^d^bThis is #6 | |
^d^bThis is #7^d^bThis is #8 | |
^i^d^bThis is #9^d^bThis is #10 | |
^54^e Hello^d^l^l^l^lWorld | |
0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment