Updates from Jim Randell Toggle Comment Threads | Keyboard Shortcuts

  • Unknown's avatar

    Jim Randell 10:53 pm on 16 February 2019 Permalink | Reply
    Tags:   

    Brain-Teaser 452: [Coloured dice] 

    From The Sunday Times, 11th January 1970 [link]

    Three dice, numbered from 1 to 6, each had 2 blue, 2 red and 2 white faces. No number appeared in the same colour twice.

    When  Bill threw the dice they totalled 14, showing 2 white faces and 1 red. A second throw showed each die the same colour as before, but each had a different number totalling 15. On one die Bill noticed two similarly coloured sides added to 9.

    The telephone rang and Bill went to answer it, leaving little Tommy by himself, who then picked up one of the dice and painted a red face white and a white face red. He then threw the dice twice producing firstly 3 whites and then 3 reds, each throw showing one of the repainted sides.

    Tommy totalled the 3 whites to 8 and the 3 reds to 7. Unfortunately, sums were not his strong point and though he sometimes got them right, quite often he was 1 out, and sometimes even 2 out. However, he was certain that the 3 whites totalled more than the 3 reds.

    What numbers did Tommy repaint (1) red, and (2) white?

    This puzzle was originally published with no title.

    [teaser452]

     
    • Jim Randell's avatar

      Jim Randell 10:55 pm on 16 February 2019 Permalink | Reply

      This Python program runs in 200ms. (Internal runtime is 126ms).

      from enigma import (namedtuple, irange, partitions, subsets, cproduct, printf)
      
      # represent a die
      Die = namedtuple("Die", "B R W")
      
      # collect possible dice
      dice = set(Die(*s) for ns in partitions(irange(1, 6), 2) for s in subsets(ns, size=len, select='P'))
      
      # can we make the numbers in <ns> from the opposite faces of <fs>
      def make(ns, fs):
        ns = set(ns)
        (f1, f2, f3) = fs
        return any(ns.issubset([f1[i1] + f2[i2] + f3[i3], f1[1 - i1] + f2[1 - i2] + f3[1 - i3]]) for (i1, i2, i3) in subsets((0, 1), size=3, select='M'))
      
      # change tuple <t> so index <i> is <v>
      def change(t, i, v):
        t = list(t)
        t[i] = v
        return tuple(t)
      
      # possible white, red values for Tommy (white > red)
      ts = set((w, r) for w in irange(6, 10) for r in irange(5, w - 1))
      
      # choose a set of three dice
      for (d1, d2, d3) in subsets(dice, size=3):
      
        # "no number appeared in the same colour twice"
        if not all(len(set(x1 + x2 + x3)) == 6 for (x1, x2, x3) in zip(d1, d2, d3)): continue
      
        # "on one of the dice two similary coloured sides add up to 9"
        if not any(sum(x) == 9 for x in d1 + d2 + d3): continue
      
        # can we make a R, W, W combination that sums to 14 and 15
        if not any(make((14, 15), fs) for fs in [(d1.R, d2.W, d3.W), (d1.W, d2.R, d3.W), (d1.W, d2.W, d3.R)]): continue
      
        # Tommy picked one of the dice and swapped the colours of a red number and a white number, suppose he repaints t1
        for (t1, t2, t3) in [(d1, d2, d3), (d2, d1, d3), (d3, d1, d2)]:
          # choose red/white faces of t1 to repaint
          for (r, w) in subsets((0, 1), size=2, select='M'):
            # the repainted die
            t = Die(B=t1.B, R=change(t1.R, r, t1.W[w]), W=change(t1.W, w, t1.R[r]))
      
            # record possible 3 white/red scores (including the repainted faces)
            ws = set(sum(s) for s in cproduct([[t.W[w]], t2.W, t3.W]))
            rs = set(sum(s) for s in cproduct([[t.R[r]], t2.R, t3.R]))
      
            # do these create feasible values?
            vs = ts.intersection(cproduct([ws, rs]))
            if vs:
              printf("dice: {t1} {t2} {t3}")
              printf("  red = {r}, white = {w} -> {vs}", r=t.R[r], w=t.W[w])
      

      Solution: (1) Tommy repainted 3 to red, (2) and 4 to white.

      There is only one possible set of dice:

      die 1: blue = 1,5; red = 2,4; white = 3,6
      die 2: blue = 2,6; red = 1,3; white = 4,5
      die 3: blue = 3,4; red = 5,6; white = 1,2

      The throws for Bill, showing 2 white faces and 1 red:

      throw 1: die 1 = white 3; die 2 = white 5; die 3 = red 6; total = 14
      throw 2: die 1 = white 6; die 2 = white 4; die 3 = red 5; total = 15

      Both die 1 and die 2 have white faces that sum to 9.

      Tommy chooses die 1 and repaints 3 from white to red, and 4 from red to white, giving (with the repainted faces indicated in braces):

      die 1: blue = 1,5; red = 2,{3}; white = {4},6
      die 2: blue = 2,6; red = 1,3; white = 4,5
      die 3: blue = 3,4; red = 5,6; white = 1,2

      Tommy then throws 3 whites (totalling 6 to 10), and then 3 reds (totalling 5 to 9), the white total being more than the red total.

      throw 1: die 1 = {white 4}; die 2 = white 4; die 3 = white 2; total = 10
      throw 2: die 1 = {red 3}; die 2 = red 1; die 3 = red 5; total = 9

      So Tommy’s calculation of 8 for the reds and 7 for the whites were both out by 2.

      Like

  • Unknown's avatar

    Jim Randell 7:48 am on 14 February 2019 Permalink | Reply
    Tags: by: Philip Spencer   

    Brain-Teaser 451: [Soccer tournament] 

    From The Sunday Times, 4th January 1970 [link]

    The final weeks of the University soccer tournament proved unusually exciting this year. With only four games left, Arts, Biology and Classics had drawn clear and were battling for the honours. The position then was that Biology were top with 32 points, Arts second also with 32 points, and Classics third with 30 points.

    All three teams had scored 70 goals, but Classics had conceded 35 goals giving them an inferior goal average (i.e. ratio of goals for and against) to both Arts and Biology.

    The remaining games required Classics to play both Biology and Arts, who each also had to play one game against another team lower in the division.

    It turned out that after the four games, Arts had failed to score and, although having scored five of the total of ten goals scored, Classics worsened their goal average.

    Consequently, all three teams finished with the same number of points, but Arts won the league from Classics on goal average.

    What were the final goals for and against for each team?

    A prize of £3 was offered for this puzzle.

    This puzzle was originally published with no title.

    [teaser451]

     
    • Jim Randell's avatar

      Jim Randell 9:25 am on 14 February 2019 Permalink | Reply

      Here’s a programmed solution in Python that uses the [[ Football() ]] helper class from the enigma.py library. It runs in 108ms.

      Run: [ @replit ]

      # there are four remaining matches: AC, BC, AX, BX
      
      from enigma import (Football, irange, cproduct, subsets, printf)
      
      # the scoring system
      football = Football(games='wdl', points=dict(w=2, d=1))
      
      # possible scores (no team scored more than 5)
      scores = dict()
      scores['w'] = set((x, y) for x in irange(1, 5) for y in irange(0, x - 1))
      scores['d'] = set((x, x) for x in irange(0, 5))
      scores['l'] = set((y, x) for (x, y) in scores['w'])
      
      # possible outcomes in the remaining 4 games
      for (AC, BC, AX, BX) in football.games(repeat=4):
      
        # table for A, B, C in these four games
        A = football.table([AC, AX], [0, 0])
        B = football.table([BC, BX], [0, 0])
        C = football.table([AC, BC], [1, 1])
      
        # A and B got the same number of additional points, and C got 2 more
        if not (A.points == B.points == C.points - 2): continue
      
        # choose scores for the 4 matches
        for (sAC, sBC, sAX, sBX) in cproduct(scores[x] for x in (AC, BC, AX, BX)):
      
          # in total 10 goals are scored in the 4 matches
          if not (sum(x + y for (x, y) in (sAC, sBC, sAX, sBX)) == 10): continue
      
          # goals for/against A, B, C
          (fA, aA) = football.goals([sAC, sAX], [0, 0])
          (fB, aB) = football.goals([sBC, sBX], [0, 0])
          (fC, aC) = football.goals([sAC, sBC], [1, 1])
      
          # A failed to score, C scored 5 goals
          if not (fA == 0 and fC == 5): continue
      
          # C worsened their goal average: (70 + fC) / (35 + aC) < 70 / 35
          if not (fC < 2 * aC): continue
      
          # A, B started off with 70 goals for and a, b goals against
          # their goal average is better than 70/35, so b < a < 35
          for (b, a) in subsets(irange(1, 34), size=2):
      
            # and we ended with A having the best goal average, then C, then B
            if not ((70 + fA) * (35 + aC) > (70 + fC) * (a + aA)): continue
            if not ((70 + fC) * (b + aB) > (70 + fB) * (35 + aC)): continue
      
            # output solution
            printf("AC={AC}:{sAC} BC={BC}:{sBC} AX={AX}:{sAX} BX={BX}:{sBX} / a={a} b={b}")
            printf("A={A} f={fA} a={aA}", fA=70 + fA, aA=a + aA)
            printf("B={B} f={fB} a={aB}", fB=70 + fB, aB=b + aB)
            printf("C={C} f={fC} a={aC}", fC=70 + fC, aC=35 + aC)
            printf()
      

      Solution: A: for = 70, against = 35; B: for = 73, against = 37; C: for = 75, against = 38.

      There are two scenarios. Assuming 2 points for a win and 1 for a draw, we start with:

      A: points = 32; goals for = 70; goals against = 33; avg = 70/33 = 2.121
      B: points = 32; goals for = 70; goals against = 32; avg = 70/32 = 2.188
      C: points = 30; goals for = 70; goals against = 35; avg = 70/35 = 2.000

      Then the remaining four matches are played. The outcomes are one of:

      (1) A vs C = 0-0; B vs C = 3-5; A vs X = 0-2; B vs X = 0-0
      (2) A vs C = 0-2; B vs C = 3-3; A vs X = 0-0; B vs X = 0-2

      Each of these scenarios has 10 goals scored, none of them by A and 5 of them by C.

      The final table then becomes:

      A: points = 33; goals for = 70; goals against = 35; avg = 70/35 = 2.000
      B: points = 33; goals for = 73; goals against = 37; avg = 73/37 = 1.973
      C: points = 33; goals for = 75; goals against = 38; avg = 75/38 = 1.974

      Like

  • Unknown's avatar

    Jim Randell 11:54 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2935: A palindrome 

    From The Sunday Times, 23rd December 2018

    → See: [ Teaser 2935: A palindrome at Enigmatic Code ]

    [teaser2935]

     
  • Unknown's avatar

    Jim Randell 11:52 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2907: Combinatorial cards 

    From The Sunday Times, 10th June 2018

    → See: [ Teaser 2907: Combinatorial cards at Enigmatic Code ]

    [teaser2907]

     
  • Unknown's avatar

    Jim Randell 11:49 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2784: Three lives 

    From The Sunday Times, 31st January 2016

    → See: [ Teaser 2784: Three lives at Enigmatic Code ]

    [teaser2784]

     
  • Unknown's avatar

    Jim Randell 11:44 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2779: New Year Party 

    From The Sunday Times, 27th December 2015

    → See: [ Teaser 2779: New Year Party at Enigmatic Code ]

    [teaser2779]

     
  • Unknown's avatar

    Jim Randell 11:41 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2773: King Lear III 

    From The Sunday Times, 15th November 2015

    → See: [ Teaser 2773: King Lear III at Enigmatic Code ]

    [teaser2773]

     
  • Unknown's avatar

    Jim Randell 11:37 am on 12 February 2019 Permalink | Reply
    Tags:   

    Teaser 2759: King Lear II 

    From The Sunday Times, 9th August 2015

    → See: [ Teaser 2759: King Lear II at Enigmatic Code ]

    [teaser2759]

     
  • Unknown's avatar

    Jim Randell 10:33 am on 12 February 2019 Permalink | Reply
    Tags: ,   

    Teaser 2503: [Cube reflections] 

    From The Sunday Times, 12th September 2010

    → See: [ Teaser 2503 at Enigmatic Code ]

    This puzzle was originally published with no title.

    [teaser2503]

     
  • Unknown's avatar

    Jim Randell 3:27 pm on 11 February 2019 Permalink | Reply
    Tags:   

    Teaser 2565: Red and black 

    From The Sunday Times, 20th November 2011 [link] [link]

    I have taken 10 cards and written a different digit on each one. Some of the cards are red and the rest are black. I have placed some of the red cards in a row to form a long number. Then I have moved the last card to the front to give me a larger number. In fact this larger number divided by the original one equals a digit on one of the black cards.

    What was the original number?

    [teaser2565]

     
    • Jim Randell's avatar

      Jim Randell 3:53 pm on 11 February 2019 Permalink | Reply

      This puzzle is similar Enigma 1036.

      Here is a Python program that solves it using a similar analysis.

      Run: [ @replit ]

      from enigma import (irange, nsplit, int2base, printf)
       
      # consider multipliers
      for k in irange(2, 9):
        q = 10 * k - 1
       
        # consider n digit numbers
        for n in irange(1, 8):
          p = 10 ** n - k
       
          # consider possible mobile digit d (different from k)
          for d in irange(0, 9):
            if d == k: continue
       
            # the corresponding n digit number x, is...
            (x, r) = divmod(d * p, q)
            if r != 0: continue
            # x has to be n different digits
            s = set(nsplit(x, n))
            if len(s) != n: continue
            # also different from d and k
            if d in s or k in s: continue
       
            printf("{x}{d} x {k} = {d}{x}", x=int2base(x, width=n))
      

      Solution: The original number is 230769.

      So we have:

      230769 × 4 = 923076

      If we allow leading zeros there is a further solution:

      076923 × 4 = 307692

      Like

      • Frits's avatar

        Frits 11:42 am on 29 October 2020 Permalink | Reply

        @Jim,

        Is the phrase “some of the red cards” the reason why “n” cannot be 9?

        from enigma import SubstitutedExpression, seq_all_different, nsplit, div
        
        # the alphametic puzzle
        p = SubstitutedExpression(
          [# solve J * ABCDEFGHI = IABCDEFGH, J is one of the black cards
           
           # the derived formula
           "div(I * (10**N - J), (10 * J - 1)) = ABCDEFGH",
           # all different numbers
           "seq_all_different(nsplit(ABCDEFGH) + (I, J))",
           
           "len(str(ABCDEFGH)) = N"
          ],
          answer="10 * ABCDEFGH + I, J, I * 10**N + ABCDEFGH",
          verbose=0,
          d2i=dict([(k, "IJN") for k in {0,1}]),
          distinct="",   # allow variables with same values
          #reorder=0,
        )
        
        # Print answer
        for (_, ans) in p.solve():
          print(f"{ans[0]} x {ans[1]} = {ans[2]}")
        
        # 230769 x 4 = 923076
        

        Like

  • Unknown's avatar

    Jim Randell 8:27 pm on 7 February 2019 Permalink | Reply
    Tags:   

    Teaser 2942: What do points make? 

    From The Sunday Times, 10th February 2019 [link] [link]

    In the Premier League table a team’s points are usually roughly equal to their goals scored (Burnley were an interesting exception in 2017-18). That was exactly the case in our football league after the four teams had played each other once, with 3 points for a win and 1 for a draw.

    A ended up with the most points, followed by B, C and D in that order. Fifteen goals had been scored in total, and all the games had different scores. The best game finished 5-0, and the game BvD had fewer than three goals.

    What were the results of B’s three games (in the order BvA, BvC, BvD)?

    [teaser2942]

     
    • Jim Randell's avatar

      Jim Randell 11:38 am on 8 February 2019 Permalink | Reply

      I think this puzzle could have been worded more clearly.

      I took the first part to mean we are looking for situations where each team has exactly the same number of points as the number of goals scored by that team. And that the “best game finished 5-0” means that that game had the most goals scored altogether (i.e. the other games had no more than 4 goals scored in total). I took the fact that all matches had different scores to mean that you couldn’t have (for example) one game with a score of 2-0 and another with a score of 0-2.

      This program uses the [[ Football() ]] helper class from the enigma.py library. It looks for possible games for a team that can give the same number of points as the number of goals scored by that team, and then chooses outcomes for the four teams that satisfy the remaining conditions of the puzzle. It runs in 340ms.

      Run: [ @replit ]

      from itertools import (product, combinations)
      from enigma import (defaultdict, Football, ordered, printf)
      
      # scoring system
      football = Football(games='wdl', points=dict(w=3, d=1))
      
      # possible scores (a 5-0 and then no more than 4 goals in any match)
      scores = dict()
      scores['w'] = set([(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (2, 1), (3, 1)])
      scores['d'] = set([(0, 0), (1, 1), (2, 2)])
      scores['l'] = set((x, y) for (y, x) in scores['w'])
      
      # record possible games by points (= goals for)
      ss = defaultdict(list)
      
      # consider outcomes for three matches for team T against X, Y, Z
      for (TX, TY, TZ) in football.games(repeat=3):
      
        # make the table for team T
        T = football.table([TX, TY, TZ], [0, 0, 0])
      
        # make possible score lines that give "goals for" = "points"
        for (sTX, sTY, sTZ) in product(scores[TX], scores[TY], scores[TZ]):
      
          (fT, aT) = football.goals([sTX, sTY, sTZ], [0, 0, 0])
      
          if not (fT == T.points): continue
      
          ss[fT].append((sTX, sTY, sTZ))
      
      # choose possible points (= goals for) for A, B, C, D
      for (pA, pB, pC, pD) in combinations(sorted(ss.keys(), reverse=1), 4):
      
        # but points = goals for, and the total number of goals is 15
        if not (pA + pB + pC + pD == 15): continue
      
        # choose matches for B
        for (BA, BC, BD) in ss[pB]:
      
          # B vs D has less than 3 goals scored
          if not (sum(BD) < 3): continue
      
          # choose matches for A
          for (AB, AC, AD) in ss[pA]:
            if not (AB == BA[::-1]): continue
      
            # choose matches for C
            for (CA, CB, CD) in ss[pC]:
              if not (CA == AC[::-1] and CB == BC[::-1]): continue
      
              # check matches for D
              if not ((AD[::-1], BD[::-1], CD[::-1]) in ss[pD]): continue
      
              # all games have different scores
              s = set(ordered(*x) for x in (AB, AC, AD, BC, BD, CD))
              if not (len(s) == 6): continue
      
              # there is a 5-0 game
              if not ((0, 5) in s): continue
      
              printf("AB={AB} AC={AC} AD={AD} BC={BC} BD={BD} CD={CD}, A={pA} B={pB} C={pC} D={pD}")
      

      Solution: The scores in B’s games are: B vs A = 1-2; B vs C = 2-2; B vs D = 1-0.

      It turns out that the fact that there is a 5-0 game means that there are only 10 goals to distribute between the remaining 5 matches, and there are no further solutions if games with more than 4 goals scored are considered, so it is enough to know that there is a 5-0 score.

      If we allow “mirror” scores (e.g. one game with a score of 2-0 and another with a score of 0-2), then there are no further solutions either. (Although if we allow repeated scores then there are additional solutions).

      If we relax the conditions that the number of points is exactly the same as the number of goals scored then there are multiple solutions, even if they must be within 1 of each other.

      Like

c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel
Design a site like this with WordPress.com
Get started