【问题标题】:Identifying groups from an array从数组中识别组
【发布时间】:2014-04-27 22:42:13
【问题描述】:

好的,首先我用 BASIC 写这篇文章,因为它是我最了解的语言。

这个程序假设掷了 6 个骰子,它会遍历从 [1][1][1][1][1][1] 到 [6][6][6][6 的所有可能组合][6][6]。不用担心数字旁边的“b”和“r”。

我希望能够做的(希望如此),而不必做一个复杂的 IF 语句是遍历每个“滚动”并挑选出诸如对和三元组等组...,但我也想做出区分,如果说三元组被计算 - 一对不是。


IF A=B AND A<>C AND A<>D AND A<>E AND A<>F THEN PAIR=PAIR+1
IF A<>B AND A=C AND A<>D ...

这样做将需要很长时间,并且需要(如果我计算正确的话)15 个 IF 语句来指示是否有 1 对,然后在我开始三元组和四元组等之前...

这是我的代码 - 这是一项正在进行的工作,因此编号为奇数。


10 REM DEFINE DICE TYPE X
20 DIM X$(6)
30 X$(1) = "1r"
40 X$(2) = "2b"
50 X$(3) = "3r"
60 X$(4) = "4b"
70 X$(5) = "5r"
80 X$(6) = "6b"
90
100 REM DEFINE DICE TYPE Y
110 DIM Y$(6)
120 Y$(1) = "1b"
130 Y$(2) = "2r"
140 Y$(3) = "3b"
150 Y$(4) = "4r"
160 Y$(5) = "5b"
170 Y$(6) = "6r"
180
190
200 REM SET DICE FACES AND ROLL COUNTER
210 LET A = 1
220 LET B = 1
230 LET C = 1
240 LET D = 1
250 LET E = 1
260 LET F = 1
270 LET R = 0
280
281
282 REM DEFINE HANDS
283 LET P = 0
284 LET PP = 0
285 LET PPP = 0
286 LET T = 0
287 LET TP = 0
288 LET TT = 0
289 LET Q = 0
290 LET QP = 0
291 LET QU = 0
292 LET S = 0
293
300 REM ROLL THE DICE
310 LET R = R + 1
320 IF A = B AND A = C AND A = D AND A = E AND A = F THEN LET S = S + 1
1300 PRINT X$(F), X$(E), X$(D), Y$(C), Y$(B), Y$(A), "ROLL "; R
1330 PRINT "SEXTUPLETS: "; S
1340
1350 REM INDEX THE ROLLS
1360 LET A = A + 1
1370 IF A < 7 GOTO 300
1380 LET A = 1
1390
1400 LET B = B + 1
1410 IF B < 7 GOTO 300
1420 LET B = 1
1430
1440
1450 LET C = C + 1
1460 IF C < 7 GOTO 300
1470 LET C = 1
1480
1490
1500 LET D = D + 1
1510 IF D < 7 GOTO 300
1520 LET D = 1
1530
1540
1550 LET E = E + 1
1560 IF E < 7 GOTO 300
1570 LET E = 1
1580
1590
1600 LET F = F + 1
1610 IF F < 7 GOTO 300
1620
1630
1640
1650 END

如果您没有 BASIC 编译器(我使用的是 QB64),请在此处将代码弹出到 Qloud 中:http://www.qb64.net/ 并按运行

【问题讨论】:

  • 你应该学习 Python。它既现代又简单。
  • 感谢您的帮助。如果我要求将一个短语翻译成法语,您的回答就像是告诉我改用德语。我很欣赏 BASIC 已经过时,但这是我所知道的。为什么不向我展示一个可能有用的部分代码示例,而不仅仅是告诉我用我不知道的语言重新编码。我确信它们在语法结构之间一定有一些相似之处——如果我能掌握如何用一种语言完成它,我可能能够使用它来更新我的原始程序或掌握新的程序语言。
  • 我是唯一一个懒得和你说什么的人。这是我第一次在这个网站上看到一个形式的 BASIC。绝对没有人再将它用于任何事情。我的评论可能就是你要到这里的全部内容。
  • 如果我听错了,我很抱歉。那么让我们忽略语言。您将如何在 python 中进行此操作,-顺便说一句,QB64 是 Microsoft 为 64 位机器编写的最新版 Q Basic。
  • 已接受道歉!对不起,我自己很狡猾。 QB 不是行号基本(据我所知)。是行号和 goto 让我大吃一惊。我会看看我能做些什么来让你了解这在 python 中的外观。

