猜数字问题
VS2010发布中文版后,迫不及待地学习一下F#,但这里好像还没开F#的版块,只好发到这里来。
这是一个猜数字的小游戏,用计算机求解。在网上看了一下规则,要在7步内完成,我这样算有几个数字需要8步才能完成,不知道哪种情况没有考虑到?
- C# code
open System//所有数字let mutable numberList=[for a in 0..9 do for b in 0..9 do for c in 0..9 do for d in 0..9 ->[a;b;c;d]]let contains (num:int list)= let mutable same=false for i in 0..2 do for j in i+1..3 do if num.[i]=num.[j] then same<-true samenumberList<-List.filter(fun num->not(contains num)) numberList//随机取一个结果数字let resultIndex=(new Random()).Next(numberList.Length)let result=numberList.[resultIndex]//计算alet getA (number:int list, guessNumber:int list)= let mutable count=0 for i in 0..3 do if number.[i]=guessNumber.[i] then count<-count+1 count//计算ablet getAB (number:int list, guessNumber:int list)= let mutable count=0 for i in 0..3 do for j in 0..3 do if number.[i]=guessNumber.[j]then count<-count+1 count//过滤不符合aA的情况let removeA a guessNumber= numberList<-List.filter( fun num-> getA (num,guessNumber)=a ) numberList //过滤不符合bB的情况let removeAB ab guessNumber= numberList<-List.filter( fun num-> getAB(num,guessNumber)=ab ) numberListlet mutable a=0let mutable b=0let mutable step=0while a<>4 do let currentNumber=numberList.[0] a<-getA(result,currentNumber) b<-getAB(result,currentNumber)-a removeA a currentNumber removeAB (a+b) currentNumber printfn "Current Guess: %A, Return: %dA%dB, The Result Is:%A" currentNumber a b result step<-step+1printfn "Step:%d" step
[解决办法]
F#还没去学!
不懂,帮顶一个!
[解决办法]
不懂F#,
不过“猜数字”让我想起了“二分法”。。。
[解决办法]
还没使用
[解决办法]
[解决办法]
不懂,帮顶!~
[解决办法]
学了一种新语法呀
[解决办法]
学习!!!!!!!!!!!
[解决办法]
LZ果然很先进!
[解决办法]
F#是个嘛东西啊?
[解决办法]
没用过呢
[解决办法]
bu dong
[解决办法]
LZ的思路没问题,每一步把不符合条件的去掉,剩下的就是符合条件的了。
试着翻译为C#验证了一下,结果一样,对有些数据需要8步,比如[4; 3; 1; 9]。
顺便说一下,F#的程序比C#简单,因为F#的List.filter很强大。
- C# code
using System;using System.Collections.Generic;class GuessDigit{ List<int[]> numberList; public GuessDigit() { InitNumberList(); GuessIt(numberList[new Random().Next(numberList.Count)]); } void GuessIt(int[] result) { int a = 0; int b = 0; int step = 0; while (a != 4) { int[] currentNumber = numberList[0]; a = GetA(result, currentNumber); b = GetAB(result, currentNumber) - a; RemoveA(a, currentNumber); RemoveAB(a + b, currentNumber); Console.WriteLine("Current Guess: {0}, Return: {1}A{2}B, The Result Is: {3}", Print(currentNumber), a, b, Print(result)); step++; } Console.WriteLine("Step: {0}", step); } string Print(int[] c) { return string.Format("[{0}; {1}; {2}; {3}]", c[0], c[1], c[2], c[3]); } void InitNumberList() { numberList = new List<int[]>(); for (int a = 0; a <= 9; a++) for (int b = 0; b <= 9; b++) for (int c = 0; c <= 9; c++) for (int d = 0; d <= 9; d++) numberList.Add(new int[]{a, b, c, d}); for (int k = numberList.Count - 1; k >= 0; k--) { for (int i = 0; i < 3; i++) for (int j = i + 1; j < 4; j++) if (numberList[k][i] == numberList[k][j]) { numberList.RemoveAt(k); goto next; } next:; } } int GetA(int[] number, int[] guessNumber) { int count = 0; for (int i = 0; i < 4; i++) if (number[i] == guessNumber[i]) count++; return count; } int GetAB(int[] number, int[] guessNumber) { int count = 0; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) if (number[i] == guessNumber[j]) count++; return count; } void RemoveA(int a, int[] guessNumber) { for (int k = numberList.Count - 1; k >= 0; k--) { if (GetA(numberList[k], guessNumber) != a) numberList.RemoveAt(k); } } void RemoveAB(int ab, int[] guessNumber) { for (int k = numberList.Count - 1; k >= 0; k--) { if (GetAB(numberList[k], guessNumber) != ab) numberList.RemoveAt(k); } } [STAThread] static void Main() { new GuessDigit(); }}
[解决办法]
强大...
[解决办法]
看不懂。
[解决办法]
[解决办法]
F#还没去学!
[解决办法]
F#也是刚接触,资料相比C#要少很多阿
F#简明教程一:F#与函数式编程概述
http://developer.51cto.com/art/201001/176352.htm
[解决办法]
C都只是小成,那有精力再学F#哦
[解决办法]
还没有学过F#,支持楼主一个!
[解决办法]
LZ果然很先进!
[解决办法]
没学过F#
[解决办法]
不懂F#
[解决办法]
路过帮顶
[解决办法]
不懂,学习了。
[解决办法]
没接触过。
[解决办法]
还没使用
还不知道呢
[解决办法]
学习了 !!!!!!!!!!!!!!111111
[解决办法]
[解决办法]
学习F#
[解决办法]
标记一下。不错,有时间看看。
[解决办法]
支持。。。
[解决办法]
[解决办法]
learning......
[解决办法]
帮忙顶起
[解决办法]
F#,看上去好茫然......貌似改变很巨大 ?
[解决办法]
不懂 先看一下
[解决办法]
先进知识分子
[解决办法]
F#跟C#只是互补,主要用于金融计算领域和其他,不可能取代C#。下面是F# 的介绍
F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言。它是基于Ocaml的,而Ocaml是基于ML函数程序设计语言的。 这是一个用于显示.NET在不同编程语言间互通的程序设计。
[编辑本段]历史
F#自2002年开始研发,2005年发布了第一个版本,2007年底正式从研发专案转移至产品部门,并决定将F#置入Visual Studio.NET 2010。截止目前(2009年1月6日现在),最新的F#预览版为F# September 2008 CTP,版本号为1.9.6.2。 Visual Studio 2010英文版 已经于2010年4月13日发布。
[编辑本段]定位
微软计划将慢慢整合F#至.NET平台并使F#最终成为.NET平台的顶峰语言。 众所周知,F#是一种函数型程序设计(FP,Functional Programming)语言。然而F#对IP(Imperative Programming)与OOP(Object Oriented Programming)的支持几乎一样的出色。 F#也许终将成为程序核心部分设计的首选,而C#与VB等将在用户界面交互设计方面继续发挥其强大的潜力。
[编辑本段]展望
以目前来看,随著FP在程序设计中的重要性日渐凸显,F#身为微软唯一的FP语言,其位置特殊,容易引起关注。 对一部分人来说,这语言所带来的一些特性以及其对FP的特性的全面支持(而且做得都比较好,至少目前是这样),可能会带来一次大的革变。
[解决办法]
路过..........
------解决方案--------------------
so good!
thx!
[解决办法]
确实难懂
[解决办法]
up
[解决办法]
楼主学的太快了
[解决办法]
C#还没弄明白,更不要说F#了
[解决办法]
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
[解决办法]
[解决办法]
厉害 厉害
[解决办法]
没兴趣,这语法不喜欢
[解决办法]
不懂,帮顶!~
[解决办法]
函数语言社么时候有for了?
[解决办法]
[解决办法]
看不懂呀
[解决办法]
貌似很多人都不懂, 我都第一次听说``
[解决办法]
不懂,帮顶。
[解决办法]
呵呵,做个标记。
[解决办法]
没学过F#,帮顶!
[解决办法]
看上去挺深奥的东西
[解决办法]
还是没能全部看懂,不知道运行结果是什么,帮顶哈
[解决办法]
厉害 呵呵
[解决办法]
F#还没去学!
不懂,帮顶一个
[解决办法]
learning......
[解决办法]
不懂啊!!!
[解决办法]
微软跑的好快啊,跟不上了
[解决办法]
看起来比较实用和简便。有资料么。vs2010在哪下载,给个参考网址吧?
[解决办法]
晕 百度上居然没有F#词条…………
谷歌倒是有。大家可以找找传说中的F# 呵呵 长见识
[解决办法]
顶啦~~~~~
[解决办法]
没有学习过,有时间看看!