Foobar: Please Pass the Coded Messages

You need to pass a message to the bunny workers, but to avoid detection, the code you agreed to use is… obscure, to say the least. The bunnies are given food on standard-issue plates that are stamped with the numbers 0-9 for easier sorting, and you need to combine sets of plates to create the numbers in the code. The signal that a number is part of the code is that it is divisible by 3. You can do smaller numbers like 15 and 45 easily, but bigger numbers like 144 and 414 are a little trickier. Write a program to help yourself quickly create large numbers for use in the code, given a limited number of plates to work with.

You have L, a list containing some digits (0 to 9). Write a function solution(L) which finds the largest number that can be made from some or all of these digits and is divisible by 3. If it is not possible to make such a number, return 0 as the solution. L will contain anywhere from 1 to 9 digits. The same digit may appear multiple times in the list, but each element in the list may only be used once.

Languages

To provide a Java solution, edit Solution.java
To provide a Python solution, edit solution.py

Test cases

Your code should pass the following test cases.
Note that it may also be run against hidden test cases not shown here.

Input:
solution.solution([3, 1, 4, 1])
Output:
4311

Input:
solution.solution([3, 1, 4, 1, 5, 9])
Output:
94311

Solution:
python

<span>def</span> <span>to_int</span><span>(</span><span>l</span><span>):</span>
<span>if</span> <span>not</span> <span>l</span><span>:</span>
<span>return</span> <span>0</span>
<span>return</span> <span>int</span><span>(</span><span>""</span><span>.</span><span>join</span><span>([</span><span>str</span><span>(</span><span>d</span><span>)</span> <span>for</span> <span>d</span> <span>in</span> <span>l</span><span>]))</span>
<span>def</span> <span>solution</span><span>(</span><span>l</span><span>):</span>
<span>l</span> <span>=</span> <span>sorted</span><span>(</span><span>l</span><span>,</span> <span>reverse</span><span>=</span><span>True</span><span>)</span>
<span>n</span> <span>=</span> <span>len</span><span>(</span><span>l</span><span>)</span>
<span>s</span> <span>=</span> <span>sum</span><span>(</span><span>l</span><span>)</span>
<span>if</span> <span>s</span> <span>%</span> <span>3</span> <span>==</span> <span>0</span><span>:</span>
<span># already divisible by 3 => use all digits </span> <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>)</span>
<span>elif</span> <span>s</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
<span># check backward if there is a digit that is 1 mod 3 </span> <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
<span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
<span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
<span>i</span> <span>-=</span> <span>1</span>
<span># there must be two digits that each of them is 2 mod 3 </span> <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
<span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
<span>break</span>
<span>i</span> <span>-=</span> <span>1</span>
<span>j</span> <span>=</span> <span>i</span> <span>-</span> <span>1</span>
<span>while</span> <span>j</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>j</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
<span>break</span>
<span>j</span> <span>-=</span> <span>1</span>
<span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>j</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>j</span><span>+</span><span>1</span><span>:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
<span>else</span><span>:</span>
<span># check backward if there is a digit that is 2 mod 3 </span> <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
<span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
<span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
<span>i</span> <span>-=</span> <span>1</span>
<span># there must be two digits that each of them is 1 mod 3 </span> <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
<span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
<span>break</span>
<span>i</span> <span>-=</span> <span>1</span>
<span>j</span> <span>=</span> <span>i</span> <span>-</span> <span>1</span>
<span>while</span> <span>j</span> <span>>=</span> <span>0</span><span>:</span>
<span>if</span> <span>l</span><span>[</span><span>j</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
<span>break</span>
<span>j</span> <span>-=</span> <span>1</span>
<span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>j</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>j</span><span>+</span><span>1</span><span>:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
<span>def</span> <span>to_int</span><span>(</span><span>l</span><span>):</span>
    <span>if</span> <span>not</span> <span>l</span><span>:</span>
        <span>return</span> <span>0</span>
    <span>return</span> <span>int</span><span>(</span><span>""</span><span>.</span><span>join</span><span>([</span><span>str</span><span>(</span><span>d</span><span>)</span> <span>for</span> <span>d</span> <span>in</span> <span>l</span><span>]))</span>

<span>def</span> <span>solution</span><span>(</span><span>l</span><span>):</span>
    <span>l</span> <span>=</span> <span>sorted</span><span>(</span><span>l</span><span>,</span> <span>reverse</span><span>=</span><span>True</span><span>)</span>
    <span>n</span> <span>=</span> <span>len</span><span>(</span><span>l</span><span>)</span>
    <span>s</span> <span>=</span> <span>sum</span><span>(</span><span>l</span><span>)</span>
    <span>if</span> <span>s</span> <span>%</span> <span>3</span> <span>==</span> <span>0</span><span>:</span>
        <span># already divisible by 3 => use all digits </span>        <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>)</span>
    <span>elif</span> <span>s</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
        <span># check backward if there is a digit that is 1 mod 3 </span>        <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
        <span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
                <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
            <span>i</span> <span>-=</span> <span>1</span>
        <span># there must be two digits that each of them is 2 mod 3 </span>        <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
        <span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
                <span>break</span>
            <span>i</span> <span>-=</span> <span>1</span>
        <span>j</span> <span>=</span> <span>i</span> <span>-</span> <span>1</span>
        <span>while</span> <span>j</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>j</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
                <span>break</span>
            <span>j</span> <span>-=</span> <span>1</span>
        <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>j</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>j</span><span>+</span><span>1</span><span>:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
    <span>else</span><span>:</span>
        <span># check backward if there is a digit that is 2 mod 3 </span>        <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
        <span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>2</span><span>:</span>
                <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
            <span>i</span> <span>-=</span> <span>1</span>
        <span># there must be two digits that each of them is 1 mod 3 </span>        <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span>
        <span>while</span> <span>i</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>i</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
                <span>break</span>
            <span>i</span> <span>-=</span> <span>1</span>
        <span>j</span> <span>=</span> <span>i</span> <span>-</span> <span>1</span>
        <span>while</span> <span>j</span> <span>>=</span> <span>0</span><span>:</span>
            <span>if</span> <span>l</span><span>[</span><span>j</span><span>]</span> <span>%</span> <span>3</span> <span>==</span> <span>1</span><span>:</span>
                <span>break</span>
            <span>j</span> <span>-=</span> <span>1</span>
        <span>return</span> <span>to_int</span><span>(</span><span>l</span><span>[:</span><span>j</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>j</span><span>+</span><span>1</span><span>:</span><span>i</span><span>]</span> <span>+</span> <span>l</span><span>[</span><span>i</span><span>+</span><span>1</span><span>:])</span>
def to_int(l): if not l: return 0 return int("".join([str(d) for d in l])) def solution(l): l = sorted(l, reverse=True) n = len(l) s = sum(l) if s % 3 == 0: # already divisible by 3 => use all digits return to_int(l) elif s % 3 == 1: # check backward if there is a digit that is 1 mod 3 i = n - 1 while i >= 0: if l[i] % 3 == 1: return to_int(l[:i] + l[i+1:]) i -= 1 # there must be two digits that each of them is 2 mod 3 i = n - 1 while i >= 0: if l[i] % 3 == 2: break i -= 1 j = i - 1 while j >= 0: if l[j] % 3 == 2: break j -= 1 return to_int(l[:j] + l[j+1:i] + l[i+1:]) else: # check backward if there is a digit that is 2 mod 3 i = n - 1 while i >= 0: if l[i] % 3 == 2: return to_int(l[:i] + l[i+1:]) i -= 1 # there must be two digits that each of them is 1 mod 3 i = n - 1 while i >= 0: if l[i] % 3 == 1: break i -= 1 j = i - 1 while j >= 0: if l[j] % 3 == 1: break j -= 1 return to_int(l[:j] + l[j+1:i] + l[i+1:])

Enter fullscreen mode Exit fullscreen mode

原文链接:Foobar: Please Pass the Coded Messages

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
anything that adds laughter and joy to your life.
不要延迟任何可以给你的生活带来欢笑与快乐的事情
评论 抢沙发

请登录后发表评论

    暂无评论内容