最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)

简介: 原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧.            Console.WriteLine("说出三个不同的特殊数,用','隔开 ");            string[] s1 = Console.

原题

看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧.

            Console.WriteLine("说出三个不同的特殊数,用','隔开 ");
            string[] s1 = Console.ReadLine().Split(',');
            for (int i = 1; i < 101; i++)
            {
                if (i.ToString().Contains(s1[0])) { Console.WriteLine("Fizz"); }
                else { Console.WriteLine((i % int.Parse(s1[0]) == 0 ? "Fizz" : "") + (i % int.Parse(s1[1]) == 0 ? "Buzz" : "") + (i % int.Parse(s1[2]) == 0 ? "Whizz" : "") + ((i % int.Parse(s1[0]) != 0 && i % int.Parse(s1[1]) != 0 && i % int.Parse(s1[2]) != 0) ? i.ToString() : "")); }
            }
            Console.ReadKey();

其实我想表达的意思是学习更多的是循序渐进而不是天才般的灵光乍现,不过不知谁懂呢. 

 

一开始楼主傻BB直接求解,思路惨不忍睹,各种循环啊有木有?还写了个计算是否整除扩展方法以为重复复用很了不起啊(其实是傻...)

二逼青年的代码

 1    #region so1
 2              int[] count =  new  int[ 100];
 3              string[] s4 =  new  string[] {  " Fizz "" Buzz "" Whizz " };
 4              for ( int i =  0; i < count.Length; i++)
 5             {
 6                 count[i] = i +  1;
 7                  if (count[i].compa(s2[ 0]))
 8                 {
 9                     result[i] = s4[ 0];
10                      if (count[i].compa(s2[ 1]))
11                     { result[i] = s4[ 0] + s4[ 1]; }
12                 }
13                  else
14                 {
15                      if (count[i].compa(s2[ 2]))
16                     {
17                         result[i] = s4[ 2];
18                          if (count[i].compa(s2[ 1]))
19                         {
20                             result[i] = s4[ 1] + s4[ 2];
21                              if (count[i].compa(s2[ 0]))
22                             { result[i] = s4[ 0] + s4[ 1] + s4[ 2]; }
23                         }
24                          else
25                         {
26                              if (count[i].compa(s2[ 0]))
27                             { result[i] = s4[ 0] + s4[ 1]; }
28                         }
29                     }
30                      else
31                     { result[i] = (i +  1).ToString(); }
32                 }
33             }
34              for ( int i =  0; i <  10; i++)
35             { result[s2[ 0] + i *  10 -  1] = s4[ 0]; result[i + s2[ 0] *  10 -  1] = s4[ 0]; }
36              foreach ( var item  in result)
37             { Console.WriteLine(item); }
38              #endregion

 

后来楼主想了一下,感觉判断是否整除可以复用,然后一般的值先赋过去,虽然这样会重复,但是由于集合是越来越小的所以不会出差错,而在a,b,c集合外的值作为另外一个判断,赋普通的值给他,这样代码就如下了:

普通青年的代码
  #region so02
             int sh =  1;
             for ( int i =  0; i <  10; i++)
            {
                 int i2 =  0;
                 for (i2 =  0; i2 <  10; i2++)
                {
                     bool b1 = sh.compa(s2[ 0]);
                     bool b2 = sh.compa(s2[ 1]);
                     bool b3 = sh.compa(s2[ 2]);
                     if (b1) { result[i *  10 + i2] =  " Fizz "; }
                     if (b2) { result[i *  10 + i2] =  " Buzz "; }
                     if (b3) { result[i *  10 + i2] =  " Whizz "; }
                     if (b1 && b2) { result[i *  10 + i2] =  " FizzBuzz "; }
                     if (b1 && b3) { result[i *  10 + i2] =  " FizzWhizz "; }
                     if (b2 && b3) { result[i *  10 + i2] =  " BuzzWhizz "; }
                     if (b1 && b2 && b3) { result[i *  10 + i2] =  " FizzBuzzWhizz "; }
                     if (i2 == s2[ 0]) { result[i *  10 + i2] =  " Fizz "; }
                     if (!(b1 || b2 || b3))
                    { result[i *  10 + i2] = sh.ToString(); }
                    sh++;
                }
                 if (i == s2[ 0])
                {
                     for ( int i3 =  0; i3 <  10; i3++)
                    { result[i *  10 + i3 -  1] =  " Fizz "; }
                }
            }
             #endregion

(是否有误未测试,但大体是这个思路) .

后来楼主再回去看那个页面,人家说10行代码就能搞定,楼主看着这普通青年的代码表示蛋疼,于是请教一下在中大的基友.人家读数学专业的就是不一样,给的思路也是天马行空,于是借鉴一下传说中的至简代码就出来了.

文艺青年的代码
1             Console.WriteLine( " 说出三个不同的特殊数,用','隔开  ");
2              string[] s1 = Console.ReadLine().Split( ' , ');
3              int[] s2 =  new  int[] {  int.Parse(s1[ 0]),  int.Parse(s1[ 1]),  int.Parse(s1[ 2]) };
4              string[] result =  new  string[ 100];
5              for ( int i =  1; i <  101; i++) { result[i -  1] = (i % s2[ 0] ==  0 ?  " Fizz " :  "") + (i % s2[ 1] ==  0 ?  " Buzz " :  "") + (i % s2[ 2] ==  0 ?  " Whizz " :  "") + ((i % s2[ 0] !=  0 && i % s2[ 1] !=  0 && i % s2[ 2] !=  0) ? i.ToString() :  ""); }
6              for ( int i3 =  0; i3 <  10; i3++) { result[s2[ 0] *  10 + i3 -  1] = result[i3 *  10 + s2[ 0] -  1] =  " Fizz "; }
7              foreach ( var item  in result) { Console.WriteLine(item); }
8             Console.ReadKey();

思路就是规则3和4通过活用三元运算符+字符串同时拼接处理.第一个for循环为规则3和4赋值,如果满足整除条件,输出对应单词,这样能被N(1到3)整除的数字对应的单词都能赋到,但是有一种情况就是整除条件都不满足,也就是说是一个普通的数字,而前面根据三元运算符得到的答案都是“”,所已最后的条件满足的话输出普通的数字。

然后是规则5。规则5是最重要的,所已在最后才为其赋值。这个没什么好说的,想一想都知道规则5每种条件都包含10个数,所已在0到10之间循环,同时为个数满足以及十位数满足的数赋值就行了.代码控制在10行代码啊有木有(我不知道10行的定义是什么这样稍微有点勉强不过最少也有8行吧,哈哈 )?

当然是假定用户不捣乱,一开始不输入错的情况。加个验证?那你们就慢慢验吧。

下部就不截了。 

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
279 27
|
3月前
|
人工智能 前端开发 Java
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
101 6
Java 面试资料中相关代码使用方法与组件封装方法解析
|
11月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
606 2
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
C# 开发者 Windows
在VB.NET项目中使用C#编写的代码
在VB.NET项目中使用C#编写的代码
157 0
|
10月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
150 6
|
11月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
279 2
|
11月前
|
存储 开发框架 .NET
常见20道C#面试的题
常见20道C#面试的题
134 1
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
1597 1