最优雅的方式来扩大张牌西服

我存储的四手牌的方式对待手中不同的花色相同,例如:

9h 8h 7c 6c

是相同的

9d 8d 7h 6h

因为你可以更换一个西装与另一并具有同样的事情。 这很容易将这些成使用通配符西服独特的代表性。 先前将成为:

9A 8A 7B 6B

我的问题是 - 什么是最优雅的方式开启后放回原名单? 例如,当输入是9A 8A 7B 6B输出应该是:

9c 8c 7d 6d 9c 8c 7h 6h 9c 8c 7s 6s 9h 8h 7d 6d 9h 8h 7c 6c 9h 8h 7s 6s 9d 8d 7c 6c 9d 8d 7h 6h 9d 8d 7s 6s 9s 8s 7d 6d 9s 8s 7h 6h 9s 8s 7c 6c

我有一些丑陋的代码取决于有多少独特的西装也有,这是否对案件逐案的基础。 它不会扩展到手中更多的卡。 此外,在这样的情况:

7A 7B 8A 8B

它将有重复的,因为在这种情况下, A=cB=d是相同的A=dB=c

什么是优雅的方式来有效地解决这个问题呢? 我编码在C,但我可以向下转换高层代码为C.

--------------解决方案-------------

只有4套这样的​​可能换人的空间真的很小 - 4! = 24的情况。 在这种情况下,我不认为这是值得的,要尽量拿出一些特别聪明。

刚分析字符串如“7A 7B 8A 8B”,计数在它的不同的字母的数目,并根据该数,生成基于预先计算的一组替代的取代。

1 letter -> 4 possible substitutions c, d, h, or s
2 letters -> 12 substitutions like in Your example.
3 or 4 letters -> 24 substitutions.

然后排序的一组替代和删除重复。 你必须做排序每串像“7C 8D 9D 9”的标记,然后排序的字符串数组来检测是否有重复,但是这不应该是一个问题。 这是很好的有一个像“7A 7B 8A 8B”排序过的模式(如令牌:“7A”,“8B”是一个升序排列)。

编辑:

分拣另一种可能是,检测到相同的设置,如果队伍中有两个或两个以上的西装相关联,并考虑到这一点产生换人的时候,但它更复杂,我想。 你将不得不创建一组队伍的每个字母出现在模式字符串。

例如,对于字符串“7A 7B 8A 8B”,用字母A,关联是集合{7,8}和相同的一组是用字母B,那么你必须去寻找不同的字母相关联的相同集关联。 在大多数情况下,这些组将只有一个元件,但它们可能有两个如上面的例子。 具有相同的一组相关联的字母是可互换的。 你可以有以下几种情况

1 letter no duplicates -> 4 possible substitutions c, d, h, or s
2 letters no duplicates -> 12 substitutions.
2 letters, 2 letters interchangeable (identical sets for both letters) -> 6 substitutions.
3 letters no duplicates -> 24 substitutions.
3 letters, 2 letters interchangeable -> 12 substitutions.
4 letters no duplicates -> 24 substitutions.
4 letters, 2 letters interchangeable -> 12 substitutions.
4 letters, 3 letters interchangeable -> 4 substitutions.
4 letters, 2 pairs of interchangeable letters -> 6 substitutions.
4 letters, 4 letters interchangeable -> 1 substitution.

我认为一个通用的置换函数,它接受一个数组arr和一个整数n并返回所有可能的排列n在数组中的元素在这里很有用。

找到多少有在手中存在独特的西服。 然后生成一个与实际西装的许多元素的所有可能的排列[c, d, h, s] 最后通过诉讼的每个排列,并指定每个未知函[A, B, C, D]在手对置换后的值。

在Ruby中下面的代码需要一个给定的手和生成所有的西装排列。 最重的工作正在由完成Array.permutation(n)方法,在这里它应该简化了很多东西了相应的C程序也是如此。

# all 4 suits needed for generating permutations
suits = ["c", "d", "h", "s"]

# current hand
hand = "9A 8A 7B 6B"

# find number of unique suits in the hand. In this case it's 2 => [A, B]
unique_suits_in_hand = hand.scan(/.(.)\s?/).uniq.length

# generate all possible permutations of 2 suits, and for each permutation
# do letter assignments in the original hand
# tr is a translation function which maps corresponding letters in both strings.
# it doesn't matter which unknowns are used (A, B, C, D) since they
# will be replaced consistently.
# After suit assignments are done, we split the cards in hand, and sort them.
possible_hands = suits.permutation(unique_suits_in_hand).map do |perm|
hand.tr("ABCD", perm.join ).split(' ').sort
end

# Remove all duplicates
p possible_hands.uniq

上面的代码输出

