没有3的计数


45

背景

当我上小学时,我们以前在数学课上玩游戏,内容如下。

所有的孩子围成一个大圈,从1开始轮流计数。

但是,在计数时必须跳过以下数字:

  • 3的倍数的数字。
  • 十进制表示形式为3的数字。

孩子们应该说的前15个数字是

1 2 4 5 7 8 10 11 14 16 17 19 20 22 25

每当有人输入错误的数字(说出顺序不正确的数字或​​跳过出现的数字)时,他就会从圈子中删除。这一直持续到只剩下一个孩子为止。

任务

您在这场比赛中表现不佳,因此决定作弊。编写一个给定序列号的程序或函数,以计算序列的下一个数。

您不必处理无法使用您的语言的本机数字类型表示的数字,只要您的程序在输入251之前可以正常工作,并且您的算法可以在任意大的输入下使用。

输入和输出可以使用任何方便的基础。

由于您必须隐藏代码,因此代码必须尽可能短。实际上,这是,因此以字节为单位的最短代码获胜。

测试用例

  1 ->   2
  2 ->   4
 11 ->  14
 22 ->  25
 29 ->  40
251 -> 254

5
我觉得我们面临着这样的挑战……
Conor O'Brien

5
7当我演奏它时,总是会被跳过,但是您会说些别的话,而不是去排队的下一个数字。
mbomb007 '16

12
@ mbomb007:当我演奏它时,您不会从圈子中删除。相反,您会喝酒。但这不是在小学。无论如何,超过80岁几乎是不可能的,尤其是在第一个小时之后。
tomasz


4
@ mbomb007:那要取决于你喝什么的证据。
tomasz

Answers:


21

Brachylog,10个字节

<.='e3:I'*

在线尝试!

说明

(?)<.                Output > Input
    .=               Assign a value to the Output
    . 'e3            3 cannot be an element of the Output (i.e. one of its digits)
        3:I'*(.)     There is no I such that 3*I = Output

3
这样的答案在Brachylog中是如此美丽:)
Emigna '16

3
@Emigna有时几乎感觉不到打高尔夫球,因为它基本上直接描述了挑战。使用该语言的很多答案就是这样:)
Fatalize

14

JavaScript(ES6),30个字节

f=n=>++n%3*!/3/.test(n)?n:f(n)

索引2和索引3都使用此函数返回数字4
nl-x

1
@ nl-x是,因为4是2和3之后的序列中的下一个数字。它只是序列中的下一个数字。
ETHproductions's

我想我已经开始了解它了……我的错
nl-x

8

J,24个字节

3(]0&({$:)~e.&":+.0=|)>:

直截了当的方法,它只是从输入n向前迭代,直到找到该规则有效的下一个数字。

表格5个表情,$::)0==|,和>:

