Головокружительное целочисленное перечисление


25

Ваша задача сегодня состоит в том, чтобы вывести данный член последовательности, перечисляющей все целые числа. Последовательность следующая: если у нас есть 0-индексированная функция, генерирующая последовательность f(n)и ceil(x)являющаяся функцией потолка, то f(0) = 0; abs(f(n)) = ceil(n/2); sign(f(n))положительно, когда nи ceil(n/2)оба либо четные, либо оба нечетные.

Чтобы помочь понять эту последовательность, первые несколько терминов таковы: 0 1 -1 -2 2 3 -3 -4 4 5 -5 -6 6 7 -7...

Ваша задача - написать программу, которая принимает целое число nи выдает nth-й член последовательности. Ввод может быть только 0 или 1 с индексом.

Тестовые случаи (0-индексированные):

0  =>  0
1  =>  1
2  => -1
3  => -2
4  =>  2
5  =>  3

Это , побеждает меньше байтов!


Похожие
страницы

Кажется, обратная функция складывания
sergiol

Ответы:


8

SOGL V0.12 , 8 6 байтов

I».»⌡±

Попробуй здесь! или попробуйте первые пару чисел (немного изменились, чтобы это работало) с
0 индексами.

Объяснение:

I       increment the input
 »      floor divide by 2
  .     push the original input
   »    floor divide by 2
    ⌡   that many times
     ±    negate

Или проще:

(input + 1) // 2 negated input // 2 times
        I     »     ±      .     »    ⌡

3
Это не заняло ни одной минуты!
NieDzejkob

6
Я ».»по телефону I».»⌡±.
Джонатан Аллан

@JonathanAllan Я не понимаю ._.
Павел



4

C, 25 байтов

f(n){return~n/2*~-(n&2);}

Вы можете сохранить 4 байта, присвоив возвращаемое значение первому параметру вместо использования ключевого слова return. f(n){n=~n/2*~-(n&2);}
cleblanc

5
@cleblanc Это не так, как работает C.
orlp

2
gcc -O0для x86-64 происходит компиляция версии @ cleblanc с инструкциями, которые оставляют результат умножения в eax( godbolt.org/g/dztKPV ), но тогда это будет x86-64 gcc -O0ответ, а не ответ C. Я не одобряю ответы C, которые ломаются с включенной оптимизацией, особенно если не считать того глупого последнего выражения как дерьмо с возвращаемым значением. Даже если это как GCC происходит с работой, что это не так, как C работает.
Питер Кордес

Сделай указатель. Вам не нужны оптимизации, если исходные и конечные значения не находятся в стеке.
mreff555

1
@ mreff555 Это будет нестандартный (хотя и приемлемый) метод ввода-вывода, и он не будет короче.
orlp


3

Пайк , 6 байт

heQeV_

Попробуй это здесь!

Использует подход Дзаймы ... Beats Ties Jelly!

объяснение

h      - Increment the input, which is implicit at the beginning.
 e     - Floor halve.
  Q    - Push the input.
   e   - Floor halve.
    V_ - Apply repeatedly (V), ^ times, using negation (_).
       - Output implicitly.

Шестигранные закодированные байты эквивалента будут: 68 65 51 65 56 5F.




3

Mathematica, 24 байта

