ナインパターン


9

前書き

先日、テレビを見ているときに、この(役に立たない)パターンに出会いました。使用する最初の数字が9だったので、「9パターン」と名付けました。その要点は、数字(xとしましょう)を入力すると、次のようになります。

  • バツ
  • x +(x / 3)[これをyとしましょう]
  • yの 3分の2 [これをzと呼ぶ]
  • z + 1

したがって、このパターン内に9xとして入れると、次のようになります。

  • 9(9
  • 12(9 + 9/3)[9 over 3は3、9 + 3は12]
  • 8(12の 2/3の12)[12の3分の1は4、4 * 2は8]
  • 9(8 + 1は9)

チャレンジ

数値を受け取り、パターンを使用して整数配列を出力する関数を(プログラミング言語で)書いてください。
この擬似コードのように:

function ninePattern(int myInt) returns IntegerArray {  
    int iterationA = myInt + (myInt / 3);  
    int iterationB = iterationA * (2 / 3); 
    int iterationC = iterationB + 1;  
    IntegerArray x = [myInt, iterationA, iterationB, iterationC];  
    return x;  
}

明確化

質問の仕様に関するコメントは議論が活発化しています。このセクションでは、それらのいくつかを明確にすることを目的としています。

「文字よりバイトで数えるほうがいい」

(少なくとも私にとっては)判断しやすいので、私はキャラクターを選びました。もちろん、今は変更できません。(多数の回答が既に投稿されています)

「丸め」

丸めはこの韻に従っています:

5点以上
ならスコアアップ4 点以下なら休ませる

簡単に言えば、4.7または3.85のような場合は、それぞれ5と4に丸めます。

Input => Result
9 => [9, 12, 8, 9]
8 => [8, 11, 7, 8]
6 => [6, 8, 5, 6]
23 => [23, 31, 21, 22]
159 => [159, 212, 141, 142]

ただし、数値が2.3または10.435446のような場合は、それぞれ2と10に丸めます。

「言語サポート」

選択した言語でサポートされていない場合にのみ、関数や配列を自由に使用できます。もしそうなら(たとえそれがあなたの文字数を増やすことになっても)、あなたはそれらを使わなければなりません


1
出力は配列である必要がありますか、それとも数値だけで十分ですか(Pythの回答のように)?
デビッド

2
完全なプログラムまたは関数のみに制限することは自由ですが、デフォルトのメタについての議論があります。これは、将来の課題に対する決定に影響を与える場合に役立つ背景を提供します。デフォルトでは、チャレンジは両方を受け入れ、より多くの言語が競争できるようにします。
trichoplax

1
入力と出力にデフォルトがあります。繰り返しますが、それらをフォローする必要はありません。これは単に通知するためです。
trichoplax

3
-1は、任意の配列および関数の要件を示します。これにより、配列/リスト型または関数を持たない言語が競合するのを防ぎます。
Mego 2016年

4
また、出場者を文字ではなくバイトで採点する必要があります。我々は持っているサンドボックス、それはライブ行く前に、あなたはあなたのポストにフィードバックを得ることができ、。
Loovjo 2016年

回答:


11

MarioLANG、659 621 591 582 556 543 516 458 418 401 352 308 369バイト

丸めは非常に高価です:/

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

;>>[![( [( [( [( [( [<(([!)))!+(((-<>( >((+
:"==#================"===#== #=====""[ "==
)(  -[!)>>[![)  [)[<(!>)[<)) >))) [!!-[!((
 (  )"#="==#======="=#==="=<="=====##==#==<
 +  +>) )-+<>+)[!)+! +))![-[)>[ [([-[![<<:
 +  )-+ )(=""===#==#  ==#===)"=======#=====
 +  >!>)!>  !(- < !:+:))<  ))!((++)))< 
 )  "#"=#===#===" ======" ===#======="
 !
=#========================

これは予想よりも面白かったです。これはおそらく最適ではありませんが、私はそこに到達していると思います。

説明時間:

352バイトバージョンの場合)

最初に引数を取得して出力します。

;
:

十分にシンプル

次に、プログラムの大部分に移動します。除算入力/ 3

;>>[![              [( [( [<result
:"==#======================"======
)   -[!)>>[![        [<((((!   
)   )"#="==#=========="====#
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

これはbrainfuck部門のわずかに変更された変換です

[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]

入力にかかる

n 0 d 0 0 

そしてあなたに返します

0 n d-n%d n%d n/d 

我々は分裂を得た後、私たちは、和得るためにそれを使用してNN / Dをし、それを印刷します

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!
+(  )-+ )  -"====#====#
+   >!>)!  >! -  <
    "#"=#  "#===="
 !
=#

次に、別の除算を行う必要があります:(2 *(n + n / d))/ 3

(2 *(n + n / d)を得るので

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))! 2*2n/d>[   -[![  <
+(  )-+ )  -"====#====# ======"======#====
+   >!>)!  >! -  <            !((++))<
    "#"=#  "#===="            #======"
 !
=#

3でそれを部門に戻します

;>>[![              [( [( [<    !+(((-<
:"==#======================"===)#====="
)   -[!)>>[![        [<((((!    >))) [!(((
)   )"#="==#=========="====#   ="=====#==:
+(  +>) )  +>(+)[!)+))!      )>[   -[![  <
+(  )-+ )  -"====#====#      )"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

その時点ですべてが爆発すると、マリオは永遠にますます大きな数で除算を行う無限ループに陥ります。

そして、最初の分割と2番目の分割を区別する方法が必要であることを修正するには、結局、ああ、喜びがあります。

;>>[![              [( [( [<([!)!+(((-<
:"==#======================"==#)#====="
)   -[!)>>[![        [<((((!))< >))) [!(((
)   )"#="==#=========="====#)="="=====#==:
+(  +>) )  +>(+)[!)+))!!:+:)))>[   -[![  <
+(  )-+ )  -"====#====#======)"======#====
+   >!>)!  >! -  <       +++))!((++))<
    "#"=#  "#====" ===========#======"
 !
=#=================

基本的に、xが

x 0 n d-n%d n%d n/d 

が0の場合、それは最初の部門にいることを意味します

それ以外の場合は、2番目の部門にいます。部門の結果を出力し、1を追加して、もう一度出力します。

そして、出来上がりパイとして簡単。


PPCGへようこそ!
Erik the Outgolfer 2016年

質問によって提供された仕様に丸めません(もちろん、私はあなたの回答を投稿した後で更新しましたが、少なくとも新しい仕様に合うように回答を更新する必要があります)
InitializeSahib

できました。テストケースについて話している間、10を追加して、最初の操作で切り捨てた数値を取得する必要があります。
Ether Frog

9

Emotinomicon 99バイト、33文字

😷😭,😲🆙🆙😼🆙😨😎⏬😎🆙😍➗➕🆙😨😎⏬😎😉✖😍➗🆙😨😎⏬😎😅➕😨

説明:

😷                                 clear output
 😭                                begin quote string
  ,                               
   😲                              end quote string
    🆙                             duplicate top of stack
     🆙                            duplicate top of stack
      😼                           take numeric input
       🆙                          duplicate top of stack
        😨                         pop N and output as a number
         😎                        reverse stack
          ⏬                       pops and outputs top of stack as character
           😎                      reverse stack
            🆙                     duplicate top of stack
             😍                    push 3 to the stack
              ➗                   divide top two elements on stack
               ➕                  add top two elements on stack
                🆙                 duplicate top of stack
                 😨                pop N and output as a number
                  😎               reverse stack
                   ⏬              pops and outputs top of stack as character
                    😎             reverse stack
                     😉            push 2 to the stack
                      ✖           multiply top two elements on stack
                       😍          push 3 to the stack
                        ➗         divide top two elements on stack
                         🆙        duplicate top of stack
                          😨       pop N and output as a number
                           😎      reverse stack
                            ⏬     pops and outputs top of stack as character
                             😎    reverse stack
                              😅   push 1 to the stack
                               ➕  add top two elements on stack
                                😨 pop N and output as a number

3
慣習にとらわれない言語に賛成!:P
user48538

4

MATL、14バイト

Xot4*3/tE3/tQv

オンラインで試す

非常に単純でv、スタックを配列に連結します。Xo整数データ型に変換し、その後のすべての演算は整数演算です。


3
仕様は、最終的な結果だけではなく、配列を返すことです。
Value Ink

3
また、2分未満で削除のフラグが立てられている場合も笑います:D
David

@David D:削除投票を撤回できるとは思いません
Downgoat

@Davidは私の哀悼の意としてあなたの答えに賛成しました:)
InitializeSahib

1
これも関数ではないと確信しています。間違っている場合は修正してください。
Maltysen、2016年

4

チェダー、27バイト

b=8/9*$0
[$0,$0+$0/3,b,b+1]

$0入力変数です。チェダーはゴルフ言語ではありません¯\ _(ツ)_ /¯、また、この挑戦​​の後にチェダーの入力機能が作成されたため、これは競合していません。

非ゴルフ:

IterationB := 8 / 9 * $0  // 8/9ths of the Input
[ $0,                     // The input
  $0 + $0 / 3,            // Input + (Input/3)
  IterationB,             // (see above)
  IterationB + 1          // above + 1
]

1
喜びの涙!これまでになくなった!:D
Conor O'Brien

3

Java、86 82 84 85文字

class c{int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}}

d整数の直後に置かれた文字は、整数をaにしdoubleます。

非ゴルフ:

class c{
    int[] i(int I) {
        int a = I + (I / 3),
            b = (int)(a * (2d / 3d));
        return new int[]{I, a, b, b + 1};
    }
}

クラスがない場合(class c{}長さが8文字)、76文字に縮小されます。

int[]i(int I){int a=I+(I/3),b=(int)(a*(2d/3d));return new int[]{I,a,b,b+1};}

110文字のより正確なバージョン(列挙型では118)- float誰もキャストするためのスペースがないため、sを使用しますMath#round(double)

int[]i(int I){float a=I+(I/3f),b=(a*(2f/3f));return new int[]{I,Math.round(a),Math.round(b),Math.round(b+1)};}

私はピスを学ぶべきだと思います。
user8397947 2016年


1
@dorukayhanおかしい、これをEclipseで実行しようとするとエラーが発生するようです。doubleからintに変換できません。明日問題が何であるかを理解できるかどうかを確認します。
Loovjo 2016年

1
私はコードを修正しました
user8397947

1
わかりましたが、8や10などの入力に対して正しい結果が得られません。最初の加算はI + (I / 3)整数除算を使用しているように適切に機能していません。つまり、小数が破棄され、結果が適切に丸められません。
Frozn、2016年

3

Java、56 80バイト

一部のユーザーが指摘したように、このソリューション(Javaの他の一部のソリューションと同様)はデータを適切に丸めません。だから今私は正しい結果を返すはずの少し長い解決策を提示しています

int[]h(int a){int[]b={a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a};return b;}

または60バイトのラムダバージョン

a->new int[]{a,Math.round(a+a/3f),a=Math.round(a*8f/9),++a}

ゴルフ版

int[]g(int a){int[]b={a,a+a/3,a*8/9,a*8/9+1};return b;}

とゴルフ

int[] g(int a) {
        int[] b = { a, a + a / 3, a * 8 / 9, a * 8 / 9 + 1 };
        return b;
    }

またはラムダとして定義された36バイト

a->new int[]{a,a+a/3,a*8/9,a*8/9+1}


質問で必要な丸めはありません。
Marv 2016年

1
@Marvが言及したように、この質問は正しく機能しません。たとえば、入力8の場合、期待される結果は[8,11,7,8]ですが、[8,10,7,8]です
Frozn

なぜ反対票を投じるのですか?私はそれを修正し、それは今正しく動作していますか?
user902383

修正後の反対投票でごめんなさい。反対投票は現在ロックされているため、回答に何らかの変更を加えない限り、削除することはできません(些細な変更で十分です)
edc65

@ edc65 OK、完了
user902383

2

Java、64バイト

int[]f(int i){return new int[]{i,i+=i/3+0.5,i-=i/3-0.5,i+=1.5};}

ノート

  • これには、必要な丸めの組み込みが含まれています。@ user902383のソリューションと組み合わせると、短くすることができるかどうかはわかりません。

未ゴルフ

int[] f(int i) {
    return new int[]{
            i, 
            i += i / 3 + 0.5, 
            i -= i / 3 - 0.5, 
            i += 1.5};
}

i = 9の出力

[9, 12, 8, 9]


user902383のソリューションと同じですが、これは正しく機能しません。たとえば、期待される8は[8,11,7,8]ですが、期待される6は[6,8,5,6]です。 [6,8,6,7]
Frozn、

3
@Froznこのソリューションも適切に機能しておらず、あなたが与えたテストケースでは、私の古いソリューションと同じ結果が返されますideone.com/LVK8FU
user902383 '25

2

スクラッチ、33バイト

脚本
入力を要求し、a丸められた入力を設定し、セットbcそれぞれの変更を要求し、カンマで区切られた4つの数値すべてを言います。


2

Java 8ラムダ、109 81 79 75文字

なぜなら...あなたが知っている...ジャワでさえゴルフすることができる...

a->{int b=(int)(.5+a*4./3),c=(int)(.5+b*2./3);return new int[]{a,b,c,++c};}

ラムダはクラスに属していません:

class C {  
   static int[] a(int a) {
        int b = (int) (.5 + a * 4. / 3),
            c = (int) (.5 + b * 2. / 3);
        return new int[]{a, b, c, ++c};
    }
}

longは整数型でもあるので、私はlongの使用が許可されていると思います。悲しいことに、整数を正しく丸める必要があるため、「ショート」キャストは機能しません。longを使用することで、丸めの結果をintにキャストする必要がなくなります。

更新

素敵な小さな+ 0.5を使用し、その後キャストして、正しい丸めを維持し、2文字節約します!

また、このトリックではlongを使用する必要がなくなったので、さらに4文字をシェービングするintに切り替えることができます。


PPCGへようこそ!
Erik the Outgolfer 2016年

ありがとう:)この辺りの質問をしばらく聞いてみましたが、予想よりも長い回答でしたが、これは私が参加できる質問であると考えました。
Frozn、2016年

私は「+1」します。これは、必須の「なぜなら...あなたが知っている... Java!」を追加することを期待しています
Olivier Dulac 2016年

@Froznと-5バイトのa->{最後}を削除できるかどうかはわかりません。
Erik the Outgolfer 2016年

@OlivierDulacまだです:)
Erik the Outgolfer 2016年

1

Mathematica-21バイト

兄弟のRPiからMathematicaを入手したばかりなので、楽しみながら試してみてください。PPCGチャレンジよりも優れた方法です。

{#,4#/3,8#/9,8#/9+1}&

無名関数を定義します。次のように試してください:

In[26]:= x:={#,4#/3,8#/9,8#/9+1}&                                             

In[27]:= x[9]                                                                 

Out[27]= {9, 12, 8, 9}

結果として整数または分数が得られますか?
デビッド

@David整数。ただし、結果が整数でない場合(その場合は分数)。
Maltysen、2016年


1

Lua、52バイト

このプログラムは、コマンドライン引数で数値を取り、対応する配列を返します。luaのプログラムは、インタープリターが常にそれらを関数にカプセル化するため、技術的には関数です。これは、他のファイルのコードを「呼び出す」ときに使用されるこのメカニズムでもあります(基本的にはloadfile/を使用しますdofile)。

m=math.floor x=...z=m(x*8/9)return{x,m(x*4/3),z,z+1}

1

実際には、21バイト

`;;3@/+;32/*;uk1½+♂≈`

このプログラムは、トップスタック値で必要な操作を実行する関数を宣言します。

オンラインでお試しください!.最後の追加は関数を評価し、結果を出力します)

説明:

`;;3@/+;32/*;uk1½+♂≈`
 ;;                    make two copies of x
   3@/+                divide by 3, add that to x to get y
       ;32/*           make a copy of y and multiply by 2/3 to get z
            ;u         make a copy of z and add one
              k        push stack as a list
               1½+     add 0.5 to each element
                  ♂≈   apply int() to each element (make integers from floats by flooring; this is equivalent to rounding half-up because of adding 0.5)

1

Mathcad、[tbd]バイト

ここに画像の説明を入力してください


Mathcad codegolfバイトの同等性はまだ決定されていません。キーボードの数をおおよその同等のものとすると、ソリューションは約40バイトです。



1

Pyke、11バイト

D}[}3/bD)[h

ここでお試しください!

            - implicit input()
D           - a,b = ^
 }          - b*=2
  [}3/bD)   - macro:
   }        -   tos*=2
    3/      -   tos/=3
      b     -   tos = round(tos)
       D    -   old_tos = tos = tos
            - macro
         [  - macro
          h - d +=1

1

JavaScript、50バイト

私は自分のJavaソリューションをJavaScriptに変換し、それを少し読み飛ばしました。

var r=Math.round,g=a=>[a,r(a+a/3),a=r(a*8/9),++a]

1

C ++ 0x- 95 102 185 189 109 129文字

int * n(int p){static int a[3];a[0]=p;a[1]=round(p+(p/3));a[2]=round((a[1]/3)*2);a[3]=a[2]+1;return a;}
  • これには、cmathヘッダーが機能する必要があります。

Degolfed

#include <cmath>
int * ninePattern(int p) {
        static int a[3]; // pattern array
        a[0] = p; // sets first iteration
        a[1] = round(p + (p / 3)); // sets second iteration
        a[2] = round((a[1] / 3) * 2); // sets third iteration
        a[3] = a[2] + 1; // sets fourth iteration
        return a; // returns array
}

2
C ++のエキスパートではありませんが、配列にある計算済みの値を再利用することで短縮できます。また、)と{の間にある空白を削除できる場合があります。C++がどれほど厳密かわかりません。
Frozn、

最後の2つは現在のバージョンで正しいですか?代わりにp+(p/3)*(2/3)どちらを計算するかを見たからですp+(2*p/9)(p+(p/3))*(2/3)
Frozn

それは私の側のエラーであることがわかりました。最後の反復では、+ 1ではなく1を入れました:P
InitializeSahib

0

Erlang、80バイト

-module(f).
-export([f/1]).
f(X)->Y=X+(X/3),Z=trunc(Y*(2/3)),[X,trunc(Y),Z,Z+1].

実行するには、f.erlとして保存し、コンパイルして関数を呼び出します。それはintのリストを返します:

fxk8y@fxk8y:/home/fxk8y/Dokumente/erlang/pcg# erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-    threads:10] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> c(f).
{ok,f}
2> f:f(9).
"\t\f\b\t"
3>

Erlangには文字タイプがないため、ASCII値の範囲内にいる場合、ErlangはintをASCII文字に自動的に変換することに注意してください。100で関数を呼び出すと、読みやすくなります[100,133,88,89]

非ゴルフ:

-module(f).
-export([f/1]).

f(X) ->
  Y = X+(X/3),
  Z = trunc(Y*(2/3)),
  [X, trunc(Y), Z, Z+1].

0

Erlang、46バイト

@ fxk8yに触発された回答(彼の回答にコメントを投稿できませんでした)

F=fun(X)->Z=round(X*4/9),[X,Z*3,Z*2,Z*2+1]end.

また、次のようにして結果を確認できます。

2> io:fwrite("~w~n", [F(9)]).                         
[9,12,8,9]
ok

0

Pyth、20バイト

m.RdZ[Jc*4Q3Kc*2J3hK

説明:

            (Implicit print)
m           For each d in array, d =
.RdZ        Round d to zero decimal places
[           The array of
  J         The result of setting J to
    c       The float division of
      *4Q   Input * 4
      3     and 3
            ,
  K         The result of setting K to
    c       The float division of
      *2J   J * 2
      3     and 3
            , and
  hK        K + 1.
            (Implicit end array)

ここでテスト


0

Jolf、17バイト

Ώ‘Hγ+H/H3Βώ/γ3hΒ’

関数を定義しますΏ。暗黙的に入力を受け取るため、完全なプログラムとしても機能します。ここでお試しください!


ジョルフはゆっくりと確認されるESMinになっています??? :P
Downgoat

@Upgoat eyそれはギリシャ語です。そして真夜中。:P
Conor O'Brien

> _>ああ。> _> _> _>目覚めたらすみません
ダウンゴート

@Upgoatはまだ眠っていません;)
Conor O'Brien

:| idkそれが私があなたを起こした良いことであるか、あなたがまだ起きている悪いことであるなら
Downgoat

0

Mathematica、51バイト

FoldList[#2@#&,{#,Round[4#/3]&,Round[2#/3]&,#+1&}]&

現在の(投稿時の)バージョンの投稿に準拠する匿名関数。これは、すべてのステップで丸めを意味します。

FoldListある典型的な動作のプログラミングでは。として呼び出されFoldList[f, list]、2つの引数の関数fを結果(または最初の反復でのリストの最初の要素)に繰り返し適用し、リストの次の要素を2番目の引数として受け取ります。

Ungolfed: #2 @ # &2番目の引数を最初の引数に適用する無名関数です。したがって、のリスト引数はFoldList、入力に適用される連続した関数で構成されます。

FoldList[#2 @ # &,
  {#, (* note the absence of '&' here, 
         this '#' stands for the argument
         of the complete function and is 
         covered by the & at the end      *)
   Round[4 # / 3] &, (* anonymous function that rounds 4/3 of its input *)
   Round[2 # / 3] &, (* ditto, 2/3 *)
   # + 1 &           (* add one function *)
  }] &               (* and the '&' makes the entire 
                        thing an anonymous function,
                        whose argument is the '#' up
                        at the top.                  *)

入力は整数であり、除算は3であるので、4.5のような結果は決してありません。したがって、最後の桁がaである場合、丸めの規則について心配する必要はありません5




0

CJam、21バイト

qi__3d/+mo_2d3/*i_)]`

フィードバックは大歓迎です

説明

  • qi__ -入力を整数として読み取り、2回複製します
  • 3D/+mo -入力の1つのインスタンスを3で割り、それを2番目のインスタンスに追加してyにします
  • _2d3/*i -yを複製し、それに.6を掛けます
  • _)] `-複製、インクリメント、配列でラップ、配列として出力(`演算子のため、コードではありません:()

編集:最初の3つをダブルにするのを忘れたため、プログラムが壊れました。修繕。


0

公理、59バイト

g(x)==round(x)::INT;f(x)==[x,a:=g(x+x/3.),b:=g(a*2./3),b+1]

テスト

(3) -> [[i,f(i)] for i in [9,8,6,23,159]]
   (3)
   [[9,[9,12,8,9]], [8,[8,11,7,8]], [6,[6,8,5,6]], [23,[23,31,21,22]],
    [159,[159,212,141,142]]]
                                                      Type: List List Any


0

PHP、67バイト

function f($x){return [$x,$y=round($x*4/3),$z=round($y*2/3),$z+1];}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.