9c 8c 7d 6d
9c 8c 7h 6h
9c 8c 7s 6s
9d 8d 7c 6c
9d 8d 7h 6h
9d 8d 7s 6s
9h 8h 7c 6c
9h 8h 7d 6d
9h 8h 7s 6s
9s 8s 7c 6c
9s 8s 7d 6d
9s 8s 7h 6h

代表诉讼为稀疏数组或者列表,数字作为指标,双手关联数组

在你的榜样

H [A [07080000】B【07080000】C [00000000] D [00000000](地方四张牌)

为了得到“真正的”手总是适用的24个排列(定时),所以你不必在意多少卡有你的手的A,B,C,D - > C,D,H,S与下面的“绝招”>店里总是按字母顺序排列>

H1 [C [XXXXXX] D [XXXXXX] S [XXXXXX] H [XXXXXX]

由于手是关联数组,重复排列不产生两种不同的输出手。

#include <stdio.h>
#include <stdlib.h>

const int RANK = 0;
const int SUIT = 1;

const int NUM_SUITS = 4;

const char STANDARD_SUITS[] = "dchs";
int usedSuits[] = {0, 0, 0, 0};

const char MOCK_SUITS[] = "ABCD";

const char BAD_SUIT = '*';

char pullSuit (int i) {
if (usedSuits [i] > 0) {
return BAD_SUIT;
}
++usedSuits [i];
return STANDARD_SUITS [i];
}

void unpullSuit (int i) {
--usedSuits [i];
}

int indexOfSuit (char suit, const char suits[]) {
int i;
for (i = 0; i < NUM_SUITS; ++i) {
if (suit == suits [i]) {
return i;
}
}
return -1;
}

int legitimateSuits (const char suits[]) {
return indexOfSuit (BAD_SUIT, suits) == -1;
}

int distinctSuits (const char suits[]) {
int i, j;
for (i = 0; i < NUM_SUITS; ++i) {
for (j = 0; j < NUM_SUITS; ++j) {
if (i != j && suits [i] == suits [j]) {
return 0;
}
}
}
return 1;
}

void printCards (char* mockCards[], int numMockCards, const char realizedSuits[]) {
int i;
for (i = 0; i < numMockCards; ++i) {
char* mockCard = mockCards [i];
char rank = mockCard [RANK];
char mockSuit = mockCard [SUIT];
int idx = indexOfSuit (mockSuit, MOCK_SUITS);
char realizedSuit = realizedSuits [idx];
printf ("%c%c ", rank, realizedSuit);
}
printf ("\n");
}

/*
* Example usage:
* char** mockCards = {"9A", "8A", "7B", "6B"};
* expand (mockCards, 4);
*/
void expand (char* mockCards[], int numMockCards) {
int i, j, k, l;
for (i = 0; i < NUM_SUITS; ++i) {
char a = pullSuit (i);
for (j = 0; j < NUM_SUITS; ++j) {
char b = pullSuit (j);
for (k = 0; k < NUM_SUITS; ++k) {
char c = pullSuit (k);
for (l = 0; l < NUM_SUITS; ++l) {
char d = pullSuit (l);
char realizedSuits[] = {a, b, c, d};
int legitimate = legitimateSuits (realizedSuits);
if (legitimate) {
int distinct = distinctSuits (realizedSuits);
if (distinct) {
printCards (mockCards, numMockCards, realizedSuits);
}
}
unpullSuit (l);
}
unpullSuit (k);
}
unpullSuit (j);
}
unpullSuit (i);
}
}

int main () {
char* mockCards[] = {"9A", "8A", "7B", "6B"};
expand (mockCards, 4);
return 0;
}

分类:算法 时间:2012-01-01 人气:0
本文关键词: 算法,语言无关
分享到:

相关文章

  • 编码竞赛,语言无关的准则? 2014-11-19

    我可能会很快就做一个编码竞赛,我想知道是否有人做了一个什么地方的指导方针/过程. 我想使竞争呼吁所有开发者,而我会努力的想法拿出来如何. 的情况是:有运行和(的编码竞赛),我们的事件将有一个房间,我们可以使用(要么代码或提问等),然而,理想地为比赛的任务应该是assignet和他们应该EB能去和做其他的事情,如果他们愿意的话. 我不知道是什么样的挑战给予,而最重要的,什么是标准的"双赢"的教学和学习良好的编码标准需要looong时间,我倒要想想,如果你一直在编码较长,你会做正确的事情,

  • 是Java虚拟机的语言无关? 2012-04-30

    它是安全地说,Java虚拟机是'原本'专为Java编程语言,但现在,其他开发商已经能够写编程编译成Java字节码像斯卡拉,Jython和JRuby的语言. 目前仍然在Java字节码一样的接口,方法,字段"面向对象"的引用. 例如invokespecial是一个"对象"方法的调用. 它不是一个纯粹的堆栈的虚拟机与纯语言无关的指令集. 例如,一个纯粹的FORTH实现将只会堆栈操作. 现在的问题,是JVM语言无关或没有? --------------解决方案-------

  • 语言无关的API 2012-05-07

    我就准备把一个Web服务,或暴露在互联网上的一些其他服务. 我想创建一个API,应用程序与该服务进行交互. 我想这个API是在不同的语言,比如Java,C ++,C#或PHP使用. 我怎样才能保持一个代码库为我的API,但是分配漂亮包装的二进制文件,所有这些语言? 另外,我可能会考虑这可能是跨平台的为好. 更新1 我对Web服务的早期阶段,但我认为的关键点之一是,大量的模具支持基于像WDSL服务的描述客​​户的实施. 我还没有交付的任何客户端软件与任何我做了,我希望任何用户能够构建适合自己的需求

  • 我在哪里可以学习如何最好地代表了语言无关的方式准备好转换的程序代码? 2012-06-21

    对于我的源代码转换(Fortran和C)的数值自动微分发动机项目PARADE,我需要的程序程序代码的语言无关的表示 . 在IL(中间语言),按照下图: (整个工具将被完全开发利用哈斯克尔,因此从上面的图中剥离的Java尽可能!) 我在哪里可以学习最好的,最简单的形式主义? 任何提示或资源/文件引用是最欢迎! 作为实现语言是哈斯克尔任何Haskell的特定解决方案的建议都超过居多^ O ^! 问候, 切廷塞尔特 --------------解决方案------------- Haskell有体面的

  • 在语言无关的方式检索性能计数器值 2012-12-26

    在Windows中,性能计数器具有不同的名称,取决于操作系统的语言. 例如,在英文的Windows版本,还有就是性能计数器\Processor(_Total)\% Processor Time . 同样的计数器被称为\Prozessor(_Total)\Prozessorzeit (%)在德国的Windows版本. 有什么办法来检索语言无关的方式性能计数器值(用C ++或C#)? 或者是有一个替代,以获得整个计算机的处理器负载没有性能计数器? --------------解决方案--------

  • 语言无关Robotium测试 2013-01-01

    可以编写语言无关Robotium测试? 例如,如果您使用的是PreferenceActivity,顾名思义是没有办法得到一个R.id引用. 有没有支持这个机制? 或者,也许对于Robotium的方式从字符串文件中读取? 谢谢. --------------解决方案------------- 您可以通过简单地访问当前的活动从一Robotium测试的应用程序,在测试的的strings.xml文件中读取: String myString = getActivity().getString(R.stri

  • 是否有文字换行/ XML / JSON数据服务的语言无关的API生成? 2013-09-26

    我试着去建立面向一个强大的,对象,上顶的JSON HTTP服务与语言无关的API,这样我可以改变数据的底层表示和结构没有打破运行一个网站,客户端代码. (1)是否有REST世界一个Hibernate / iBatis的/ SQLAlchem​​y的风格的API生成工具? 特别是,即时通讯有兴趣把一个漂亮的,干净的API过SOLR服务器,它提供了JSON数据. 或者,也许我可能只是想创建一个服务器端工具,它可以查询的文本文件的大名单,并成为这些文件为对象,通过HTTP访问... 这里的渔获物,然而

  • 如何获得当前的Linux进程ID(PID)从CMDLINE(在用shell和语言无关的方式)? 2014-01-28

    如何从Linux的CMDLINE一个人的当前进程ID(PID)(在用shell和语言无关的方式)? 的pidof(8)似乎别无选择,获取调用流程PID. 当然bash有$$但我一般使用,不能依靠一个shell(bash或者其他方式). 在某些情况下,可以不写脚本或编译的程序(这样的bash,Python和C / C ++等将无法正常工作). 具体使用情况:获取运行的pid,-基于Python面料-,远程ssh进程(以便在其他的事情,我可以复制/创建具有独特文件名 ​​的文件/显示目录,如mkdi

  • 对于C#“usings”或VB“进口”语言无关的名称 2014-03-16

    什么是C#的"使用"和VB的"进口"的正确或最合适的语言无关的名字吗? 别号 命名空间 包括 参考 或者是其他东西? --------------解决方案------------- 我称此为一个 " 模块纳入"功能. 我猜包. 您可以在Java中一样. 你可以说你正在使用/导入包. 我想说所有的休息有很大的不同.

  • 对于需要记忆的东西输入语言无关的词 2014-03-18

    有没有涵括的变量,类实例和数组的概念一个公认的总称? 基本上,"任何类型的需要记忆的东西." 在C ++中,这样的事情被称为对象 ,但我在寻找一个更加语言无关的术语. §1.8 C ++对象模型 1 C ++程序创建,销毁,参考,访问和操纵的对象. 对象是存储区域.该构建[...]对象可以有一个名字(第3条). 一个对象具有存储时间(3.7),这会影响其寿命(3.8), 一个对象都有一个类型 (3.9). --------------解决方案------------- 例如:"

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.254 (s). 10 q(s)