3なしで数える


45

バックグラウンド

私が小学校にいたときは、数学クラスで次のようなゲームをしていました。

すべての子供は大きな輪になって、1から順番に数えます。

ただし、カウント中は次の番号をスキップする必要があります。

  • 3の倍数である数字。
  • 10進数表現で3を持つ数字。

子供が言うべき最初の15の数字は

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

誰かが番号を間違えた場合(シーケンスに含まれていない番号を言う場合、または番号をスキップした場合)は、サークルから削除されます。これは、子供が1人だけになるまで続きます。

仕事

あなたはこのゲームが苦手なので、カンニングをすることにします。シーケンスの数を指定すると、シーケンスの次の数を計算するプログラムまたは関数を作成します。

プログラムが入力251まで正しく機能し、アルゴリズムが任意の大きな入力に対して機能する場合、言語のネイティブな数値型を使用して表現できない数値を処理する必要はありません。

入力および出力は、任意の便利なベースを使用できます。

コードを隠す必要があるため、できるだけ短くする必要があります。実際、これはであるため、バイト単位の最短コードが優先されます。

テストケース

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

5
私たちは...このような課題を持っていたような気がします
コナー・オブライエン

5
7私が演奏したときは常にスキップされていましたが、代わりに次の番号に行くのではなく、何か他のことを言うでしょう。
mbomb007

12
@ mbomb007:プレイしたとき、あなたはサークルから削除されません。代わりに、あなたは飲むでしょう。しかし、それは小学校ではありませんでした。とにかく、特に最初の1時間後、80を超えることはほぼ不可能でした。
トマス


4
@ mbomb007:それはあなたが飲んでいるものの証拠に依存するでしょう。
トマス

回答:


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でとても美しいです:)
エミグナ

3
@Emigna基本的にはチャレンジを直接説明しているため、ゴルフのように感じることはほとんどありません。それはその言語での多くの答えの場合です:)
16年

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

私はそれを理解し始めていると思う...私の悪い
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はおそらく最もスマイリーが多いプログラミング言語です。
アダム16

8

Python 2、73 66 43バイト

xnorに2つの変数を使用してばかげていると言ってくれたことに感謝します。MitchSchwartzにも感謝します。

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

1
2変数の更新は非常に複雑に見えます。あなただけが必要だと思いますx=input()+1 while'3'[:x%3]in`x`:x+=1 print x
xnor

@xnor、そうそうばかげた私はなぜそうしたのかわからない
ダニエル

で開始しx=~input()、加算ではなく減算して印刷することにより、1バイト改善されました-x
ミッチシュワルツ

1
@Artyerそれは、その編集で導入された3つの間違いのうちの1つだけです。
ミッチシュワルツ

1
@Dopapp現在のリビジョン(スペースなし)は43バイトですか?mothereff.in/...
Artyer


7

Perl、19バイト

18バイトコード+の1 -p

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

使用法

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

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

1
@ dan1111それはPerlです、あなたは何を期待していましたか?明快さ?
エリックアウトゴルファー16年

1
@EriktheGolferなに?これはまさに「自己文書化コード」の定義です。

@ dan1111 Perlを知っているようです。有名な奇妙さのため、Perlがどのように機能するのかはわかりません。
エリックアウトゴルファー16年

@ dan1111ありがとう!それがどれほど短いかがわかって、とても満足しています!
ドムヘイスティングス

1
@DomHastingsさて、PPCGでは、Perlをトップレベルの奇妙さ、Jelly / Actually / O5AB1Eをトップレベルの混乱として扱います。そのとき、このチャレンジを見たことがないようです:)
エリックアウトゴルファー

6

Java 8、57 56 55 50バイト

1バイトの@Numberknotに 感謝5バイトの@Kevin Cruijssenに感謝

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、保存し$aforループを開始します。条件のいずれかながらループが起こって保持し$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に出力するのではなく)値を返すことが許可されているので、のn代わりにを使用することで5バイト節約できますcat(n)
rturnbull

4

パイソン2、49の 44 42バイト

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

他のPythonエントリはこれに勝っています(編集:これ以上:-Dではありません)が、再帰的なアプローチが好きなので、投稿しました。これを短くするのを手伝ってくれたMitch SchwarzとErik the Golferに感謝します。


1
Python 2でこれを行うことができますf=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x。Python 3を保持したい場合は、最後x+1までゴルフし-~xてスペースを削除できます。
エリックアウトゴルファー16年

@EriktheGolferありがとう!それはPython 2に変更します。
0WJYxW9FMN

42秒:f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~xおよびf=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;};

t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x; Visual Studio で再帰的にする場合、43に減らすことができます。変数を定義してnullに設定Func<int, int> t = null;し、次の行で再帰関数を定義するだけです。
Grax32

問題は、再帰的にすると、関数と型の定義をカウントする必要があることです。
モーガンスラップ

これらのガイドラインを見に行くことができる場所はありますか?ここでC#のゴルフはわかりにくいと思います。
Grax32

@Grax基本的に、非再帰関数の場合の名前への割り当てを除いて、コードの実行に必要なコードを含める必要があります。残念ながら、具体的なガイドラインがどこにあるかはわかりません。
モーガンスラップ

@MorganThrappは49バイトの再帰で私のc#の答えをチェックしてください:)
リー




2

ルビー、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            %;_
""""_""""""""{;;'

オンラインでお試しください!

Labyrinthは2次元のスタックベースのプログラミング言語であり、ジャンクションでは、方向はスタックの最上部によって決定されます(正の方向は右、負の方向は左、ゼロはまっすぐになります)。このプログラムには2つのメインループがあります。1番目は整数入力を3で変更し、0の場合は増分します。2番目は最後の桁が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

@ user59178関数は$ iを返す必要があると仮定しました
Xanderhall

ほとんどの場合、正しいものが与えられ、受け取られる限り、入力と出力がどのように行われるかに関してかなり柔軟です。また、他の言語での回答を見ると、ほとんどが標準出力に印刷することを選択します。
user59178

でバイトを保存strpos(_.$i,'3')
アレックスハワンスキー

得ている1つのバイト%3<1を有するもの、51代わりに'3'、2つの有するstrstr($i)代わりのstrpos(_.$i)スワッピングによって及び別の2 |番目のバージョンでオペランドを:<?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;- > 48バイト
タイタス

2

PHP、47 41バイト

Xanderhallに触発されたが、最新のアイデアがついに自分の答えを正当化した。

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

または

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

これは、入力もシーケンスからであるという事実を利用しています:For $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|⍺}

オンラインでお試しください!

-6Adá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 Extended)23 17 バイトSBCS

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

オンラインでお試しください!

アダムに感謝します。-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でmoduloedとき、私は次のように、条件と何かの空想を行うには期待していた残りの部分を持っていない入力よりも第1の数が多い検索します!/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

網状、30バイト

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

オンラインでお試しください!

説明

1:初期化

in v

これにより、inputがnアンバーに変換され、その後ダウンします(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変数は単に増加するだけでなく、感謝しています。
エリックアウトゴルファー

1

Clojure、73バイト

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

n3で割り切れるか、文字列表現に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)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.