バランスを保ちながらゼロに最も近いN個の数


10

目的:正の整数が与えられた場合n

  • n奇数の場合、昇順でn最も近い数値のリストを出力します0
  • nが偶数の場合、Falsey値を出力します。

テストケース

5 -> [-2,-1,0,1,2]
4 -> false (or any Falsey value)
1 -> [0]

リファレンス実装

function update(){
  var num = +document.getElementById("yield").value;
  if(num){
    var out = document.getElementById("output");
    if(num % 2 == 1){
      // base is balanced
      var baseArr = [];
      for(var i=0;i<num;i++){
        baseArr.push(i-Math.floor(num/2));
      }
      out.innerHTML = baseArr.join(" ");
    } else {
      out.innerHTML = "false";
    }
  } else {
    out.innerHTML = "<i>enter input</i>";
  }
}

setInterval(update,1);
* {
  font-family: "Constantia", "Consolas", monospace;
}

[type="number"] {
  width: 10px;
  width: 2em;
}

#output {
  font-family: "Consolas", monospace;
}
Input: <input type="number" id="yield" value="3"> is <span id="output"><i>enter input</i></span>


出力をリストではなく範囲オブジェクトにすることはできますか?
Brad Gilbert b2gills 2015年

@ BradGilbertb2gills申し訳ありませんが、範囲オブジェクトは無効な出力です。
Conor O'Brien

空のリストは常に間違っているとは限りません。
SuperJedi224 2015年

@ SuperJedi224どのコンテキストで?
Conor O'Brien、

空のリストが真の値と見なされる言語(IE Javascript)があります。
SuperJedi224 2015年

回答:



5

APL、16 15 13バイト

-2バイトの@Dennisに感謝!

⌊(⍳⊢×2|⊢)-÷∘2

これは、偶数入力に対して空の配列を提供するモナド列です。以下は図です:

┌────┴─────┐   
⌊ ┌────────┼─┐ 
┌─┴─┐      - ∘ 
⍳ ┌─┼───┐   ┌┴┐
  ⊢ × ┌─┼─┐ ÷ 2
      2 | ⊢    

まず、⊢×2|⊢入力にmod 2を掛けます。つまり、オッズはそれ自体を与え、偶数は0を与えます。1からそれまでの数値のリストを作成して(⍳0空の配列を与えます)、入力とフロアの半分を減算します。



4

PowerShell、50 52バイト

param($a)$b=$a/2-.5;(0,((0-$b)..$b-join' '))[($a%2)]

ウーフ。かなり冗長な答え。入力を受け取り$a、新しい変数$bをの「フロア」として設定します$a/2。から(0-$b)までの新しい数値範囲を生成し$b、次にjoinその範囲にスペースを入れ、2要素配列の2番目の要素(最初の要素は0)とします。次に、を使用$a%2して、その配列にインデックスを付けて出力します。

54バイトで、より「伝統的な」if / elseフローを使用する代替バージョン:

param($a)$b=$a/2-.5;if($a%2){(0-$b)..$b-join' ';exit}0

編集-入力が偶数の場合に誤った値を出力するロジックを追加する必要がありました