(s=⌈#/2⌉)(-1)^(#+s)&  

-14 байтов от @Миша Лаврова


1
Использование Booleи OddQприводит к преобразованию нечетных чисел в 1 и четных чисел в 0, но здесь это не нужно: степени -1 в любом случае дают правильный ответ для всех нечетных чисел. Таким образом, вы можете сократить этот шаг (-1)^Tr@{#,s}или просто (-1)^(#+s).
Миша Лавров

3

Haskell , 25 43 42 байта

((do a<-[0..];[[-a,a],[a,-a]]!!mod a 2)!!)

Попробуйте онлайн! 1-индексироваться.

Редактировать: Предыдущая версия имела знаки в неправильном порядке, спасибо @ Potato44 за указание. Исправлено на 18 байт ...

Редактировать 2: Спасибо BMO за -1 байт!


Вы можете сэкономить 1 байт, используя do-notation, попробуйте онлайн!
მოიმო

@BMO Спасибо! ...
Лайкони






2

JavaScript (ES6), 18 байт

f=
n=>n/2^(n<<30>>30)
<input type=number min=0 value=0 oninput=o.textContent=f(this.value)><pre id=o>0

0 индексированные.



2

Кубически 23 байта

(1-индексированных)

FDF'$:7+8/0_0*0-8*7/0%6

Попробуйте онлайн!

Основными сложностями при написании кода в Cubically являются:

  • Существует только 1 переменная с возможностью записи, и
  • Получить константы сложно.

Итак, это решение рассчитать

((((n+1)/2)%2)*2-1)*n/2

где /обозначает целочисленное деление. Для этого нужна только 1 временная переменная и константы 1 и 2.

Объяснение:

FDF'$:7+8/0_0*0-8*7/0%6
FDF'                      Set face value of face 0 to 2, and value of memory index 8 (cube is unsolved) to 1 (true = unsolved)
    $                     Read input
     :7                                 input
       +8                                + 1
         /0                        (        ) /2
           _0                     (             ) %2
             *0                  (                  ) *2
               -8                                        -1
                 *7             (                          ) *n
                   /0                                          /2
                     %6   Print

2

TI-Basic (TI-84 Plus CE), 20 байтов

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2

Полная программа, которая называется как 5:prgmNAME.

TI-Basic - это токенизированный язык , все токены, используемые здесь, являются одним байтом, за исключением remainder(двух. представляет собой регуляторный токен, который набирается (-)ключом.

Примеры:

0:prgmNAME
 => 0
1:prgmNAME
 => 1
2:prgmNAME
 => -1
#etc

Объяснение:

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2
‾int(‾Ans/2)                           # -int(-X) is ciel(X), so ciel(Ans/2)
                          int(Ans/2)   # int(X) is floor(X), so floor(Ans/2)
                remainder(int(Ans/2),2 # 1 if floor(Ans/2) is odd else 0
            (1-2remainder(int(Ans/2),2 # -1 if floor(Ans/2) is odd, else 1
_int(_Ans/2)(1-2remainder(int(Ans/2),2 # -ciel(Ans/2) if floor(Ans/2) is odd, else ciel(Ans/2)

Та же формула, что и для функции Y-var:

Y1= ‾int(‾X/2)(1-2remainder(int(X/2),2


2

Java 8, 15 байт

n->~n/2*~-(n&2)

РЕДАКТИРОВАТЬ: Java действительно самый короткий из не-гольф-языков ?! o.o

Объяснение:

Попробуй это здесь.

Я буду использовать таблицу ниже как ссылку на то, что происходит.

  1. ~nравно -n-1.
  2. Поскольку целочисленное деление в Java автоматически устанавливает положительные целые числа и отрицательные целые, ~n/2результатом будет последовательность0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2приведет либо 0либо 2, либо , в последовательности0,0,2,2,0,0,2,2,0,0,2,...
  4. ~-xравно (x-1), поэтому ~-(n&2)( ((n&2)-1)) приводит к последовательности-1,-1,1,1,-1,-1,1,1,-1,-1,1,...
  5. Умножение двух последовательностей ~n/2и ~-(n&2)дает правильную последовательность, заданную в задаче:0,1,-1,-2,2,3,-3,-4,4,5,-5,...

Обзорная таблица:

n       ~n      ~n/2    n&2     ~-(n&2)     ~n/2*~-(n&2)
0       -1      0       0       -1          0
1       -2      -1      0       -1          1
2       -3      -1      2       1           -1
3       -4      -2      2       1           -2
4       -5      -2      0       -1          2
5       -6      -3      0       -1          3
6       -7      -3      2       1           -3
7       -8      -4      2       1           -4
8       -9      -4      0       -1          4
9       -10     -5      0       -1          5
10      -11     -5      2       1           -5

2

Brain-Flak , 86 74 72 70 байт

{({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}<>{}{<>([{}])(<>)}<>

Попробуйте онлайн!

объяснение

Этот код состоит из двух частей. Первая часть

({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}

делает мускул вычисления. Он определяет, ceil(n/2)стоит ли отменять вывод или нет.

Чтобы объяснить, как это работает, я сначала объясню, как можно рассчитать ceil(n/2). Это можно сделать с помощью следующего кода

{({}[()]<({}([{}]()))>)}{}

Это отсчитывает от n каждый раз, когда он выполняет not ( ([{}]())) на счетчике и добавляет счетчик к результату. Поскольку счетчик равен нулю половину времени, мы увеличиваем только каждый второй запуск, начиная с первого.

Теперь я хочу также вычислить знак наших результатов. Для этого мы запускаем другой счетчик. Этот счетчик изменяет состояние, только если первый счетчик выключен. Таким образом, мы получаем желаемый шаблон. Мы поместили эти два счетчика в стек для облегчения перемещения их, когда придет время.

Теперь, когда мы закончили это вычисление, наш стек выглядит так

          parity(n)
ceil(n/2) sign

Поэтому нам нужно проделать определенную работу, чтобы получить желаемый результат, как это делает вторая часть.

<>{}{<>([{}])(<>)}<>



1

QBIC , 27 26 байтов

g=(:+1)'\2`~(a-g)%2|?-g\?g

объяснение

g=          set worker var 'g' to
(:+1)           our index (plus one for the ceil() bit)
'\2`            integer divided by 2 (the int div needs a code literal: '..`
~(a-g)%2    IF index - temp result is odd (index 2 minus result 1 = 1)
|?-g        THEN PRINT g negated
\?g         ELSE PRINT g

1

Clojure 122 байта

Многословно, даже когда играешь в гольф. Я собираюсь голосовать здесь за симпатии ... :-)

Golfed:

(defn d[n](let[x(int(Math/ceil(/ n 2)))y(cond(or(and(even? n)(even? x))(and(odd? n)(odd? x)))(Math/abs x):else(- 0 x))]y))

Ungolfed:

(defn dizzy-integer [n]
  (let [x   (int (Math/ceil (/ n 2)))
        y   (cond
                (or (and (even? n) (even? x))
                    (and (odd? n)  (odd? x))) (Math/abs x)
                :else (- 0 x)) ]
    y))

1

Excel VBA 32-разрядная, 39 37 байт

Функция анонимного непосредственного окна VBE, которая принимает входные данные из ячейки A1и выводит их в непосредственное окно VBE

?[Sign((-1)^Int(A1/2))*Int((A1+1)/2)]

Ограничено 32-битным, поскольку A^Bнедопустимо в 64-битном режиме ( A ^Bнастолько близко, насколько это возможно)


Есть ли пространство между (-1)и ^[Intнужно?
Павел

@Pavel по крайней мере для 64-битной версии Excel VBA, да; Но это говорит, что я клянусь, что это не для 32-разрядной версии, но, увы, я не могу проверить это на любом
Тейлор Скотт,

@Pavel - я рассмотрел его в 32-битной системе (спецификация установки по умолчанию), и в этой системе места не требуется - я ограничил решение 32-битной системой, чтобы воспользоваться этим
Тейлор Скотт

1
Круто! Вы забыли добавить в исправленное количество байтов.
Павел

Ой, спасибо @Pavel - сейчас все исправлено
Тейлор Скотт,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.