本文分享自華為雲社區《Go併發範式 流水線和優雅退出 Pipeline 與 Cancellation》,作者:張儉。 介紹 Go 的併發原語可以輕鬆構建流數據管道,從而高效利用 I/O 和多個 CPU。 本文展示了此類pipelines的示例,強調了操作失敗時出現的細微之處,並介紹了乾凈地處理失敗的 ...
看了博友的C# 實現劉謙春晚魔術很好,改成了delphi版的。
1 program Project1; 2 3 {$APPTYPE CONSOLE} 4 {$R *.res} 5 6 uses 7 System.SysUtils, 8 System.Classes; 9 10 var 11 list, removeElement: TStringList; 12 i, NameCount, insertIndex, directCount, sexCount: Integer; 13 tmp, element, hiddenEle1, hiddenEle2: String; 14 15 procedure Fun1(NameCount: Integer); 16 begin 17 if NameCount < list.Count then 18 begin 19 for i := 0 to NameCount - 1 do 20 begin 21 element := list[0]; // 獲取第0個元素 22 list.Delete(0); // 移除第0個元素 23 list.Add(element); // 將第0個元素添加到最後 24 end; 25 26 end; 27 end; 28 29 procedure Fun2(forCount: Integer); 30 begin 31 // 被刪除掉的三張牌 32 removeElement := TStringList.Create; 33 for i := 0 to forCount - 1 do 34 begin 35 removeElement.Add(list[0]); 36 list.Delete(0); 37 end; 38 Writeln(Format('被刪除掉的%D張牌:%s', [forCount, removeElement.CommaText])); 39 Writeln('刪除之後:' + list.CommaText); 40 41 // 把拿到的三張牌插到中間 42 Randomize; 43 insertIndex := Random(list.Count - 1) + 1; // 生成一個介於第一個和倒數第二個位置之間的隨機插入位置 44 Writeln('插入位置:' + insertIndex.ToString); 45 for i := removeElement.Count - 1 downto 0 do 46 begin 47 list.Insert(insertIndex, removeElement[i]); 48 end; 49 50 end; 51 52 procedure Fun3(); 53 begin 54 // 藏起來第一張牌 55 hiddenEle1 := list.Strings[0]; 56 list.Delete(0); 57 end; 58 59 procedure Fun4(Count: Integer); 60 begin 61 for i := 0 to Count - 1 do 62 begin 63 list.Delete(0); 64 end 65 end; 66 67 procedure Fun5(); 68 begin 69 for i := 0 to 6 do 70 begin 71 element := list[0]; 72 list.Delete(0); 73 list.Add(element); 74 end; 75 end; 76 77 function Fun6(sexCount: Integer): string; 78 var 79 forCount: Integer; 80 begin 81 forCount := 0; 82 if sexCount = 1 then 83 forCount := 5 // 男生要5次 84 else 85 forCount := 4; 86 for i := 0 to forCount - 1 do 87 begin 88 // 把第一張牌放到數組最後面 (好運留下來) 89 element := list[0]; 90 list.Delete(0); 91 list.Add(element); 92 93 // 煩惱丟出去 94 list.Delete(0); 95 end; 96 result := list[0]; 97 end; 98 99 begin 100 try 101 try 102 list := TStringList.Create; 103 list.CommaText := 'A,B,C,D,A,B,C,D'; 104 Writeln('初始牌組:' + list.CommaText); 105 Writeln('請輸入你的名字有幾個字:'); 106 ReadLn(tmp); 107 NameCount := tmp.ToInteger; 108 109 Fun1(NameCount); 110 Writeln('變化之後:' + list.CommaText); 111 112 Fun2(3); 113 Writeln('插入三張牌後:' + list.CommaText); 114 Fun3(); 115 Writeln('藏起來第一張牌後:' + list.CommaText); 116 117 Writeln('北方-1 南方-2 不南不北-3,請輸入對應數字:'); 118 ReadLn(tmp); 119 directCount := tmp.ToInteger; 120 Fun2(directCount); 121 Writeln('南北方人後:' + list.CommaText); 122 123 Writeln('男-1 女-2,請輸入對應數字:'); 124 ReadLn(tmp); 125 sexCount := tmp.ToInteger; 126 Fun4(sexCount); 127 Writeln('男女生後:' + list.CommaText); 128 129 Fun5(); 130 131 Writeln('見證奇跡後:' + list.CommaText); 132 133 Writeln('開始好運留下了 煩惱丟出去'); 134 hiddenEle2 := Fun6(sexCount); 135 Writeln(Format('牌1:%s 牌2:%s', [hiddenEle1, hiddenEle2])); 136 137 ReadLn; 138 except 139 on E: Exception do 140 Writeln(E.ClassName, ': ', E.Message); 141 end; 142 143 finally 144 removeElement.Free; 145 list.Free; 146 147 end; 148 149 end.