标签: arrays sorting counting basic


【解决方案1】:

这并不是你想要的,但它显示了它在 Python 中的样子。

Python 从(行号)basic 开始看起来会很奇怪。但它是最容易学习的现代语言之一,而且功能非常强大(包括标准库和其他库)。这将是一段旅程,但如果您对编程有任何兴趣或需要,那么非常值得。

在 Python 程序中,缩进很重要,所以在移动东西时要小心。

要获取 python:https://www.python.org/ Python 3.4.0 可能最适合您。文档:https://docs.python.org/3/

# A hash tag indicates a comment to the end of the line.

def increment(dice):    # define a function (aka, subroutine)
  dice[0] += 1
  if dice[0] > 6:
    dice[0] = 1
    dice[1] += 1
    if dice[1] > 6:
      dice[1] = 1
      dice[2] += 1
      if dice[2] > 6:
        dice[2] = 1
        dice[3] += 1
        if dice[3] > 6:
          dice[3] = 1
          dice[4] += 1
          if dice[4] > 6:
            dice[4] = 1
            dice[5] += 1
            if dice[5] > 6:
              dice[5] = 1
              return False   # return False when done
  return True

def count_pips(dice):
  counts = [0, 0, 0, 0, 0, 0]
  for x in dice:
    counts[x-1] += 1    # x-1 because of 0-based indices
  return counts

def analyze_counts(counts):
  stats = []  # will hold number of doubles, number of triples, etc.
  for i in range(2, 7):
    stats.append(counts.count(i))
  return stats

# Note that list indices are 0-based
# so indices will go from 0 to 5 for 6 elements.
dice = [1, 1, 1, 1, 1, 1]
counts = count_pips(dice)
stats = analyze_counts(counts)
print dice, stats
while increment(dice):
  counts = count_pips(dice)
  stats = analyze_counts(counts)
  print(dice, stats)

如果你能更准确地描述你想要做什么,我可能会稍微修正一下。

代码的一些解释:

dice 是一个列表,其元素像里程表一样通过从 1,1,1,1,1,1 到 6,6,6,6,6 的所有组合递增(值为 1 到 6), 6. (但你知道的!)

counts 是一个列表,其中填充了 dice 中 1、2 等的计数。

stats 是一个列表,其中填充了count 中 2、3 等的数量。列表具有与之关联的函数,例如count(巧合地命名为类似于我们的变量counts)。 count 函数返回给定列表中具有给定值的元素数。

还要注意这一行:

for i in range(2, 7):

是一个循环,其中i 取值从 2 到 6(比第二个数字小一,这可能看起来有点奇怪,但它就是这样工作的)。

【讨论】:

  • 谢谢。我会努力解决这个问题。我刚刚将代码放入CompileOnline,有趣的是在Python 3 (3.2.3) 中我得到一个语法错误:第42 行语法错误:无效的语法虽然有趣的是,在Python (2.7.4) 中它似乎运行良好。
  • 这是 python 的不幸之处之一。它分为不兼容的python 2和python 3。我通常仍然使用 2。它可能只是 print 语句,在 python 3 中需要括号。我将编辑上面的内容以添加它们。在线编译器可能不会执行程序的整个运行,因为它打印大约 46656输出线!但它可能至少会显示前几行。
  • 您关于编译器没有显示所有输出的说法是完全正确的,但它已经做得足够了——而且它在统计数据中也完全符合我的要求。 - 你能解释一下“analyze_counts”功能吗?它做我想做的事,但我不明白为什么。其余的似乎有些道理。
  • 我在回答中添加了一些解释。
  • OK - 最后一个问题(我认为)。 - “counts[x-1] += 1” - 我理解的 x-1,但 +=1 让我感到困惑。这是否意味着它计算所有大于或等于 1 的东西,还是更像 (x-1)+1?
【解决方案2】:

在玩弄了 Python 代码之后,我还设法让它在 BASIC 中工作。

这是我的新程序(编辑 - 如果有人感兴趣,这现在是完整的程序,它不仅计算卷数,还计算颜色分组) - 如果你想在@Qloud 中测试它987654321@ 准备好等待 - 不过不要太久。

这是我的新代码:

  10    start_time = TIMER

  20    OUT &H3C8, 0 'Set COLOR 0 to black

  30    OUT &H3C9, 1 'R%

  40    OUT &H3C9, 1 'G%

  50    OUT &H3C9, 1 'B%

  60    OUT &H3C8, 1 'set COLOR 1 to red

  70    OUT &H3C9, 63 'R%

  80    OUT &H3C9, 1 'G%

  90    OUT &H3C9, 1 'B%

 100    OUT &H3C8, 2 'set COLOR 2 to white

 110    OUT &H3C9, 63 'R%

 120    OUT &H3C9, 63 'G%

 130    OUT &H3C9, 63 'B%

 140    OUT &H3C8, 3 'set COLOR 3 to dark green

 150    OUT &H3C9, 1 'R%

 160    OUT &H3C9, 19 'G%

 170    OUT &H3C9, 1 'B%

 180    COLOR 2, 3 'Set forground (text) colour to white and background colour to dark green

 190    CLS

 200    DIM face(6)

 210    DIM count_spots(6)

 220    DIM colour(6)

 230    DIM r(6)

 240    DIM b(6)

 250    DIM sr(6)

 260    DIM sb(6)

 270    roll = 0

 280    one_pair = 0: xx = 0: xy = 0

 290    two_pair = 0: xx_xx = 0: xx_yy = 0: xx_xy = 0: xy_xy = 0

 300    three_pair = 0: xx_xx_xy = 0: xx_yy_xy = 0: xy_xy_xy = 0

 310    one_trip = 0: xxx = 0: xxy = 0

 320    one_trip_one_pair = 0: xxx_xx = 0: xxx_yy = 0: xxy_xx = 0: xxy_yy = 0: xxy_xy = 0

 330    two_trips = 0: xxx_xxx = 0: xxx_yyy = 0: xxx_xxy = 0: xxy_xxy = 0

 340    one_quad = 0: xxxy = 0: xxyy = 0

 350    one_quad_one_pair = 0: xxxy_xx = 0: xxxy_yy = 0: xxxy_xy = 0: xxyy_xx = 0: xxyy_xy = 0

 360    one_quint = 0

 370    one_sextuple = 0

 380    one_straight = 0: xxxxxx = 0: xxxxyy = 0: xxxyyy = 0

 390    FOR die = 1 TO 6

 400        face(die) = 1

 410    NEXT die

 420    PRINT "  NO. SHOWING ON  |  ROLL | NO. OF GROUPS OF | COLOUR OF FACE"

 430    PRINT "  THE DICE FACE   |  NO.  | 6  5  4  3  2  1 | RED=1 BLACK=0"

 440    PRINT "------------------+-------+------------------+-----------------"

 450    FOR position = 1 TO 6

 460        colour(position) = (face(position) + ((position - 1) \ 3)) MOD 2

 470        count_spots(position) = 0

 480        group(position) = 0

 490        r(position) = 0

 500        b(position) = 0

 510        sr(position) = 0

 520        sb(position) = 0

 530    NEXT position

 540    g = 0

 550    sg = 0

 560    FOR dice = 1 TO 6

 570        tally_spots = 0

 580        tally_red = 0

 590        tally_black = 0

 600        FOR spots = 1 TO 6

 610            IF face(spots) = dice THEN

 620                tally_spots = tally_spots + 1

 630                IF colour(spots) = 1 THEN

 640                    tally_red = tally_red + 1

 650                ELSEIF colour(spots) = 0 THEN

 660                    tally_black = tally_black + 1

 670                END IF

 680            END IF

 690        NEXT spots

 700        IF tally_spots > 1 THEN

 710            count_spots(tally_spots) = count_spots(tally_spots) + 1

 720            g = g + 1

 730            r(g) = r(g) + tally_red

 740            b(g) = b(g) + tally_black

 750        ELSEIF tally_spots = 1 THEN

 760            count_spots(tally_spots) = count_spots(tally_spots) + 1

 770            sg = sg + 1

 780            sr(sg) = sr(sg) + tally_red

 790            sb(sg) = sb(sg) + tally_black

 800        END IF

 810    NEXT dice

 820    IF count_spots(2) = 1 AND count_spots(3) = 0 AND count_spots(4) = 0 THEN

 830        one_pair = one_pair + 1

 840        IF r(1) = 2 OR b(1) = 2 THEN

 850            xx = xx + 1

 860        ELSE

 870            xy = xy + 1

 880        END IF

 890    ELSEIF count_spots(2) = 2 THEN

 900        two_pair = two_pair + 1

 910        IF r(1) + r(2) = 4 OR b(1) + b(2) = 4 THEN

 920            xx_xx = xx_xx + 1

 930        ELSEIF r(1) + r(2) = 3 OR b(1) + b(2) = 3 THEN

 940            xx_xy = xx_xy + 1

 950        ELSEIF r(1) = 1 AND r(2) = 1 AND b(1) = 1 AND b(2) = 1 THEN

 960            xy_xy = xy_xy + 1

 970        ELSE

 980            xx_yy = xx_yy + 1

 990        END IF