に変更(0-$b)することで、3バイト節約できます-$b。また、単に乗算する*0とnull文字列が出力されます(Powershellではfalseと評価されます)。(参照:codegolf.stackexchange.com/a/63005/45925
Jonathan Leech-Pepin

4

Haskell、37 36 31バイト

g n=take(n*mod n 2)[-div n 2..]

不均衡は空のリストで示されます。使用例:g 7-> [-3,-2,-1,0,1,2,3]

@xnorは5バイトを見つけました。ありがとう!


空のリストのケースを条件にする方法はありませんか?やることg n=[x|x<-[-div n 2..(n+1)/2],odd n]は長いです。
xnor 2015年

34:g n=[1|odd n]>>[-div n 2..div n 2]
xnor 2015年

編集する必要があります。これは小さな変更です。
xnor 2015年

g n=[1|odd n]>>take n[-div n 2..]charも保存します。
xnor 2015年

1
@xnor:私の投稿を編集するよりも速くゴルフをしている。
nimi 2015年

4

JavaScript(ES6)、44 43 42 41バイト

取り消し線を引かれた44はまだ通常の44です;(

n=>[...Array(n&1&&n--)].map((x,i)=>i-n/2)

奇数の入力の場合x、を中心とする長さの整数配列を返します0。偶数の場合は0を返します。これは可能な限り短いと思います。(@ edc65と@ןnɟuɐɯɹɐןoɯのおかげで数バイトが節約されました!)

ES6の代替:(@intrepidcoderのおかげで42バイト)

x=>x%2&&[for(y of Array(x--).keys())y-x/2]

提案は大歓迎です!


を使用x%2&&[for(y of...]すると、バイトが節約されます。
intrepidcoder 2015年

ES6、43、n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2)空の配列を返すことは許可されている場合
edc65

@intrepidcoderありがとうございます!これを変更しました。
ETHproductions、2015年

@ edc65ありがとうございます!これを答えに追加しました。
ETHproductions、2015年

x=>x%2&&[for(y of Array(x--).keys())y-x/2]42.ある
intrepidcoder

3

Minkolang 0.10、18バイト

nd2%?.d2:~r[dN1+].

説明

n          Take input as integer (k)
d2%?.      Duplicate k and stop if it's even
d2:~       Duplicate k, then divide by 2 and negate to get first number
r          Put k on top
[    ].    Loop k times and then stop
 dN1+      Duplicate, output as integer, and increment

3

J、12バイト

i:@%~2&!*2&|

これは、0偶数に対して(偽)を返すモナディック動詞です。J.jsでオンラインで試しください。

テスト走行

   (i:@%~2&!*2&|) 3
_1 0 1
   (i:@%~2&!*2&|) 2
0

使い方

              Right argument: y
         2&|  Take y modulo 2.
     2&!      Calculate y C 2 = y(y-1)/2.
        *     Multiply the results.
   %~         Divide the product by y.
              This yields (y-1)*(y%2)/2 = (y-1)/2 (y even) | 0 (y odd).
  @           Take the result and...
i:              apply the bilateral index generator z -> (-z ... z).

3

DUP、31バイト

[a:a;2/b:[b;_[$b;<][$1+]#][0]?]

Try it here.

匿名のラムダ。使用法:

5[a:a;2/b:[b;_[$b;<][$1+]#][0]?]!

説明

[                             ] {lambda}
 a:                             {store input to a}
   a;2/                         {divmod a by 2}
       b:                       {store quotient to b, top of stack is now remainder}
         [               ][ ]?  {conditional}
          b;_                   {if remainder is 1, get b and negate it}
             [    ][   ]#         {while loop}
              $b;<                {while top of stack is less than b}
                    $1+           {duplicate and increment}
                           0    {otherwise, leave falsy value}

2

パイソン2、34の、32バイト

現時点では、バランスが取れていない場合に必要なものを出力できるかどうかはわかりません。現在、バランスが取れないベースの場合は、空のリストが返されるだけです。これは匿名のラムダ関数なので、使用する名前を付けます。

lambda k:k%2*range(-k/2+1,-~k/2)

そうすればk%2*、かっこを避けることができます。
xnor 2015年

2

CJam、13 12バイト

{_2md@,@f-*}

これは、スタックから整数をポップし、代わりに数字の配列(奇数の基数)または空の配列(偶数の基数)をプッシュする無名関数です。CJamインタープリターでオンラインで試してください。

使い方

_          e# Copy the input (N).
 2md       e# Push N/2 and N%2.
    @      e# Rotate N on top of the stack.
     ,     e# Push [0 ... N-1].
      @    e# Rotate N/2 on top of the stack.
       f-  e# Subtract N/2 from each element of [0 ... N-1].
         * e# Repeat the resulting array N%2 times.


2

Vitsy、27 25バイト

明日はこれでゴルフをするつもりですが、今は本当に寝るべきです。

D2M)[&1] D1-i *} \ [D2 / NaO2 +]
D入力を複製します。
 2M)[&1]入力が偶数の場合(input%2 = 0)新しいスタックを生成します
                              それに1を押します。
        Dトップ値を複製します-偶数でなければ、これが入力になります。それ以外の場合は1つです。
         1-1を減算(ゼロ付近でバランスを取るため)
           i *加算的に反転
             スタック内のアイテムをシフトします-これにより、
                              入力または上に1つあります。
              \ []入力時間を繰り返します。
                D2 / N一番上のアイテムを複製して印刷します。
                    aO改行(これが有効な分離であると確信しています)
                      2+スタックの一番上のアイテムに1つ追加します。

強烈に聞こえる「最終グローバル変数」
Conor O'Brien

3
それはある激しいです。
Addison Crump 2015年

@CᴏɴᴏʀO'Bʀɪᴇɴの強度が
Addison Crump

2

TeaScript、16バイト18

x%2Þr(xØ)ßl-x/2)

ものすごく単純。特殊文字は実際には、より長いコードシーケンスの単なる「省略形」です。

私はまだパーマリンクを作成していないので、インタープリターに貼り付けてコピーする必要があります

説明

x%2 &&    // If x is NOT even return falsy, else...
r(x--)    // Range 0-input. Subtracts one from input
m(#       // Loop through range
  l-      // Current item in loop, minus...
    x/2   // input - 1, divided by two
)

この回答は競合していません


これらの特殊文字の省略形をJaptに実装する必要があります。:)ところで、Ωは1バイトですか?
ETHproductions、2015年

@ETHproductions Aww :(実装する前に確認するのを忘れていました。次のコミットで修正します
Downgoat

1
@Vɪʜᴀɴいや、それはものを面白く保つ素晴らしい挑戦/癖です。その上、印刷できない文字はクールに見えます。
Mama Fun Roll

4
@ןnɟuɐɯɹɐןoɯあなたが実際にそれらを見ることができる限り。私の電話では、あなたの言語の名前すら見えません。:P
デニス

2
@デニスそれは言語の神秘的なオーラに追加されます...
ママファンロール

2

F#、38バイト

誤った結果は空のリストです。

let O n=if n%2<1 then[]else[-n/2..n/2]


2

Japt、21 19バイト

JaptJa vaScri ptの短縮バージョンです。

U%2&&(X=-U/2+K o1-X

奇数の入力の場合x、を中心とする長さの整数配列を返します0。偶数の場合、0を返します。大まかなJS変換:

output(U%2&&(X=-U/2+.5).range(1-X));

where x.range(y)は、x〜の整数のリストを作成しyます。オンラインでテストしてください!


最近のJaptでは、これはわずか11バイトです。

u ©Uo-U/2-½

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


5
この回答に反対票を投じた人に、その理由を説明していただけますか?どこに問題があるのか​​知りたいので、修正します。ありがとう。:-)
ETHproductions 2015年

3
多分彼らは言語が好きではないのですか?(私はこの言語が好きですが、他の人がそうでないかもしれないのはわかります。)
Conor O'Brien

1

R、30バイト

function(n)(x=(1-n)/2*n%%2):-x

大雑把に、x:-xから整数を返すxまで-x、私はセット、xにを(1-n)/2。またn%%2、の定義でモジュロ2係数を使用して、が偶数の場合xに強制的xにゼロにしn、その場合0:00(false)を返します。


1

Perl、36バイト

私はこれを短縮できると感じています:

$,=$";$n=<>;print$n%2?-$n/2..$n/2:0;

範囲は浮動小数点数を整数として扱うため、たとえば、5/2 = 2.5は黙って2に変換されます。

(フォーマットが重要でない場合$,=$";は、合計30バイト削除します)。


1

Powershell、49バイト

param($a)$b=$a/2-.5;"[$(-$b..$b-join",")]"*($a%2)

$false空の行出力を提供するため、偶数も評価されます。

("[$(-$b..$b-join",")]"*($a%2))-eq $True ===> False

奇数は正確な参照文字列を出力します。出力文字列からを45削除することで、さらに4バイトを節約できます(現在は)[]

PS> .\balanced.ps1 4


PS> .\balanced.ps1 5
[-2,-1,0,1,2]

PS> .\balanced.ps1 0


PS> .\balanced.ps1 1
[0]

PS> 

Powershell、36バイト

param($a)$b=$a/2-.5;(-$b..$b)*($a%2)

これは同じ誤った結果になりますが、改行で区切られた数値のリストを出力します。

PS> .\balanced-newline.ps1 4

PS> .\balanced-newline.ps1 1
0

PS> .\balanced-newline.ps1 5
-2
-1
0
1
2

PS>

1

Perl 6、25バイト

範囲ではなくリストを出力する、考えられる最も短いラムダ式は次のとおりです。

{$_%2&&|((1-$_)/2..$_/2)} # 25

テスト:

for 0..10 -> $a {
  if {$_%2&&|((1-$_)/2..$_/2)}($a) -> $b {
    say "$a.fmt('%5s')  $b"
  } else {
    say "$a.fmt('%5s')  False"
  }
}
    0  False
    1  0
    2  False
    3  -1 0 1
    4  False
    5  -2 -1 0 1 2
    6  False
    7  -3 -2 -1 0 1 2 3
    8  False
    9  -4 -3 -2 -1 0 1 2 3 4
   10  False

これは、Perl 6が数値0を偽の値として扱うという事実を利用しています。出力がなければならなかった場合は、正確にFalse、あなたは置き換えることができ$_%2$_!%%2


1

05AB1E、8バイト(非競合)

言語は挑戦の日付を延ばしているため、競合しません。コード:

È#¹;D(ŸR

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

説明:

È#        # If input % 2 == 0, end the program
  ¹       # Push the first input from the register
   ;      # Halve, push input / 2 rounded down
    D     # Duplicate top of the stack
     (    # Negate
      Ÿ   # Inclusive range, pushes [a .. b]
       R  # Reverse the array

CP-1252エンコーディングを使用します。


0

PHP、50バイト

<?=($n=$argv[1])&1?join(_,range(-$k=$n/2|0,$k)):0;

プログラム、STDINから入力を受け取り、_区切りリストまたはを出力します0

または

function f($n){return$n&1?range(-$k=$n/2|0,$k):0;}

関数は引数を取り、配列またはを返します0


0

Java、145バイト

public class c{static void c(int n){for(int i=n/2*-1;i<=n/2;i++){if(n%2==0){System.out.print("false");break;}System.out.print(i);}}}

説明:申し訳ありませんが、これは本当に長いのです。Javaの答えが見つからなかったので、Javaの回答を入れました。メイン関数を記述する必要があるかどうかを教えてください(それがポリシーかどうかはわかりません)。基本的には、数値を2で割り、下限に-1を掛け、上限に2で割った数値を使用します。私はこのページが初めてなので、何もフォーマットしていなかった場合はお知らせください。また、ラムダ関数を使用して回答を短縮できることは知っていますが、それらの使用方法がわからず、Javaがそれらをサポートしているかどうかはわかりません。

以下は、読みにくいバージョンです。

public class StackOverflow {
static void c(int n){
    for (int i = n/2*-1; i<=n/2; i++){
        if(n%2==0){
            System.out.print("false");
            break;
        }
        System.out.print(" " + i);
    }
}
}

通常のルールでは、プログラムまたは関数を作成する必要があります。Javaでは、ほとんどの場合、関数は短くなります(特にreturn、戻り値は正当な形式の出力です)。使用する必要はありませんSystem.outが、この場合return、部分的に保存する必要があります。文字列で構成されたリスト)。最近のJavaはラムダをサポートしており、通常は「通常の」関数定義よりも短くなります。(また、なぜ先頭の空白か?)

@ ais523先頭の空白は私個人の習慣であり、バイトカウントに含めなかったので、取り除く必要があると思います。助けてくれてありがとう!
Henry

0

Ruby、25バイト

->n{n%2>0&&[*(-n/=2)..n]}

0

Ruby、27バイト

->n{[*0-n/2..n/2]if n.odd?}

nnが奇数の場合は0に最も近い数値の配列を返し、それ以外の場合はnil(ルビでは誤った値)を返す匿名のラムダ関数を作成します。

Rubyは整数の除算を-無限大に丸めますが0-n/2-n/2+1(とにかくマイナス記号があるため)より短く、nは現在正と見なされているため、丸めは私の好意で機能します。

旧バージョン(28バイト)

->n{[*-n/2+1..n/2]if n.odd?}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.