如何检查数组中的任何元素是否未包含在另一个数组中?

时间:2016-06-01 15:40:16

标签: arrays ruby

我正在制作一个玩家与计算机Mastermind(棋盘游戏)程序,作为学习Ruby的一部分。

如果你不认识Mastermind,那么基本上它是一个双人游戏,其中一个玩家创建四种颜色的代码(即“红色红色蓝色黄色”),并且对手试图猜测该代码。

游戏使用一组可用颜色和空代码初始化:

try

       {
                AuthenticationContext ac = new AuthenticationContext(authority);
                ac.TokenCache.Clear();
                AuthenticationResult ar = await ac.AcquireTokenAsync(resource,    clientId, new Uri(returnUri), new PlatformParameters(this));
                JObject payload = new JObject();
                payload["access_token"] = ar.AccessToken;
               // DataRepository.DefaultManager.CurrentClient.Logout();
                user = await DataRepository.DefaultManager.CurrentClient.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,payload);


            }
            catch (Exception ex)
            {
                CreateAndShowDialog(ex.Message, "Authentication failed");
            }

我可以要求用户设置如下代码:

@@colours = ["RED", "BLUE", "YELLOW", "GREEN", "ORANGE", "WHITE"]
@code = []

用户输入代码如下:puts "Please set your code:" code = gets.chomp.downcase.split("") @code << code =&gt; rgby

(会有一个方法发生变化,即“r”变为“RED”,请假设在我的程序中某处发生。)

我想确保播放器只能使用code = ["RED", "GREEN", "BLUE", "YELLOW"]中包含的颜色,即@@colours无效。

伪代码将遵循:

  

如果在pxgb中找到所有输入颜色,请更新@@colours

或相反

  

如果在@code中找不到任何输入颜色,请不要更新@@colours(并可能执行其他操作)。

我该怎么写?我对错误处理不是很熟悉,所以我试图不做,但我愿意学习这是不是最好的方法。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作来检查code是否只包含@@colours

中的元素
(code - @@colours).empty?

如果true仅包含来自code的元素,则上面的表达式为@@colours,否则它将为false

PS:在相关代码示例中,code一次显示为包含gets的输入,另一次显示为已处理输入的数组。在上面的解决方案中,我假设code = ["RED", "GREEN", "BLUE", "YELLOW"]

答案 1 :(得分:0)

您应该查看Set对象和subset?函数。

http://ruby-doc.org/stdlib-2.3.1/libdoc/set/rdoc/Set.html

您可以使用阵列上的to_set函数将数组转换为集合

答案 2 :(得分:0)

您可以从输入中减去允许的元素。如果结果不为空,则输入中有一个元素不在允许值列表中:

allowed = [1,2,3]

input = [1,2]
input - allowed #=> []

input = [1,5]
input - allow   #=> [5]

作为奖励,这会返回不允许的元素,并且可以在错误消息中使用。