1000    ELSEIF count_spots(2) = 3 THEN

1010        three_pair = three_pair + 1

1020        IF r(1) + r(2) + r(3) = 5 OR b(1) + b(2) + b(3) = 5 THEN

1030            xx_xx_xy = xx_xx_xy + 1

1040        ELSEIF r(1) = 1 AND r(2) = 1 AND r(3) = 1 AND b(1) = 1 AND b(2) = 1 AND b(3) = 1 THEN

1050            xy_xy_xy = xy_xy_xy + 1

1060        ELSE

1070            xx_yy_xy = xx_yy_xy + 1

1080        END IF

1090    ELSEIF count_spots(3) = 1 AND count_spots(2) = 0 THEN

1100        one_trip = one_trip + 1

1110        IF r(1) = 3 OR b(1) = 3 THEN

1120            xxx = xxx + 1

1130        ELSE

1140            xxy = xxy + 1

1150        END IF

1160    ELSEIF count_spots(3) = 1 AND count_spots(2) = 1 THEN

1170        one_trip_one_pair = one_trip_one_pair + 1

1180        IF r(1) + r(2) = 5 OR b(1) + b(2) = 5 THEN

1190            xxx_xx = xxx_xx + 1

1200        ELSEIF r(1) + b(2) = 5 OR r(2) + b(1) = 5 THEN

1210            xxx_yy = xxx_yy + 1

1220        ELSEIF (r(1) = 2 AND b(1) = 1 AND r(2) = 2) OR (r(1) = 1 AND b(1) = 2 AND b(2) = 2) OR (r(1) = 2 AND r(2) = 2 AND b(2) = 1) OR (b(1) = 2 AND r(2) = 1 AND b(2) = 2) THEN

1230            xxy_xx = xxy_xx + 1

1240        ELSEIF (r(1) = 2 AND b(1) = 1 AND b(2) = 2) OR (r(1) = 1 AND b(1) = 2 AND r(2) = 2) OR (r(1) = 2 AND r(2) = 1 AND b(2) = 2) OR (b(1) = 2 AND r(2) = 2 AND b(2) = 1) THEN

1250            xxy_yy = xxy_yy + 1

1260        ELSEIF ((r(1) = 2 AND b(1) = 1) OR (r(1) = 1 AND b(1) = 2)) AND (r(2) = 1 AND b(2) = 1) OR (r(1) = 1 AND b(1) = 1) AND ((r(2) = 2 AND b(2) = 1) OR (r(2) = 1 AND b(2) = 2)) THEN

1270            xxy_xy = xxy_xy + 1

1280        END IF

1290    ELSEIF count_spots(3) = 2 THEN

1300        two_trips = two_trips + 1

1310        IF r(1) + r(2) = 6 OR b(1) + b(2) = 6 THEN

1320            xxx_xxx = xxx_xxx + 1

1330        ELSEIF r(1) + b(2) = 6 OR r(2) + b(1) = 6 THEN