用法

   f =: 3(]0&({$:)~e.&":+.0=|)>:
   (,.f"0) 1 2 11 22 29 251
  1   2
  2   4
 11  14
 22  25
 29  40
251 254

说明

3(]0&({$:)~e.&":+.0=|)>:  Input: integer n
                      >:  Increment n
3                         The constant 3
 (                   )    Operate dyadically with 3 (LHS) and n+1 (RHS)
                    |       Take (n+1) mod 3
                  0=        Test if equal to 0
             &":            Format both 3 and n+1 as a string
           e.               Test if it contains '3' in str(n+1)
                +.          Logical OR the results from those two tests
  ]                         Right identity, gets n+1
   0&(   )~                 If the result from logical OR is true
       $:                     Call recursively on n+1
      {                       Return that as the result
                            Else act as identity function and return n+1

好吧,J可能是最容易笑的编程语言。
亚当

8

Python 2,73 66 43字节

感谢xnor告诉我使用2个变量使我很傻,也感谢Mitch Schwartz。

x=~input()
while'3'[:x%3]in`x`:x-=1
print-x

1
两变量更新看起来太复杂了。我想你只需要x=input()+1 while'3'[:x%3]in`x`:x+=1 print x
xnor

@xnor,哦,是的,愚蠢的我,我不知道为什么要这么做
Daniel

通过开始x=~input(),减去而不是加法和打印来改善一个字节-x
米奇·施瓦兹

1
@Artyer那只是该编辑中引入的3个错误中的1个。
米奇·施瓦兹

1
@Dopapp当前修订版(无空格)是43个字节吗?mothereff.in/…–
Artyer

7

05AB1E,11个字节

[>Ð3ås3Ö~_#

在线尝试!

说明

               # implicit input
[              # start loop
 >             # increase current number
  Ð            # triplicate
          #    # break loop IF
         _     # logical negation of
   3å          # number has one or more 3's in it
        ~      # OR
     s3Ö       # number % 3 == 0

7

Perl,19个字节

18个字节的代码+ 1 for -p

++$_%3&&!/3/||redo

用法

perl -pe '++$_%3&&!/3/||redo' <<< 8
10

perl -pe '++$_%3&&!/3/||redo' <<< 11
14

1
@ dan1111是Perl,您期望什么?明晰?
暴民埃里克(Erik the Outgolfer)

1
@EriktheGolfer是什么?这就是“自我记录代码”的定义。

@ dan1111看来您认识Perl。由于Perl的怪异之处,我不知道它是如何工作的。
暴民埃里克(Erik the Outgolfer)

@ dan1111谢谢!事实证明这么短很满意!
Dom Hastings

1
@DomHastings好吧,在PPCG中,我们将Perl作为最奇怪的级别,将Jelly / Actually / O5AB1E作为最混乱的级别。看来您还从未见过这样的挑战:)
Egg the Outgolfer

6

Java 8,57 56 55 50字节

感谢@Numberknot提供1个字节 感谢@Kevin Cruijssen提供5个字节

i->{for(;++i%3<1|(i+"").contains("3"););return i;}

这是一个 Function<Integer, Integer>

说明

天真的实现,只是简单地增加直到达到可接受的数量。

测试班

public class CodeGolf {

    public static void main(String[] args) {
        Function<Integer, Integer> countingGame = i->{for(;++i%3<1|(i+"").contains("3"););return i;};
        int val = 1;
        for (int i = 0; i < 10; i++) {
            System.out.print(val + " ");
            val = countingGame.apply(val);
        }
    }

}

测试类别的输出:

1 2 4 5 7 8 10 11 14 16

2
您可以使用|,而不是||
Numberknot

1
@Numberknot我不知道在某些情况下按位运算符可以用作逻辑运算符!谢谢!
苏格拉底凤凰城

1
为什么do-while呢?只是一个普通的for循环更短:i->{for(;++i%3<1|(i+"").contains("3"););return i;}50个字节
凯文Cruijssen

@KevinCruijssen好吧...我想比较whiledo-while,他们两个都给了我相同的分数,但是我喜欢do-while看起来的样子...我没想到要使用for循环...谢谢!
苏格拉底凤凰城

5

Japt,18个字节

°U%3*!Us f'3 ?U:ßU

在线测试

我终于有机会使用ß:-)

这个怎么运作

                    // Implicit: U = input integer
°U%3                // Increment U, and take its modulo by 3.
     !Us f'3        // Take all matches of /3/ in the number, then take logical NOT.
                    // This returns true if the number does not contain a 3.
    *               // Multiply. Returns 0 if U%3 === 0  or the number contains a 3.
             ?U     // If this is truthy (non-zero), return U.
               :ßU  // Otherwise, return the result of running the program again on U.
                    // Implicit: output last expression

5

PowerShell v2 +,46个字节

for($a=$args[0]+1;$a-match3-or!($a%3)){$a++}$a

取输入$args[0],加1,存入$a,开始for循环。当$a-match3(正则表达式匹配)-or $a%3为零(的!值为1)时,条件使循环继续进行。循环只是递增$a++。在循环的最后,我们只是放置$a在管道上,并Write-Output在程序完成时通过隐式发生输出。

例子

PS C:\Tools\Scripts\golfing> 1,2,11,22,29,33,102,251,254|%{"$_ --> "+(.\count-without-three.ps1 $_)}
1 --> 2
2 --> 4
11 --> 14
22 --> 25
29 --> 40
33 --> 40
102 --> 104
251 --> 254
254 --> 256

4

R,46个字节

n=scan()+1;while(!n%%3|grepl(3,n))n=n+1;cat(n)

我认为允许返回一个值(而不是打印到stdout),因此您可以使用just n而不是来节省5个字节cat(n)
rturnbull

4

Python 2,49 44 42字节

f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~x

另一个Python条目击败了此条目(编辑:不再是:-D了),但是我发布了它,因为我更喜欢它的递归方法。感谢Mitch Schwarz和高尔夫球手Erik帮助我缩短了比赛时间。


1
您可以在Python 2中执行此操作f=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x。如果你想保持Python 3中,你可以打高尔夫球,最后x+1-~x并删除空间。
暴民埃里克(Erik the Outgolfer)

@EriktheGolfer谢谢!我将其更改为Python 2,因为它更短。
0WJYxW9FMN

42S:f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~xf=lambda x:f(x+1)if'3'[:~x%3]in`~x`else-~x
米奇施瓦茨

3

Lua,58字节

i=...+1while(i%3==0or(i..""):find"3")do i=i+1 end print(i)


3

C#,56、51字节。

对于C#答案,这简直令人惊讶!

x=>{while(++x%3<1|(x+"").Contains("3"));return x;};

如果使它递归,则可以将其降低到43。t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x; 在Visual Studio中,您只需要定义变量并将其设置为null Func<int, int> t = null;,然后在下一行定义递归函数即可。
Grax32 '16

问题是,如果我使其递归,则必须计算函数和类型定义。
Morgan Thrapp '16

我可以去哪里看看这些准则?我发现C#高尔夫在这里令人困惑。
Grax32 '16

@Grax基本上,除了非递归函数的名称分配外,您还需要包括代码运行所需的任何代码。不幸的是,我不知道在哪里可以找到具体的指导方针。
Morgan Thrapp '16

@MorganThrapp,请检查我的c#答案是否具有49个字节的递归:)

3

Haskell,50 48字节

f n=[x|x<-[n..],mod x 3>0,notElem '3'$show x]!!1

在Ideone上尝试。@Charlie Harding节省了2个字节。

备选:(50个字节)

g=f.(+1)
f n|mod n 3<1||(elem '3'.show)n=g n|1<3=n

1
同样是50个字节:until(\x->mod x 3>0&&notElem '3'(show x))succ.succ
nimi

3

Pyth,11个字节

f&-I`T3%T3h

在线尝试:演示测试套件

说明:

f&-I`T3%T3hQ   implicit Q at the end
f         hQ   find the smallest integer T >= input + 1 which fulfills:
  -I`T3           T is invariant under removing the digit 3
 &                and
       %T3        T mod 3 leaves a positive remainder


2

Ruby,47个字节

i=gets.to_i;i while(i+=1)%3==0||"#{i}"=~/3/;p i

我真的觉得可以继续打下去。


你可以使用i,而不是"#{i}"
Mhmd

2

MATL,14个字节

`Qtt3\wV51-hA~

在线尝试!

说明

`       % Do...while
  Q     %   Add 1. Takes input implicitly in the first iteration
  tt    %   Duplicate twice
  3\    %   Modulo 3
  wV    %   Swap, string representation
  51-   %   Subtract 51, which is ASCII for '3'
  h     %   Concatenate
  A~    %   True if any result was 0. That indicates that the number
        %   was a multiple of 3 or had some '3' digit; and thus a 
        %   new iteration is needed

2

迷宫117个 102字节

?       """""""""""_
):_3    (         0/{!@
;  %;:}_';:_3-_10 1
"  1            %;_
""""_""""""""{;;'

在线尝试!

迷宫是一种基于堆栈的二维编程语言,在交界处,方向由堆栈的顶部确定(正向右,负向左,零向右)。该程序有两个主要循环。第一个修改输入的整数乘以3,如果为0,则递增。第二个重复检查最后一个数字是否为3(减去3并乘以10),然后除以10得到新的最后一个数字。


2

PHP,60 55 54 46字节

感谢@ user59178删除了几个字节,@ AlexHowansky删除了一个字节,@ Titus删除了另外几个字节

for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;

从命令行使用调用-r。当数字为3的倍数或数字为3时循环的天真方法。


1
仅使用从命令行获取输入的程序而不是函数即可节省7个字节:通过在使用时进行for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;赋值也可能会做得更好$i
user59178 '16

@ user59178我以为函数必须返回$ i
Xanderhall '16

在大多数情况下,只要给出和接收正确的东西,问题在输入和输出的完成方式上都非常灵活。此外,查看其他语言的答案时,大多数人选择打印到标准输出。
user59178 '16

使用strpos(_.$i,'3')
Alex Howansky,

通过交换第二个版本中的操作数,用来保存一个字节%3<1,其中一个用51而不是,另外两个'3'strstr($i)而不是strpos(_.$i)和另外两个来保存|<?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;-> 48字节
Titus

2

PHP,47 41字节

Xanderhall的启发,但最新的想法终于证明了自己的答案。

while(strstr($n+=$n=&$argn%3,51));echo$n;

要么

while(strpbrk($n+=$n=&$argn%3,3));echo$n;

这得益于输入也是来自序列的事实:对于$n%3==1,新的模为2。对于$n%3==2,新的模是4-3=1$n%3==0永远不会发生。

与管道一起运行-R在线尝试它们


2

APL(Dyalog Unicode)33 28 27 19 字节SBCS

1∘+⍣{('3'∊⍕⍺)<×3|⍺}

在线尝试!

-6感谢Adám。-8感谢ngn。

旧说明:

1-⍨g⍣((×3|⊢)>'3'∊⍕)∘(g←+∘1)
                       +∘1   curry + with 1, gives the increment function
                             increments the left argument so we do not return the number itself
                    (g   )  assign to "g"
                            compose g with the repeat
                            does parsing the argument to a string...
             '3'            ...contain '3'?
        3|⊢                  residue of a division by 3
         )                 direction (0 if 0, 1 if greater, ¯1 is lower)
     (      >     )          and not (we want the left side to be 1, the right side 0)
   g                        repeat "g" (increment) until this function is true ^
1-⍨                          afterwards, decrement: inversed -

APL(Dyalog扩展)23 17 字节SBCS

1∘+⍣(3(×⍤|>∊⍥⍕)⊣)

在线尝试!

感谢Adám。-6感谢ngn。

旧说明:

0+⍣(3(×⍤|>∊⍥⍕)⊢)⍢(1+⊢)⊢
0                        the left argument (⍺)
 +⍣(3(×⍤|>∊⍥⍕)⊢)         the left function (⍺⍺)
                 (1+⊢)   the right function (⍵⍵)
                             (increments its argument)
                        the right argument (⍵)
                             (just returns the input)
                        under:
                             calls (⍵⍵ ⍵) first, which increments the input
                             also (⍵⍵ ⍺) which gives 1
                             then calls (⍺incremented ⍺⍺ incremented)
                             afterwards, does the opposite of ⍵⍵, and decrements the result
                         fixpoint: repeats the left operation until the right side is truthy
 +                       calls + with incremented and the input (so, 1+input)
   (3(×⍤|>∊⍥⍕)⊢)         right operation
    3                    on its left, "3"
                        on its right, the current iteration
      ×⍤|                divisibility check: × atop |
        |                    starts with 3|⊢ (residue of ⊢/3)
      ×                      then returns the direction (0 if 0, 1 if greater, ¯1 is lower)
          ∊⍥⍕            contains 3:
                           stringifies both its arguments (3 and ⊢)
          ∊⍥                checks for membership
         >               divisibility "and not" contains 3

2

Perl 6的27个25 24字节

{max $_+1...{!/3/&$_%3}}

在线尝试!

查找比输入大的第一个数字,该输入不带3且由3取模时有余数。我希望对此条件做些花哨的操作,例如,!/3/&*%3但不适用于!:(

说明:

{                      }   # Anonymous code block
     $_+1                  # From the input+1
         ...               # Get the series
            {         }    # That ends when
             !/3/            # The number does not contain a 3
                 &           # and
                  $_%3       # The number is not divisible by 3
 max                       # And get the last element of the series

1

C,81字节

f(int n){int m;l:if(++n%3){for(m=n;m>0;m/=10)if(m%10==3)goto l;return n;}goto l;}

1

网状,30字节

in v
?v$>1+d3,qds:3@cQm*
;\$o

在线尝试!

说明

1:初始化

in v

这样会将input转换为number,然后下降(v

2:循环

?v$>1+d3,qds:3@cQm*
   >                 go right!              [n]
    1+               add 1                  [n+1]
      d3,            duplicate and mod 3    [n+1, (n+1)%3]
         qd          reverse and duplicate  [(n+1)%3, n+1, n+1]
           s         cast to string         [(n+1)%3, n+1, `n+1`]
            :3@c     count numbers of "3"   [(n+1)%3, n+1, `n+1`.count(3)]
                Qm*  negate and rotate      [n+1, continue?]
?v                   terminate if continue
  $                  drop continue

3:最终

;\$o
 \$o  drop and output
;     terminate

1

批次,93个字节

@set/pn=
:l
@set/an+=1,r=n%%3
@if %r%==0 goto l
@if not "%n:3=%"=="%n%" goto l
@echo %n%

在STDIN上输入。


1

CJam,19个字节

ri{)__3%!\`'3e=e|}g

线上

说明:

ri{)__3%!\`'3e=e|}g
r                   Get token
 i                  Convert to integer
  {              }  Block
   )                 Increment
    _                Duplicate
     _               Duplicate
      3              Push 3
       %             Modulo
        !            NOT gate
         \           Swap
          `          String representation
           '3        Push '3'
             e=      Count occurrences
               e|    OR gate
                  g While popped ToS is true

如果需要一个较为简单的解释,我会这样做:

ri{)__3%!\`'3e=e|}g
ri                  Get integer
  {              }  Block
   )                 Increment
    __               Triplicate
      3%!            Test non-divisibility with 3
         \           Swap
          `'3e=      Count occurrences of '3' in string repr
               e|    OR gate
                  g While popped ToS is true

1

Pyth,19个字节

JhQW|!%J3/`J\3=hJ;J

测试套件

我敢肯定我可以打高尔夫球...这与我的CJam答案相同。

说明:

JhQW|!%J3/`J\3=hJ;J
  Q                 Evaluated input
 h                  Increment
J                   Assign J to value
       J            Variable J
        3           Value 3
      %             Modulo
     !              Logical NOT
           J        Variable J
          `         String representation
            \3      Value "3"
         /          Count occurrences
    |               Logical OR
               h    Increment
                J   Variable J
              =     Apply function then assign
                 ;  End statement block
                  J Variable J

我发布了一种更短的解​​决方案。不过,这是您使用方法的提示:不要使用变量J。您可以增加Q。如果您做的很聪明,则可以将操作内联到while条件中:W|!%=hQ3/Q \ 3; Q`。
雅库布

抱歉:W|!%=hQ3/`Q\3;Q
Jakube '16

@Jakube变量不仅增加,而且谢谢。
暴民埃里克(Erik the Outgolfer)

1

Clojure,73个字节

(fn c[n](let[m(inc n)](if(or(=(rem m 3)0)(some #(=\3 %)(str m)))(c m)m)))

递归循环while n可以被3整除,或者在其字符串表示形式中包含3。尽管我使用的是未优化的递归,但它能够处理2999999作为输入,因此应该可以。

不打高尔夫球

(defn count-without-3 [n]
  (let [m (inc n)]
    (if (or (= (rem m 3) 0)
            (some #(= \3 %) (str m)))
      (count-without-3 m)
      m)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.