• 12

[有趣]越簡單的程式, 越多人不會寫??


TotalEclipse wrote:

用 balanced binary tree?


balanced tree 只要求兩邊 depth 相差不要大於 1 吧. 這樣不代表你的 root 一定是中間值喔!!
所以如果像這個樹, 你達到 balance 的要求, 但是你的結果會變成 6 (sorry, 我用 "_" 確定間距不會跑掉, 不過要運用想像力來看)

_________6
____4_________8
__2___5_____7___9
_1_3

TotalEclipse wrote:
Set Numbers = array of random integers.
Set i=1.
Set Ans = 0.
For n=1 to end of numbers array do
{
Ans = Ans + ( Numbers[n] * i ).
i = i * -1.
}
Print Ans.


這個如果 input order 不同就不會過了喔
例 {1,2,3,4,5,6,7,8,1,2,3,4,5,6,8,9,9}


mmppeegg wrote:
考algorithm, 會有幾個人可以臨場寫出來?...(恕刪)

考 algorithm 還好. 基本上你應該可以想出一個解答 (通常是蠻爛的, 像 O(n^3) 之類的). 然後他會提示你, 慢慢把答案修正到完美, 而且都是寫出來大家一起看. 所以小 error (少一個 ";" 之類的) 他們不會在意. 就算都想不到答案. 只要你在得到答案的過程中可以 think out loud. 把你想的過程說出來 (不是指, "他x的, 怎麼這麼難, 之類的") 才是重點. 主要是要看你的 problem solving 吧.




driftice wrote:
看到字串比對直覺就...(恕刪)


剛起床頭眼昏花, 所以看不太懂,
不過 compile 起來跑結果怪怪的 >"<
颱風天沒事作動動腦不錯.....perl寫法
kenl wrote:
1, 獲得一個亂數 array, 找出中間數值
例 > {1,3,5,7,9,2,4,6,8} 答案會是5
oh, sorting 不會是最佳解!

這一題不懂意思...跳過
kenl wrote:
同樣是亂數 array, 不過裡面的數值都是成對的, 除了特別的一個. 找出特別那個
例 > {1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,8,9} 答案會是 7
出來的 algorithm 會是 O(n)

my @data=(1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,8,9);
my $list;
my @temp;

$list.=$_ for @data;
@temp= $list=~/(\d)(?=.*\1)/g;
$list=~ s/$_//g for @temp;

print $list;
kenl wrote:
找出字串中最長的重複字
例 > "yzabcdefghijhlabcdefiuabc" 答案會是 "abcdef"

my $list="yzabcdefghijhlabcdefiuabc";

for $i (1...length($list))
{
@match=@temp if (@temp= $list=~/(\w{$i})(?=.*\1)/g);
}

print @match,"\n";
cooper_wan wrote:
比別人少執行400個除法
老師 可以給我個90吧...(恕刪)

這招不錯,對某些沒有內建除法指令的CPU來說,這個方法真是補啊!
不知道要簽什麼的說‧‧‧
kenl wrote:
eish, hell...(恕刪)


先想到第2題.

//pseudocode

void findX(intArr inputNums){

hashTable h;

for(int i=0; i< inputNums.length, i++){

int x=inputNums[i]);
if(h.exist( x ) /* O(1) */ h.remove ( x );
else h.add( x );
}

printEachElement( h );

}
第一題來了

//pseudocode