1340            xxx_yyy = xxx_yyy + 1

1350        ELSEIF r(1) < 3 AND r(2) < 3 AND b(1) < 3 AND b(2) < 3 THEN

1360            xxy_xyy = xxy_xyy + 1

1370        END IF

1380    ELSEIF count_spots(4) = 1 AND count_spots(2) = 0 THEN

1390        one_quad = one_quad + 1

1400        IF r(1) = 3 OR b(1) = 3 THEN

1410            xxxy = xxxy + 1

1420        ELSEIF r(1) = 2 AND b(1) = 2 THEN

1430            xxyy = xxyy + 1

1440        END IF

1450    ELSEIF count_spots(4) = 1 AND count_spots(2) = 1 THEN

1460        one_quad_one_pair = one_quad_one_pair + 1

1470        IF (r(1) = 3 AND r(2) = 2) OR (r(1) = 2 AND r(2) = 3) OR (b(1) = 3 AND b(2) = 2) OR (b(1) = 2 AND b(2) = 3) THEN

1480            xxxy_xx = xxxy_xx + 1

1490        ELSEIF (r(1) = 3 AND b(2) = 2) OR (r(1) = 2 AND b(2) = 3) OR (b(1) = 3 AND r(2) = 2) OR (b(1) = 2 AND r(2) = 3) THEN

1500            xxxy_yy = xxxy_yy + 1

1510        ELSEIF ((r(1) = 3 AND b(1) = 1) OR (r(1) = 1 AND b(1) = 3)) AND (r(2) = 1 AND b(2) = 1) OR ((r(2) = 3 AND b(2) = 1) OR (r(2) = 1 AND b(2) = 3)) AND (r(1) = 1 AND b(1) = 1) THEN

1520        xxxy_xy = xxxy_xy + 1

1530        ELSEIF (r(1) = 1 AND r(2) = 2) OR (b(1) = 2 AND b(2) = 2) THEN

1540            xxyy_xx = xxyy_xx + 1

1550        ELSEIF (r(1) = 2 AND b(1) = 2 AND r(2) = 1 AND b(2) = 1) OR (r(1) = 1 AND b(1) = 1 AND r(2) = 2 AND b(2) = 2) THEN

1560            xxyy_xy = xxyy_xy + 1

1570        END IF

1580    ELSEIF count_spots(5) = 1 THEN

1590        one_quint = one_quint + 1

1600    ELSEIF count_spots(6) = 1 THEN

1610        one_sextuple = one_sextuple + 1

1620    ELSEIF count_spots(1) = 6 THEN

1630        one_straight = one_straight + 1

1640        IF sr(1) + sr(2) + sr(3) + sr(4) + sr(5) + sr(6) = 6 OR sb(1) + sb(2) + sb(3) + sb(4) + sb(5) + sb(6) = 6 THEN

1650            xxxxxx = xxxxxx + 1

1660        ELSEIF sr(1) + sr(2) + sr(3) + sr(4) + sr(5) + sr(6) = 4 OR sb(1) + sb(2) + sb(3) + sb(4) + sb(5) + sb(6) = 4 THEN

1670            xxxxyy = xxxxyy + 1

1680        END IF

1690    END IF

1700    LET roll = roll + 1

1710    FOR throw_spots = 1 TO 6

1720        COLOR colour(throw_spots): PRINT face(throw_spots);

1730    NEXT throw_spots

1740    COLOR 2: PRINT "|";

1750    IF roll < 10 THEN

1760        PRINT "    "; roll;

1770    ELSEIF roll < 100 THEN

1780        PRINT "   "; roll;

1790    ELSEIF roll < 1000 THEN

1800        PRINT "  "; roll;

1810    ELSEIF roll < 10000 THEN

1820        PRINT " "; roll;

1830    ELSE

1840        PRINT roll;

1850    END IF

1860    PRINT "|"; count_spots(6); count_spots(5); count_spots(4); count_spots(3); count_spots(2); count_spots(1); "|";

1870    FOR throw_colour = 1 TO 6

1880        COLOR colour(throw_colour): PRINT colour(throw_colour);

1890    NEXT throw_colour

1900    COLOR 2: PRINT " "

1910    face(6) = face(6) + 1

