*、/、+、-、%演算子を使用せずに数値を3で除算する


48

SO(スポイラーアラート!)でこの質問を引用:

この質問は、Oracleのインタビューで尋ねられました。

*、/、+、-、%、演算子を使用せずに数値を3で除算するにはどうすればよいですか?

番号は署名されている場合と署名されていない場合があります。

タスクは解決可能ですが、最短のコードを記述できるかどうかを確認してください。

ルール:

  • 必要な整数除算を実行します(/3
  • 非テキストベースの演算子を使用しないでください*/+-、または%(またはその等価物、など__div__またはadd())。これは、i++またはのような演算子のインクリメントとデクリメントにも適用されますi--。文字列の連結とフォーマットに演算子を使用しても問題ありません。これらの文字をさまざまな演算子(-負の数の単項演算子など)に使用したり*、Cでポインターを表すことも同様に問題ありません。
  • 入力値は、正と負の両方の任意の大きさ(システムが処理できるもの)にすることができます
  • 入力は、STDINまたはARGVに入力するか、他の方法で入力できます
  • 上記を実行できる最短のコードを作成します

1
正の場合、結果はどのように丸められるべきですか?負の場合
dfeuer

回答:


15

J、45 44 10文字

".,&'r3'":

ネガで動作します:

".,&'r3'": 15
5
   ".,&'r3'": _9
_3
   ".,&'r3'": 3e99
1e99

": -テキストとしてフォーマット

,&'r3'- r3最後に追加

". -文字列を実行します、例えば 15r3


1
あなたがそうすればうまくいきます3 3 3 #: 9。3進数の長さを知る必要があるようです。_3]\i.また、何かの出発点として考えられますが、ここでのソリューションよりも短いかどうかはわかりません。現状の問題#_3]\i.は、常に切り捨てるのではなく切り上げることです。
ガレス

1
たぶん##~3=_3#\i.11文字ですか?
ガレス

1
実際、を使用して10文字まで縮小できます##~0 0 1$~
ガレス

1
フックを使用して縮小できますが、3#.}:(#:~$&3)それでも長くなり、負の数の問題は修正されません。
ガレス

1
はい、あなたはどちらかを使用することができます電源機能 ^:アジェンダを @.ためifたりif...else、交換。この場合@.、「 `」文字(J語の動名詞)で接続された2つの動詞を使用して、条件に基づいてどちらかを選択できる場合があります。
ガレス

56

C、167503724710

これが私の問題の解決策です。厳格なコードのゴルフ大会で優勝する可能性は低いと思いますが、組み込みの除算機能を間接的に呼び出すためのトリックは一切使用せず、ポータブルCで記述されています(元のStack Overflowの質問のとおり)、完全に機能します負の数の場合、コードは非常に明確で明示的です。

私のプログラムは、次のスクリプトの出力です。

#!/usr/bin/env python3
import sys

# 71
sys.stdout.write('''#include <stdint.h>
#include <stdio.h>
int32_t div_by_3(int32_t input){''')

# 39 * 2**32
for i in range(-2**31, 2**31):
    # 18 + 11 + 10 = 39
    sys.stdout.write('if(input==%11d)return%10d;' % (i, i / 3))

# 95
sys.stdout.write(r'''return 7;}int main(int c,char**v){int32_t n=atoi(a[1]);printf("%d / 3 = %d\n",n, div_by_3(n));}''')

文字数:71 + 39 * 2 ** 32 + 95 = 167503724710

ベンチマーク

これにかかる時間と使用するメモリ量を尋ねられたので、いくつかのベンチマークを示します。

  • スクリプトの実行時間— ./test.py | pv --buffer-size=1M --average-rate > /dev/null約30秒間実行すると、約14.8 MB / sのレートが得られます。出力レートはほぼ一定であると合理的に仮定できるため、完了までの実行時間は約167503724710 B /(14.8 * 1048576 B / s)≈10794 sである必要があります。
  • コンパイル時間— TCCコンパイラは、Cコードを29.6 MB / sでコンパイルすると主張しています。これにより、コンパイル時間が167503724710 B /(29.6 * 1048576 B / s)≈5397 sになります。(もちろん、これはスクリプトを使用してパイプラインで実行できます。)
  • コンパイル済みコードのサイズ—を使用して推定しようとしましたが./test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/nulltccソースファイル全体を読み込むまで何も出力されないようです。
  • 実行するメモリ使用量—アルゴリズムは線形であるため(また、tccは複数行にわたって最適化しないため)、メモリオーバーヘッドは数キロバイトにすぎません(もちろん、コード自体は別です)。

22
これはハードコーディングの縮図です。++++++++++
ジョーZ.

4
そうは言っても、160 GBのソースファイルを提供して、コンパイルしてテストするように頼んだら、きっとあなたはおかしなように見えるでしょう。
ジョーZ.

16
上司が-+ / *%なしで3による除算を計算するように要求した場合、彼はおかしいと思います。
ミカエルメイヤー14年

まだ、a[b]の構文糖衣であり*(a + b)、これは追加を行います。
コンラッド

12
@NicolasBarbulesco Stack Exchangeの回答にはサイズ制限があります。
ティムテック14年

38

ルビー28

b=->n{n.to_s(3).chop.to_i 3}

3で除算するには、基数3の末尾のゼロを削除するだけです。 120 -> 11110 -> 1111 -> 40

ネガで動作します:

ice distantstar:~/virt/golf [349:1]% ruby ./div3.rb
666
222
ice distantstar:~/virt/golf [349]% ruby ./div3.rb
-15        
-5

ルビー、60 45

または、ベース変換を使用しない場合:

d =-> n {x = n.abs; r =(0..1.0 / 0).step(3).take(x).index x; n> 0?r:-r}

d=->n{(r=1.step(n.abs,3).to_a.size);n>0?r:-r}

1
ベースコンバージョンなしの代替には、禁止された/オペレータがにFloat::INFINITYなりました1.0/0。Ruby 2.1では、を削除(0..1.0/0).step(3)して0.step(p,3)を削除できます/。より大きな問題は、否定を-r使用-することです。に変更-rするに~r.predは5文字かかり、減算演算子なしで1を減算するにはInteger#predを乱用します。
カーニグ


18

JavaScript、56

alert(Array(-~prompt()).join().replace(/,,,/g,1).length)

長さの文字列になりn、繰り返しの,Sと置き換えを,,,しに1。次に、文字列の結果の長さを測定します。(願わくば単項式-が許可されています!)


+1それが負の値では動作しません
フランチェスコキャスラ

ええと、質問...これはどのようにカウントされますか?-否定演算子を使用します。
パトリックロバーツ

@Patrick私は減算を意味しないように仕様を取った-あなたがしたい場合、あなたは置き換えることができ-~parseInt()
ケーシーチュー

@CaseyChuによって返される値は-~prompt()より大きい1ですparseInt(prompt())。どのように対処するかわかりません。
パトリックロバーツ

alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
ケーシーチュー

16

Python、41 38

print"-"[x:]+`len(xrange(2,abs(x),3))`

xrange すぐに大量の(Cのlongと同じだと思う)を処理できるようです。

>>> x = -72
-24

>>> x = 9223372036854775806
3074457345618258602

2
10/33、ない4.等しい
ジョエル・コルネット

実行print" -"[x<0]+`39個の文字にそれを剃るうlenの(範囲(2、ABS(X)、3))
ジョエルコルネット

golfexchangeのコメントのフォーマットは台無しです。私は囲むためにバッククォートを使用の上でlen()の省略形としてrepr()
ジョエル・コルネット

更新しました。rangeリストを実際に作成するため、使用できません。xrangeふりをするだけなので、時間/メモリを無駄にせずに膨大な数を処理できます。
-grc

2
Python 3のふりをしてください;)私は単一の文字スライスbtwが好きです。
ジョエルコーネット