int findMid(intArr inputNums){

ind midPosition = inputNums.length/2;

return find_Kth_Num(inputNums, midPosition); // google 找出第k小元素演算法, O( n );


} (
第3題因為沒限定時間複雜度,所以不難,沒用上什麼特別的演算法,就是寫起來很煩雜,上機修修改改才寫出來;
以下是C#, 暴力解法,稍微做些最佳化. (我大概是吃飽喝醉太閒了)

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplicationTest
{
class Program
{

static int findSubStr(string str, int srcLength, int begin)
{

string str1 = str.Substring(0, srcLength);
string str2 = str.Substring(begin);
int idx= str2.IndexOf(str1);
if (idx >= 0) idx += begin;
return idx;
}

static string findMaxStr(string str)
{
int begin = 2, idx = -1,i;
for (i = 1; i < str.Length / 2; i++)
{
int _idx = findSubStr(str, i, begin);
if (_idx < 0) break;
idx = _idx;
begin = idx;
}

if (idx < 0) return "";
return str.Substring(idx, i-1);
}

static void findMaxStr2(string str)
{
string ans="";
for (int i = 0; i < str.Length; i++)
{
if (ans.Length > str.Length - i) break;
string r = findMaxStr(str.Substring(i));
if (r.Length > ans.Length) ans = r;
}

Console.Write(ans);
}


static void Main(string[] args)
{
//例 > "yzabcdefghijhlabcdefiuabc" 答案會是 "abcdef"
findMaxStr2("yzabcdefghijhlabcdefiuabc");
findMaxStr2("yzabcdefghijhlabcdefgh");
}
}
}
bluesystem wrote:
讓我想到前兩天在跟以...(恕刪)


第一題要用單一迴圈很簡單,不過要懂得C語法比較不常用的部份,以"i" 為行,
以"j"為列,在for回圈加上comma語法就成啦!!
void fun1(int num)
{
int n = num;
int i = 0;
int j = 0;

for ((i = 0,j=0); j < n; ((i < j) ? i ++ : (i = 0,j++))){
printf("*");
if (i == j){
printf("\n");
}
}
}
第二題也是一樣!!!在這利用"k"來決定要print多少"*"
void fun2(int num)
{
int n = num;
int i = 0;
int j = 0;
int k = n;

for ((i=0,j=0); j < (2*n - 1); ((i < (n-k)) ? i ++ : (i = 0,j++,(j<n?k--:k++)))){
printf("*");
if (i == (n-k)){
printf("\n");
}
}
}
不過說實在的,要想一下才會知道要怎麼寫,而且要上機驗證一下,憑手寫的話嘛!!程式的大體寫
得出來,不過正確性就會打折扣,因為index的操作多一少一就不對了.......

虎斑笨貓 wrote:


應該不是他的問題
因為[ i ]是BBCode的斜體

還是會被轉成< i >


噗噗,就是這個問題....
太少在 M01 貼文的報應(?).....

總之,已經修好了。
感謝各位的提醒。
雙子貓 wrote:
這‧‧‧大家真是越來...(恕刪)


小弟剛開始學MASM,也嘗試著寫了一段,用MASM 6.11編譯通過(使用模型的方法而非完整段定義,後者的代碼將更冗長),可執行檔大小681Byte。

這裡我偷了一個懶,因為最大數是100,只需使用AAM就可以將0~99之間的ASCII數值轉換成2個非壓縮的BCD碼,加上3030H就變成實際的ASCII碼用21H中斷顯示了。如果最大數超過100的話,處理的過程就要稍微複雜一點了。

學藝不精,如果代碼有不妥之處或尚可以精簡,請不吝指正。


.MODEL SMALL
.STACK 80H
.DATA
COUNT DW 1
THREE DB 3
FIVE DB 5
FIZZ DB 'Fizz',32,36
BUZZ DB 'Buzz',32,36
PRINT_FLAG DB 0
.CODE
MAIN PROC NEAR
.STARTUP
@MAIN5: MOV AX,COUNT ;除以3
DIV THREE
CMP AH,0 ;如果能夠被3整除,顯示Fizz並空格
JNE @MAIN1
MOV AH,9
MOV DX,OFFSET FIZZ
INT 21H
MOV PRINT_FLAG,1
@MAIN1: MOV AX,COUNT ;除以5
DIV FIVE
CMP AH,0 ;如果能夠被5整除
JNE @MAIN2 ;a:如果已經顯示過Fizz,
CMP PRINT_FLAG,1 ; 回退一格並顯示Buzz,再空格
JNE @MAIN7 ;b:如果沒有顯示過Fizz,
MOV AH,2 ; 顯示Buzz並空格
MOV DL,8
INT 21H
@MAIN7: MOV AH,9
MOV DX,OFFSET BUZZ
INT 21H
MOV PRINT_FLAG,1
@MAIN2: CMP PRINT_FLAG,1 ;如果沒有顯示過Fizz或Buzz,
JE @MAIN3 ;顯示實際的數值並空格
MOV AX,COUNT
AAM
ADD AX,3030H
CMP AH,30H
JE @MAIN6
PUSH AX
MOV DL,AH
MOV AH,2
INT 21H
POP AX
@MAIN6: MOV AH,2
MOV DL,AL
INT 21H
MOV DL,32
INT 21H
@MAIN3: CMP COUNT,99 ;判斷計數是否到達99
JE @MAIN4 ;如果不是,計數加1,
MOV PRINT_FLAG,0 ;進入下一個迴圈
INC COUNT ;如果是,顯示Buzz(100)
JMP @MAIN5
@MAIN4: MOV AH,9
MOV DX,OFFSET BUZZ
INT 21H
.EXIT ;程式結束,退出
MAIN ENDP
END


執行結果

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fiz
z 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz
41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 Fi
zzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz
79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97
98 Fizz Buzz
: xx 101 1 do i i 15 mod 0 = if ." FizzBuzz" drop
else
i 3 mod 0 = if ." Fizz" drop
else
i 5 mod 0 = if ." Buzz" drop
else .
then
then
then loop ;
這樣好像也可以

  • 12
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 12)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?