1920    IF face(6) < 7 THEN

1930        GOTO 450

1940    ELSE

1950        face(6) = 1

1960        face(5) = face(5) + 1

1970        IF face(5) < 7 THEN

1980            GOTO 450

1990        ELSE

2000            face(5) = 1

2010            face(4) = face(4) + 1

2020            IF face(4) < 7 THEN

2030                GOTO 450

2040            ELSE

2050                face(4) = 1

2060                face(3) = face(3) + 1

2070                IF face(3) < 7 THEN

2080                    GOTO 450

2090                ELSE

2100                    face(3) = 1

2110                    face(2) = face(2) + 1

2120                    IF face(2) < 7 THEN

2130                        GOTO 450

2140                    ELSE

2150                        face(2) = 1

2160                        face(1) = face(1) + 1

2170                        IF face(1) < 7 THEN

2180                            GOTO 450

2190                        ELSE

2200                            face(1) = 1

2210                        END IF

2220                    END IF

2230                END IF

2240            END IF

2250        END IF

2260    END IF

2270    PRINT "TOTAL NUMBER OF HANDS CONTAINING"

2280    PRINT "1 PAIR:", one_pair; "- XX:"; xx; "- XY:"; xy

2290    PRINT "2 PAIRS:", two_pair; "- XX XX:"; xx_xx; "- XX YY:"; xx_yy; "- XX XY:"; xx_xy; "- XY XY:"; xy_xy

2300    PRINT "3 PAIRS:", " "; three_pair; "- XX XX XY:"; xx_xx_xy; "- XX YY XY:"; xx_yy_xy; "- XY XY XY:"; xy_xy_xy

2310    PRINT "1 TRIP:", " "; one_trip; "- XXX:"; xxx; "- XXY:"; xxy

2320    PRINT "1 TRIP/1 PAIR:"; " "; one_trip_one_pair; "- XXX XX:"; xxx_xx; "- XXX YY:"; xxx_yy; "- XXY XX:"; xxy_xx

2330    PRINT " ", "         "; "XXY YY:"; xxy_yy; "- XXY XY:"; xxy_xy

2340    PRINT "2 TRIPS:", "  "; two_trips; "- XXX XXX:"; xxx_xxx; "- XXX YYY"; xxx_yyy; "- XXY XYY:"; xxy_xyy

2350    PRINT "1 QUAD:", " "; one_quad; "- XXXY:"; xxxy; "- XXYY"; xxyy

2360    PRINT "1 QUAD/1 PAIR:"; "  "; one_quad_one_pair; "- XXXY XX:"; xxxy_xx; "- XXXY YY:"; xxxy_yy; "- XXYY_XX:"; xxyy_xx; "- XXYY XY:"; xxyy_xy

2370    PRINT "1 QUINT:", "  "; one_quint; "- XXXYY:"; one_quint

2380    PRINT "1 SEXTUPLE:", "    "; one_sextuple; "- XXXYYY:"; one_sextuple

2390    PRINT "1 STRAIGHT:", "  "; one_straight; "- XXXXXX:"; xxxxxx; "- XXXXYY:"; xxxxyy

2400    end_time = TIMER

2410    PRINT "This program took "; end_time - start_time; " seconds to execute"

2420    FOR reset_COLOR = 1 TO 256

2430        OUT &H3C7, reset_COLOR

2440        R% = INP(&H3C9)

2450        G% = INP(&H3C9)

2460        B% = INP(&H3C9)

2470    NEXT reset_COLOR

2480    END

【讨论】:

    【解决方案3】:

    此代码片段从 6 个骰子中计算 4 个或更多的对、三胞胎和掷骰数:

    DIM dice(1 TO 6) AS INTEGER
    RANDOMIZE TIMER
    FOR l = 1 TO 6
        dice(l) = INT(RND * 6 + 1)
        PRINT dice(l);
    NEXT
    PRINT
    FOR l = 1 TO 6
        c = 0
        FOR m = 1 TO 6
            IF dice(m) = l THEN
                c = c + 1
            END IF
        NEXT
        IF c >= 2 THEN
            PRINT "there are"; c; "dice of value"; l
        END IF
    NEXT
    END
    

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多