11

ハスケル、90 106

d n=snd.head.dropWhile((/=n).fst)$zip([0..]>>=ν)([0..]>>=replicate 3>>=ν);ν q=[negate q,q]

無限(遅延)ルックアップリストを作成し、[(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...]一致しないすべての要素をトリミングしn/=Haskellでは不等式です)、一致する最初の要素を返します。

負の数がない場合、これははるかに簡単になります。

25 27

(([0..]>>=replicate 3)!!)

nリストのth要素を返すだけ[0,0,0,1,1,1,2, ...]です。


3
OO私はその2番目の解決策を考えたことはありません。私はpythonでそのような何かを実装することができるかもしれない
アコライト

8

C#、232バイト

私の最初のコードゴルフ...そして、C#がなかったので、ここで試していない別の方法を試してみたかったので、試してみようと思いました。ここの他のいくつかのように、非負数のみ。

class l:System.Collections.Generic.List<int>{}class p{static void Main(string[] g){int n=int.Parse(g[0]);l b,a=new l();b=new l();while(a.Count<n)a.Add(1);while(a.Count>2){a.RemoveRange(0,3);b.Add(1);}System.Console.Write(b.Count);}}

非ゴルフ

class l : System.Collections.Generic.List<int>
{ }
class p
{
    static void Main(string[] g)
    {
        int n = int.Parse(g[0]);
        l b, a = new l();
        b = new l();
        while (a.Count < n) a.Add(1);
        while (a.Count > 2)
        {
            a.RemoveRange(0, 3);
            b.Add(1);
        }
        System.Console.Write(b.Count);
    }
}

2
約5年後..からスペースを削除することで1バイト節約できます。string[] gそれを次のように変換しますstring[]g
Metoniem

「 - )(、または%(または、div要素としてそれらの等価物、または追加するのですが、非テキストベースの演算子*、/、+を使用しない」 -引用-あなたは等価で使用していない.Add
ジョナサンFRECH

@JonathanFrechこのaddメソッドは2つの数値では機能せず、コレクションに値を追加するだけです
無知の実施

7

Perl(26 22)

$_=3x pop;say s|333||g

このバージョンは(Perl)Perlの正規表現エンジンを使用します。最後のコマンドライン引数として数値を読み取り(pop)、3この長さのsの文字列を構築します("3" x $number)。正規表現置換演算子(s///、ここではパズルのルールのために異なる区切りg文字とlobalフラグを使用して記述)は、空の文字列で3文字を置換し、置換数を返します。置換数は、3で整数で割った入力数です。なしでも記述できます3が、上記のバージョンはより面白そうです。

$ perl -E '$_=3x pop;say s|333||g' 42
14

2
@memoweよろしくお願いします!を実行することで、さらに数文字(4)節約できます$_=3x pop;say s|333||g
ドムヘイスティングス14年

2
入力が0、1、または2の場合、空の文字列が出力されます。0を印刷する必要がある場合、さらに3文字(合計25)が必要です'$_=3x pop;say s|333||g||0。99999999のような大きな数値では遅くなり、負の数値では機能しません。
カーニグ

1
-pコマンドラインで使用すると、次の操作を実行できます。0、1 $_=3x$_;$_=0|s|...||g、または2つの入力のカバレッジを含めて、合計22回。
Xcali

6

C、160文字

ルックアップテーブルを使用した文字単位の長い除算ソリューション。つまり、文字列atoi()またはprintf()を使用せずに、10を基数とする整数と整数の間で変換します。

出力には、先頭にゼロが含まれることがあります-その魅力の一部です。

main(int n,char**a){
char*s=a[1],*x=0;
if(*s==45)s=&s[1];
for(;*s;s=&s[1])n=&x[*s&15],x="036"[(int)x],*s=&x["000111222333"[n]&3],x="012012012012"[n]&3;
puts(a[1]);
}

注意:

  • 配列アクセスを悪用して追加を実装します。
  • clang 4.0でコンパイルすると、他のコンパイラーがbarfする可能性があります。

テスト:

./a.out -6            -2
./a.out -5            -1
./a.out -4            -1
./a.out -3            -1
./a.out -2            -0
./a.out -1            -0
./a.out 0             0
./a.out 1             0
./a.out 2             0
./a.out 3             1
./a.out 4             1
./a.out 5             1
./a.out 6             2
./a.out 42            14
./a.out 2011          0670

6

Python 42

int(' -'[x<0]+str(len(range(2,abs(x),3))))

Iveがここに投稿したすべてのソリューションが小数を切り捨てたので、ここでそれを行うソリューションです。

Python 50 51

int(' -'[x<0]+str(len(range([2,0][x<0],abs(x),3))))

Pythonはフロア分割を行うため、これを実装する私のソリューションを次に示します。

入力整数は変数xにあります。

Python 2.7でテストされましたが、3でも動作すると思われます。


+1負の値の状況の両方の選択肢を提供するため。すでに非常に多くの答えがあるので、私は仕様を調整して1つまたは他のオプションを除外しませんが、それ-3がに対する正しい答えであることに個人的に同意し-10/3ます。
ガフィ

pythonのフロア分割を気にする人のために:python-history.blogspot.com/2010/08/…–
マット

2番目のソリューションの乗算と減算は何ですか?
ブースビー

@boothby 2番目のソリューションは、フロア分割を実装します。負の数にはrange(0、abs(x)、3)を、正の数にはrange(2、abs(x)、3)をしたかった。それを行うために、私はrange(2 ...を持ち、xが負のとき2を引きます。xが負のときX <0は真、(真)* 2 == 2-
マット

フロアの分割と小数の切り捨ての違いを理解していません。これは負の除算と関係がありますか?
ジョエルコルネット

6

JavaScript、55

alert(parseInt((~~prompt()).toString(3).slice(0,-1),3))

を使用できない場合-1は、次のバージョンに置き換えます~0(ありがとう、Peter Taylor!)。

alert(parseInt((~~prompt()).toString(3).slice(0,~0),3))

1
@ArtemIce One ~は、オペランドのビットを反転するビット単位の演算子です(最初にオペランドを数値に変換します)。これは、文字列を数値に変換する最短の方法です(私の知る限り)。
Inkbug

1
文字列解析/変換の使用は不正行為だと感じます.a)ビット単位の操作と比較して非常に複雑で高価なプロセス、b)禁止された演算子を内部で使用し、c)ホームロールソリューションよりも多くの文字を使用するためです。クイックソートを実装するように求められたときに組み込みソートを使用すると、人々が不機嫌になる方法のようなもの。
ワグ

1
@Samまた、~~とは対照的に整数に変換し+ます。
Inkbug

1
@Wug codegolfであるため、タスクで指定されていない限り、効率は問題ではありません。
-defhlt

3
さまざまな拠点を活用するための+1。私のお気に入りのJavaScriptゴルフテクニックの1つです。
DocMax

6

C 83文字

除算する数値はstdinを介して渡され、終了コードmain()(CMDの%ERRORLEVEL%)として返されます。このコードは、最適化がオンになっていない場合、最後の割り当て値をreturnステートメントとして処理するという点で、MinGWの一部のバージョンを悪用します。おそらく少し減らすことができます。に適合するすべての数字をサポートint

単項否定(-)が許可されていない場合:(129)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:I(~a);for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?I(~c):c;}

単項否定は場合IS許可:(123)

I(unsigned a){a=a&1?I(a>>1)<<1:a|1;}main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=I(I(I(a))))c=I(c);b=b<0?-c:c;}

編集:ugorenは私に-〜は増分であると指摘しました...

83単項否定が許可されている場合の文字:D

main(a,b,c){scanf("%i",&b);a=b;a=a<0?a:-a;for(c=0;a<~1;a=-~-~-~a)c=-~c;b=b<0?-c:c;}

単項否定が許可されている場合、x+3です-~-~-~x
ウゴレン

有難うございます。なぜそれが私に起こらなかったのかはわかりません。私はあなたが単刀直入にスタックすることができるとは思わなかったと思います。
カスライ

5

C、139文字

t;A(a,b){return a?A((a&b)<<1,a^b):b;}main(int n,char**a){n=atoi(a[1]);for(n=A(n,n<0?2:1);n&~3;t=A(n>>2,t),n=A(n>>2,n&3));printf("%d\n",t);}

コマンドライン引数として数値で実行

  • 負数と正数の両方を処理します

テスト:

 ./a.out -6            -2
 ./a.out -5            -1
 ./a.out -4            -1
 ./a.out -3            -1
 ./a.out -2            0
 ./a.out -1            0
 ./a.out 0             0
 ./a.out 1             0
 ./a.out 2             0
 ./a.out 3             1
 ./a.out 4             1
 ./a.out 5             1
 ./a.out 6             2
 ./a.out 42            14
 ./a.out 2011          670

編集:

  • ローカル変数を削除するために追加(A)をシャッフルすることで10文字を保存しました。

1
よくできました。私は少しいじってベストを尽くして239に到達しました。あなたの周りに頭を出すことができません。A私の関数はn番のビットiをチェックするだけです。C標準では型宣言の省略が許可されていますか、それともコンパイラーのことですか?
潮ona

1
Cは、指定されていない場合はintと見なします。
ワグ

5

ZSH — 31 20/21

echo {2..x..3}|wc -w

負の数の場合:

echo {-2..x..3}|wc -w

負の数の場合(ZSH + bc)—62 61

私はおそらく2つのプログラムを私の答えとして与えるべきではないので、数字の任意のサインに対して機能するものを以下に示します。

echo 'obase=10;ibase=3;'`echo 'obase=3;x'|bc|sed 's/.$//'`|bc

これは、Artem Iceの答えと同じベース変換トリックを使用します


5

C、81 73文字

非負数のみをサポートします。

char*x,*i;
main(){
    for(scanf("%d",&x);x>2;x=&x[~2])i=&i[1];
    printf("%d",i);
}

アイデアは、ポインタarithemticを使用することです。番号はポインターxに読み込まれますが、ポインターはどこにも指していません。&x[~2]= &x[-3]= x-3は3を減算するために使用されます。これは、数値が2 iを超える限り繰り返されます。これが行われた回数をカウントします(&i[1]= i+1)。


コードを理解しようとして、誰かが光を放ちましたか?ありがとう
コンフイ

@Chui、説明を追加。
ウゴレン

@ugorenは、私が理解している限り、printf( "%d")が16進数で保持しているメモリアドレスポインターを出力すべきではないのですか。なぜ整数を出力するのですか?またはchar * iはデフォルトでメモリアドレス0を指すように初期化されましたか?ありがとう
コンフイ

5

Java 86 79

整数がyにあると仮定します。

基数3の文字列に変換し、最後の文字(基数3の右シフト「>>」)を削除してから、整数に戻します。

負の数で動作します。

数値yが<3または> -3の場合、0になります。

System.out.print(~2<y&y<3?0:Long.valueOf(Long.toString(y,3).split(".$")[0],3));

コードゴルフに関する初めての投稿。=)だからまだコメントできません。

ヒントについては、Thx Kevin Cruijssen。


私はそれが2年以上前であることを知っていますが、あなたはいくつかの部分をゴルフすることができます:&&to &、および2x Integerto Long。(また、なぜ、~2代わりに使用するの-3ですか?それらは同じバイトカウントです。)
ケビンCruijssen

1
@KevinCruijssen久しぶりに最初の投稿を編集するのは懐かしいです。〜2のほうが良かったと思う理由があまりわかりませんでした。
ベクトル化された

2
@KevinCruijssenよく、チャレンジはあなたがを使用することを許可されていないと言いますが-、それが単項否定の対象となるかどうかはわかりません。
FlipTack

@FlipTackああ、あなたは完全に正しい。その場合、私がそれを言ったことを忘れてください。:)
ケビンクルーイッセン

4

Python2.6(29)(71)(57)(52)(43)

z=len(range(2,abs(x),3))
print (z,-z)[x<0]

print len(range(2,input(),3))

編集-負の整数も処理しなければならないことに気付きました。後で修正します

Edit2-修正済み

Edit3-Joel Cornettのアドバイスに従って5文字保存

Edit4-入力は必ずしもSTDINまたはARGVからのものである必要はないため、stdinから入力を受け取らないことで9文字を節約しました


先に進むabs()
-defhlt

短縮print z if x==abs(x) else -z
ジョエルコーネット

さらに良い、print (z,-z)[x<0]
ジョエルコーネット

@ArtemIceありがとう、上記の別の答えを読んだ後にそれを使用できることに気づいただけです。
elssar

@JoelCornettハミング、それについて知らなかった、ありがとう
-elssar

4

Javascript、47 29

を使用evalして動的に生成し/ます。+追加ではなく、文字列の連結にのみ使用します。

alert(eval(prompt()+"\57"+3))

編集:"\57"代わりに使用String.fromCharCode(47)


-1のためalert(eval(prompt()+"\573"))
麻琴しえる

4

ルビー(43 22 17)

ゴルフだけでなく、優雅さも:)

p Rational gets,3

出力はのようになり(41/1)ます。整数でなければならない.to_i場合は、結果に追加する必要があり、変更to_iするto_fと、floatの出力も取得できます。


1
rationalRuby 1.9.3 ではrequire 行がなくても機能します。括弧を省略すると、もう1つのcharが節約されます。
steenslag

4

TI-Basic、8バイト

勝者?:)

int(mean({Ans,0,0

PS負の数の場合は無限に丸めます(理由についてはこちらを参照)。ラウンドに、代わりにゼロに置き換えint(iPart(いないバイトの変更のため。

テストケース

-4:prgmDIVIDE
              -2
11:prgmDIVIDE
               3
109:prgmDIVIDE
              36

3

Python 2.x、54 53 51

print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))

_配当金はどこにあり、そのように入力されます。

>>> x=-19
>>> print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
- 6

注:インタラクティブインタープリターの使用が許可されているかどうかはわかりませんが、OPによると:「入力はSTDINまたはARGVであるか、他の方法で入力できます」

編集:Python 3用になりました(2.xで動作しますが、タプルを出力します)。ネガで動作します。


Python 3でも動作しますか?
機械式カタツムリ

添え字付けする必要はありません。持って__len__いるだけで十分です。
機械式カタツムリ

len(range(100,1000))900Linuxで3.2.3を提供します。
機械式カタツムリ

これは負の数では機能しません。そして、len(xrange(0,_,3))とにかく短く、大規模な高速です。
-grc

@Mechanicalsnail:要点。認めます。それは3で動作します
ジョエル・コルネット

3

C ++、191

メインおよびインクルードあり、その246、メインおよびインクルードなしの場合は178のみです。改行は1文字としてカウントされます。すべての数値を符号なしとして扱います。mainがunsigned intを返すための警告が表示されないので、公正なゲームです。

初めてのコードゴルフの提出。

#include<iostream>
#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U d(U i){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}U main(){U i;std::cin>>i,std::cout<<d(i);R 0;}

シフトを使用して数値を4で繰り返し除算し、合計を計算します(1/3に収束します)

擬似コード:

// typedefs and #defines for brevity

function a(x, y):
    magically add x and y using recursion and bitwise things
    return x+y.

function d(x):
    if x = 3:
        return 1.
    variable total, remainder
    until x is zero:
        remainder = x mod 4
        x = x / 4
        total = total + x
    if total and remainder both zero:
        return 0.
    else:
        return a(total, d(remainder)).

余談ですが、d mainという名前を付けてchar **を取り、プログラムの戻り値を出力として使用することで、mainメソッドを削除できます。コマンドライン引数の数を3で割った値を切り捨てて返します。これにより、その長さは宣伝された1911年になります。

#define R return
typedef unsigned int U;U a(U x,U y){R y?a(x^y,(x|y^x^y)<<1):x;}U main(U i,char**q){if(i==3)R 1;U t=i&3,r=i>>=2;t=a(t,i&3);while(i>>=2)t=a(t,i&3),r=a(r,i);R r&&t?a(r,d(t)):0;}


3

PowerShell 57または46

%PowerShellのforeach演算子として使用する57文字で、モジュロではありません。このソリューションは、正または負の整数を受け入れることができます。

(-join(1..(Read-Host)|%{1})-replace111,0-replace1).Length

*文字列の繰り返し演算子として許可されている場合、46文字で、乗算ではありません。このオプションでは、入力値として正の整数が必要です。

("1"*(Read-Host)-replace111,0-replace1).Length

戻ってきたら、バグ修正を投稿しました。あなたが私に私のものを削除し、変更をあなたのものに取り入れたいなら、私に知らせてください。
ヴェスカー

3

R

これらは正の整数でのみ機能します:

max(sapply(split(1:x,1:3), length))
# Gives a warning that should be ignored

または:

min(table(rep(1:3, x)[1:x]))

または:

length((1:x)[seq(3,x,3)])

または:

sum(rep(1,x)[seq(3,x,3)])

[[編集]]そして見苦しいもの:

trunc(sum(rep(0.3333333333, x)))

[[EDIT2]]おそらく最高のもの-エリオットGによる上記のmatlabコードに触発されたもの:

length(seq(1,x,3))

私はあなたのwrong sign in 'by' argument
EDIT2

3

SmileBASIC、58 51 36バイト(数学関数なし!)

INPUT N
BGANIM.,4,-3,N
WAIT?BGROT(0)

説明:

INPUT N           'get input
BGANIM 0,"R",-3,N 'smoothly rotate background layer 0 by N degrees over 3 frames
WAIT              'wait 1 frame
PRINT BGROT(0)    'display angle of layer 0

プログラムは背景レイヤーを3フレームにわたってスムーズに移動し、1フレーム後にその合計距離の1/3を移動したときに角度を取得します。

浮動小数点バージョン、38バイト:

INPUT N
BGANIM.,7,-3,N
WAIT?BGVAR(0,7)

説明:

INPUT N           'input
BGANIM 0,"V",-3,N 'smoothly change layer 0's internal variable to N over 3 frames
WAIT              'wait 1 frame
PRINT BGVAR(0,7)  'display layer 0's internal variable

3

Haskell 41 39文字

正および負の整数のフルセットで動作します

f n=sum[sum$1:[-2|n<0]|i<-[3,6..abs n]]

最初に、0からinputまでの3番目の整数ごとに、リスト1または(-1)を作成します(入力の符号に応じて)nabs(n)負の数の場合。

例えば n=8 -> [0,3,6]

次に、このリストの合計を返します。


負の数では機能しません(-3/3は-1ではなく-1です)。
コーマック

負の数でも動作するようにしたが、/を使用できないので、仕様を読んでください。
コーマック

まあ、あなたは私を二度手に入れた。すべて修正済み;)
チャールクルーガー

いいね!ところでfn = sum [sum $ 1:[-2 | n <0] | i <-[3,6..abs n]]で39文字を取得できます
Cormac

2

Clojure、87; ネガで動作します。lazyseqsに基づく

(defn d[n](def r(nth(apply interleave(repeat 3(range)))(Math/abs n)))(if(> n 0)r(- r)))

ゴルフをしていない:

(defn d [n]
  (let [r (nth (->> (range) (repeat 3) (apply interleave))
               (Math/abs n))]
        (if (pos? n)
          r
          (- r))))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.