Advertisement
Guest User

Untitled

a guest
Jul 10th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 5.09 KB | None | 0 0
  1. #Include "ext/strings/strsplit.bi"
  2.  
  3. #Define _DUMP(x)    PRINT #x + " = " + Str(x)
  4. #Define Boolean     INTEGER
  5. #Define True        1
  6. #Define False       0
  7. #Define NULL        0
  8.  
  9. #Define QSORT_DATA_TYPE     Word
  10.  
  11. FUNCTION CalcValue(s AS STRING) AS ULongInt
  12.     DIM k AS INTEGER
  13.     DIM c AS STRING
  14.     DIM sum AS uLongInt = 0
  15.     DIM mul AS ULongInt
  16.    
  17.     FOR k = LEN(s) TO 1 STEP -1
  18.         c = Mid(s,k,1)
  19.         mul = 26 ^ (LEN(s) - k)
  20.         sum += ASC(c)-97 * mul
  21.     NEXT
  22.     CalcValue = sum
  23. END FUNCTION
  24.  
  25. TYPE Word
  26.     Public:
  27.         DECLARE Constructor()
  28.         DECLARE Constructor(w AS Word)
  29.         DECLARE Constructor(s AS STRING)
  30.         Text AS STRING
  31.         Index AS INTEGER
  32.         DECLARE Operator LET (ByRef rhs AS Word)
  33.         DECLARE SUB InitFrom(s AS STRING)
  34.         DECLARE SUB SetCurrentLetter(idx AS INTEGER)
  35.         DECLARE FUNCTION GetCharC(idx AS INTEGER) AS INTEGER
  36. END TYPE
  37.  
  38. DECLARE Operator < (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  39. DECLARE Operator > (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  40. DECLARE Operator <= (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  41. DECLARE Operator >= (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  42. DECLARE Operator = (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  43.  
  44. Operator Word.LET (ByRef rhs AS Word)
  45.     This.Index = rhs.Index
  46.     This.Text = rhs.Text
  47. END Operator
  48.  
  49. SUB Word.InitFrom(s AS STRING)
  50.     This.Text = s
  51.     This.Index = ASC(s)
  52. END SUB
  53.  
  54. SUB Word.SetCurrentLetter(idx AS INTEGER)
  55.     IF idx > LEN(This.Text) THEN
  56.         This.Index = 255
  57.     ELSE
  58.         This.Index = ASC(Mid(This.Text,idx,1))
  59.     EndIf
  60.    
  61. END SUB
  62.  
  63. FUNCTION Word.GetCharC(idx AS INTEGER) AS INTEGER
  64.     IF idx > LEN(This.Text) THEN RETURN -1
  65.     RETURN ASC(Mid(This.Text, idx, 1))
  66. END FUNCTION
  67.  
  68. Constructor Word()
  69.     This.Index = 0
  70.     This.Text = ""
  71. END Constructor
  72.  
  73. Constructor Word(w AS Word)
  74.     This.Index = w.Index
  75.     This.Text = w.Text
  76. END Constructor
  77.  
  78. Constructor Word(s AS STRING)
  79.     This.Text = s
  80.     This.Index = ASC(s)
  81. END Constructor
  82.  
  83. Operator < (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  84.     RETURN IIf(lhs.Index < rhs.Index, TRUE, FALSE)
  85. END Operator
  86.  
  87. Operator > (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  88.     RETURN IIf(lhs.Index > rhs.Index, TRUE, FALSE)
  89. END Operator
  90.  
  91. Operator <= (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  92.     RETURN IIf(lhs.Index <= rhs.Index, TRUE, FALSE)
  93. END Operator
  94.  
  95. Operator >= (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  96.     RETURN IIf(lhs.Index >= rhs.Index, TRUE, FALSE)
  97. END Operator
  98.  
  99. Operator = (ByRef lhs AS Word,ByRef rhs AS Word) AS Boolean
  100.     RETURN IIf(lhs.Index = rhs.Index, TRUE, FALSE)
  101. END Operator
  102.  
  103.  
  104. SUB qsort OverLoad(A() AS QSORT_DATA_TYPE, L AS INTEGER, R AS INTEGER)
  105.        
  106.         IF L < R THEN
  107.                 DIM AS INTEGER i = L, j = R
  108.                 DIM AS QSORT_DATA_TYPE Pivot = A((L+R)*0.5)
  109.                 DO
  110.                         WHILE A(i) < Pivot AND i < R: i += 1: WEND
  111.                         WHILE A(j) > Pivot AND j > L: j -= 1: WEND
  112.                         IF i <= j THEN SWAP A(i), A(j): i += 1: j -= 1
  113.                 LOOP WHILE i <= j
  114.                 IF L < j THEN qsort(A(), L, j)
  115.                 IF R > i THEN qsort(A(), i, R)
  116.         END IF
  117.        
  118. END SUB
  119.  
  120. SUB qsort OverLoad(A() AS QSORT_DATA_TYPE)
  121.     qsort(A(), LBOUND(A), UBOUND(A))
  122. END SUB
  123.  
  124. SUB LexSort OverLoad(A() AS QSORT_DATA_TYPE, IdxStart AS INTEGER, IdxEnd AS INTEGER, Letter AS INTEGER)
  125.     DIM k AS INTEGER
  126.     DIM c AS INTEGER
  127.     DIM groupStart AS INTEGER
  128.     DIM groupEnd AS INTEGER
  129.    
  130.    
  131.     FOR k = IdxStart TO IdxEnd
  132.         a(k).SetCurrentLetter(Letter)
  133.     NEXT
  134.    
  135.     qsort(a(), IdxStart, IdxEnd)
  136.     groupStart = IdxStart
  137.     groupEnd = groupStart
  138.    
  139.     FOR k = IdxStart TO IdxEnd
  140.         IF a(k).getcharc(Letter) = c AND c > 0 THEN
  141.             groupEnd += 1
  142.         ELSEIF groupEnd > groupStart THEN
  143.             ' sort things out
  144.             'Print "Found group from "; groupStart; " to "; groupEnd
  145.             'Print "recoursing.."
  146.             LexSort(a(), groupStart, groupEnd, Letter+1)
  147.             groupStart = k
  148.             groupEnd = groupStart
  149.         ELSE
  150.             groupStart = k
  151.             groupEnd = groupStart
  152.         EndIf
  153.        
  154.         c = a(k).GetCharC(Letter)
  155.     NEXT
  156.    
  157.     IF (groupEnd > groupStart) THEN
  158.         'Print "Found group from "; groupStart; " to "; groupEnd
  159.         'Print "recoursing.."
  160.         LexSort(a(), groupStart, groupEnd, Letter+1)
  161.     EndIf
  162. END SUB
  163.  
  164. SUB LexSort OverLoad(A() AS QSORT_DATA_TYPE)
  165.     LexSort(A(), LBOUND(A), UBOUND(A), 1)
  166. END SUB
  167.  
  168.  
  169. DIM ProblemCount AS INTEGER
  170. DIM Problems() AS STRING
  171. DIM Words() AS STRING
  172. DIM SortableWords() AS Word
  173. DIM WordCount AS INTEGER
  174. DIM k AS INTEGER
  175. DIM i AS INTEGER
  176. DIM SolutionCount AS INTEGER
  177.  
  178. OPEN "input.txt" FOR INPUT AS 1
  179.  
  180. INPUT #1, ProblemCount
  181.  
  182. REDIM Problems(ProblemCount-1) AS STRING
  183. DO WHILE NOT EOF(1) AND ProblemCount > k
  184.     LINE INPUT #1, Problems(k)
  185.     k += 1
  186. LOOP
  187. CLOSE 1
  188.  
  189. FOR k = 0 TO ProblemCount - 1
  190.     '_DUMP(Problems(k))
  191.    
  192.     ext.strings.Split(Problems(k), Words(), " ", 2)
  193.     WordCount = CINT(Words(0))
  194.     ext.strings.Split(Mid(Problems(k), LEN(Words(0)) + 2), Words(), " ", WordCount)
  195.    
  196.     REDIM SortableWords(WordCount - 1) AS Word
  197.    
  198.     FOR i = 0 TO WordCount - 1
  199.         '_DUMP(Words(i))
  200.         SortableWords(i).InitFrom(Words(i))
  201.     NEXT
  202.    
  203.     LexSort(SortableWords())
  204.    
  205.     FOR i = 0 TO WordCount - 1
  206.         PRINT SortableWords(i).Text;
  207.     NEXT
  208.     PRINT
  209. NEXT
  210.  
  211. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement