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>


Чи може висновок бути об'єктом діапазону, а не списком?
Бред Гілберт b2gills

@ BradGilbertb2gills Вибачте, об'єкт діапазону недійсний.
Conor O'Brien

Порожній список не завжди є фальсифікованим.
SuperJedi224

@ SuperJedi224 У яких контекстах?
Conor O'Brien

Існують мови (IE Javascript), у яких порожній список вважається правдоподібним значенням.
SuperJedi224

Відповіді:



5

APL, 16 15 13 байт

Дякуємо @Dennis за -2 байти!

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

Це монадичний поїзд, який дає порожній масив для рівного введення. Нижче наведена схема:

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

По-перше, ⊢×2|⊢дає вхідні рази його mod 2; тобто шанси дадуть себе, а евенс дасть 0. Ми використовуємо для створення списку чисел від 1 до цього ( ⍳0дає порожній масив), а потім віднімаємо половину введення та підлоги.


5

Математика, 32 30 24 байти

OddQ@#&&Range@#-(#+1)/2&

Трюк з кодовим гольфом: останній аргумент Andне повинен бути булевим.


Ви можете зберегти байт, скориставшись дужками Unicode для Floor.
Мартін Ендер

Також, Range[-a,a=...]схоже, працює, зберігаючи ще один байт.
Мартін Ендер

OddQ@#&&Range@#-(#+1)/2&
ngenisis

4

PowerShell, 50 52 байти

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

Вихід. Досить багатослівна відповідь. Бере введення $a, а потім встановлює нову змінну $bяк "підлогу" $a/2. Створює новий діапазон чисел від (0-$b)до $b, потім joins діапазон з пробілами, і він є другим елементом двоелементного масиву (перший елемент є 0). Потім використовує $a%2для індексації в цей масив для виводу.

Альтернативна версія з використанням більш "традиційного" потоку if / else в 54 байти:

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

Редагувати - потрібно додати логіку для виведення значення фальси, якщо вхід є рівним


Збережіть 3 байти, змінивши (0-$b)на просто -$b. Крім того, просто помноживши на *0виведете нульовий рядок (оцінюється як false в powerhell). (див .: codegolf.stackexchange.com/a/63005/45925 )
Джонатан Ліч-Пепін

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

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

Ви повинні відредагувати це, це невелика зміна.
xnor

g n=[1|odd n]>>take n[-div n 2..]також економить чару.
xnor

1
@xnor: ти гольфуєш це швидше, ніж я можу редагувати свої повідомлення.
німі

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: (42 байти, завдяки @intrepidcoder)

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

Пропозиції Ласкаво просимо!


Використання x%2&&[for(y of...]зберігає байт.
intrepidcoder

ES6, 43, n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2)якщо повернення порожнього масиву дозволено
edc65

@intrepidcoder Дякую! Я це змінив.
ETHproductions

@ edc65 Дякую також! Я додав це у відповідь.
ETHproductions

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

3

Мінколанг 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

Python 2, 34 32 байт

Зараз я не впевнений, чи зможу я вивести все, що хочу, якщо він не збалансований, тому в даний час це просто повертає порожній список у випадку незбалансованої бази. Це анонімна лямбда-функція, тому дайте їй ім’я, щоб ним користуватися.

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

Якщо це зробити k%2*, ви можете уникнути паронів.
xnor

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

5
Чи існує мова для кожної великої літери в англійському алфавіті ?!
Conor O'Brien

Їх також слід перераховувати в порядку зростання.
Геобіт

@MickeyT Виправлено це в 5 байт.
kirbyfan64sos

@Geobits Виправлено і це.
kirbyfan64sos

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Є пару доступна
фаза

2

Віци, 27 25 байт

Я заїду сьогодні в гольф, але мені справді слід спати.

D2M) [& 1] D1-i *} \ [D2 / NaO2 +]
D Дублюйте вхід.
 2M) [& 1] Якщо вхід рівний (вхід% 2 = 0), генеруйте новий стек
                              і натисніть на нього 1.
        D Дублюйте верхнє значення - якщо воно не було рівним, це буде введенням. Інакше це один.
         1- Віднімаємо одне (для балансування навколо нуля)
           i * Додатково інвертувати
             } Перехід на елемент у стеку - це гарантує
                              у нас є або вхід, або один зверху.
              \ [] Повторіть час введення.
                D2 / N Скопіюйте верхній елемент та роздрукуйте його.
                    aO Newline (я майже впевнений, що це дійсне розділення)
                      2+ Додайте його до верхнього елемента стека.

"Остаточний глобальний вар", який звучить напружено
Conor O'Brien

3
Це є інтенсивним.
Аддісон Кримп

@ 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

@ETHproductions Aww :( забув перевірити це, перш ніж я це здійснив. Я
виправлю

1
@ Vɪʜᴀɴ Nah, приємний виклик / примха, який цікавить речі. Крім того, недруковані символи виглядають круто.
Mama Fun Roll

4
@ ן nɟuɐɯɹɐ ן oɯ Поки ти насправді можеш їх побачити. На моєму телефоні, навіть не ваш язик ім'я видно. : P
Dennis

2
@Dennis Це додає таємничій аурі мови ...
Mama Fun Roll

2

F #, 38 байт

Результат фальси - порожній список.

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

2

𝔼𝕊𝕄𝕚𝕟, 21 символ / 37 байт

ô[…Ѧ(ï&1⅋ï‡)]ć⇀_-ï/2⸩

Try it here (Firefox only).

Ось 20-знакова / 35-байтна відповідь (неконкурентна, оскільки у відповіді використовуються зміни, внесені після запитання):

ô(ï%2⅋ѨĶ(ï‡)ć⇀$-ï/2⸩

Try it here (Firefox only).


2

Japt, 21 19 байт

Japt - скорочена версія Ja vaScri pt .

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

Для непарних входів повертає цілий масив довжини з xцентром у 0; для рівних, повертає 0. Грубе переклад JS:

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

де x.range(y)створюється список цілих чисел від xдо y. Перевірте це в Інтернеті!


У сучасному Japt це лише 11 байт:

u ©Uo-U/2-½

Спробуйте в Інтернеті!


5
Тим, хто спростував цю відповідь, чи можете ви пояснити, чому? Я хотів би знати, де я пішов не так, щоб я міг це виправити. Дякую. :-)
ETHproductions

3
Можливо, їм мова не подобається? (Я люблю мову, хоча бачу, як не можуть інші.)
Conor O'Brien

1

R, 30 байт

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

Грубо кажучи, x:-xповертає цілі числа від xдо -x, де я встановив xв (1-n)/2. Я також використовую коефіцієнт модуля-2 n%%2у визначенні xпримушувати xдо нуля, коли nрівномірний, у цьому випадку 0:0повертається 0(фальси).


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

Непарні числа виводять точний опорний рядок. Ви можете зберегти ще 4 байти (зараз 45), видаливши []з вихідного рядка.

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, тому вирішив поставити її. Повідомте, чи потрібно мені написати основну функцію (я не впевнений, це політика чи ні). В основному він ділить число на два і помножує його на -1 для нижньої межі, а для верхньої межі просто використовує число, поділене на два. Я начебто новачка на цій сторінці, тому якщо я нічого не відформатувала, то дайте мені знати. Також я знаю, що відповіді можна скоротити за допомогою лямбда-функцій, але я не знаю, як їх використовувати, і я не впевнений, чи підтримує їх 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 Провідний пробіл - це лише моя особиста звичка, і я не включав його до складу байтів, я думаю, я повинен позбутися цього. Дякую за допомогу!
Генріх


0

Рубін, 27 байт

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

Створює анонімну лямбда-функцію, яка повертає масив n чисел, найближчих до 0, якщо n непарних, і поверне нуль (значення фальси в рубіні) в іншому випадку.

Рубі округляє цілочисельний поділ на -нескінченність, але 0-n/2 коротше, ніж-n/2+1 (оскільки знак мінус все одно є), і оскільки n зараз вважається позитивним, округлення працює на мою користь.

Стара версія (28 байт)

->n{[*-n/2+1..n/2]if n.odd?}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.