Найти I ^ N, учитывая N


27

Соревнование

В минимально возможном количестве символов найдите значение i ^ n, если n положительное целое число больше 0. Это должно быть выведено в виде строки.

Для тех, кто не знает, я определен так, что я ^ 2 = -1. Так:

  • я ^ 1 = я
  • я ^ 2 = -1
  • я ^ 3 = -i
  • я ^ 4 = 1

Это потом повторяется ..

правила

  • Если ваш язык поддерживает комплексные числа, не используйте какие-либо функции или арифметику, которые могли бы решить эту проблему.
  • Неточности с плавающей запятой хороши для ответов, которые все равно будут возвращать десятичные дроби, но целочисленные значения должны давать точные результаты

Бонусные очки

-5, если вы можете определить значение, где n также отрицательно

-15, если вы можете определить значение для любого действительного числа (этот бонус включает -5 из вышеуказанного бонуса)

Удачи!


1
В каком формате мы вернемся точно? Через выход функции или стандартный вывод?
гордый haskeller

@proudhaskeller В теге wiki перечислены значения по умолчанию для этого. Если не указано иное, функции и программы в порядке, вводятся через аргумент функции, STDIN или аргумент командной строки и выводятся через STDOUT или возвращаемое значение функции. Функции не должны быть названы.
Мартин Эндер,

1
@ MartinBüttner, но если я выбираю вывод функции, как вывод должен быть отформатирован / сохранен без собственных комплексных чисел на моем языке?
гордый haskeller

16
@BetaDecay Что такое целые числа с плавающей точкой? oO
Мартин Эндер

2
@ MartinBüttner Ха-ха, неверное слово: / Число с плавающей запятой тогда
Beta Decay

Ответы:


15

Рубин, оценка -2

(13 байт, бонус -15)

->n{[1,90*n]}

Особенности включают в себя: нет ошибок округления! (если вы передаете вход как Rational)


опубликовано автором, Kezz101

Если вы поддерживаете любое действительное число, вы можете вывести его в любой действительной сложной форме

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

Создает анонимную функцию и выводит массив с 2 записями, представляющими комплексное число в полярной форме (угловая единица: градусы).


4
"Рубин, -2 байта" .....
FantaC

3
Итак, дает ли эта загрузка 1 000 000 000 000 раз 2 ТБ свободного места на жестком диске? Звучит как отличная сделка для меня.
Программы

^ Мой браузер сломался, прежде чем мне удалось это сделать. Может быть, попробовать "бомбу" с файлом внутри? (Распаковка это экономит место.)
А

15

CJam, 12 символов - 5 = 7

1'iW"-i"]li=

Проверьте это здесь.

Поддерживает отрицательные входы.

1              "Push 1.";
 'i            "Push the character i.";
   W           "Push -1.";
    "-i"       "Push the string -i.";
        ]      "Wrap all four in an array.";
         li    "Read STDIN and convert to integer.";
           =   "Access array. The index is automatically taken module the array length.";

Результат распечатывается автоматически в конце программы.

Mathematica, 22 20 19 символов - 15 = 4

Sin[t=π#/2]i+Cos@t&

Это анонимная функция, которую вы можете использовать как

Sin[t=π#/2]i+Cos@t&[15]

(Или назначьте это, чтобы fсказать, и затем сделайте f[15].)

Поддерживает реал и дает точные результаты для целочисленного ввода.

Обратите внимание, что iэто не комплекс Mathematica i (который есть I). Это просто неопределенная переменная.

Кроме того, несмотря на порядок выражения, Mathematica переупорядочит вывод в R+Ciформу.


Вам не нужно 4%. Это может быть сделано автоматически.
jimmy23013

@ user23013 отличный :)
Мартин Эндер

8
Разве два ответа не должны быть отдельными?
Джастин

@Quincunx Может быть ... изначально они оба были в CJam, поэтому я поставил их в одном ответе. Но второй был недействительным, поэтому я перенес его в Mathematica, но оставил там, где он был. Если люди настаивают, я могу разделить их.
Мартин Эндер

И вы можете сохранить символ, используя его f@15вместо f[15].
ором

14

Python 2 - (24-5) = 19

lambda n:'1i--'[n%4::-2]

Большая часть кредита принадлежит @ user2357112, я просто отыграл его ответ из комментариев к этому ответу немного больше.

Объяснение: Начинается с индекса n%4в строке '1i--'. Затем выполняется итерация в обратном порядке шагами по две над каждой буквой в строке. Так, например, n=6сначала начинается с индекса 2 -, затем пропускается iи принимается 1, чтобы вернуться -1.

@xnor указал решение той же длины:

lambda n:'--i1'[~n%4::2] 

Пиф - (14-5) = 9

Я могу только получить 14, независимо от того, как я пытаюсь повернуть вспять / разрезать / и т.д. : '(

%_2<"1i--"h%Q4

По сути, это то же самое, что и приведенный выше ответ python, но в 2 этапа, потому что pyth не поддерживает полные параметры индексации python. Попробуйте онлайн.

Я собираюсь поговорить с isaacg об индексации Pyth;)


Разве питону не lambdaнужно присваивать переменную? По крайней мере, чтобы вызвать его, вам нужно заключить его в круглые скобки, добавив два байта, чтобы он мог быть вызван (lambda...)(n).
mbomb007

@ mbomb007 Согласно мета это приемлемо. Код здесь создает функцию, которая выполняет требуемую задачу. Анонимные лямбды относительно часто используются в python для таких функций, как mapи sorted.
FryAmTheEggman

11

TI-BASIC (NSpire) - 5 (20 символов-15)

cos(nπ/2)+sin(nπ/2)i

Если вы хотите получить сложное возвращаемое значение, замените iв конце на (complex i).


@ MartinBüttner TI-Basic, кажется, использует какой-то тип «выражения», и встроенные методы возвращают точные результаты для них.
Шуджал

Я вижу, все хорошо тогда. ;)
Мартин Эндер

Как насчет правила «Если ваш язык поддерживает комплексные числа, не используйте какие-либо функции или арифметику, которые могли бы решить эту проблему». + я арифметика
edc65

@ edc65 + на самом деле сложная операция. Однако, если вам это не нравится, замените его нормальным i. Если переменная iне определена, вы получите комплексное число, просто iвместо . Я просто вычисляю реальные и мнимые части отдельно.
Шуджал

1
@Shujal В этом случае, я думаю, вы должны использовать в iлюбом случае. Комплекс я даже не тот персонаж, о котором спрашивает вопрос, и он сэкономит вам два байта, так что вы, по крайней мере, свяжетесь со мной;).
Мартин Эндер

7

Marbelous , 43 байта

Не совсем победитель, но Марбелоус - это весело. :)

}0
^0
=0&2
&1
}0
^1\/
=0&02D3169
\/\/&0&1&2

Это программа, которая читает входные данные как одно целое число из первого аргумента командной строки. Обратите внимание, что ввод берется по модулю 256, но это не влияет на достоверность результата для входов больше 255, потому что 256 делится на 4.

объяснение

Marbelous - это двумерный язык программирования, который имитирует "шарики" (байтовые значения), падающие через множество устройств. Доска состоит из двухсимвольных ячеек (устройств), которые могут обрабатывать шарики. Все, что падает с нижней части доски, печатается на STDOUT.

Давайте рассмотрим используемые устройства:

  • }0где первый аргумент командной строки идет. Я использовал два экземпляра этого устройства, поэтому я получаю две копии входного значения (одновременно).
  • ^nпроверяет nбит входного мрамора (где n=0младший бит) и производит 1или 0зависит от бита.
  • =0проверяет равенство с 0. Если входной мрамор равен, он просто падает прямо через, если это не так, он толкается вправо.
  • \/ это мусорное ведро, поэтому он просто проглатывает входной мрамор и никогда ничего не производит.
  • 2Dявляется ASCII код -, 31является ASCII код 1и 69является ASCII код i.
  • Это &nсинхронизаторы. Синхронизаторы останавливают мрамор до тех пор, пока все синхронизаторы с одним и тем же не nудержат мрамор, и в этот момент все они позволят провалиться хранящемуся мрамору.

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

Для получения дополнительной информации см. Проект спецификации .


1
Мне очень нравится этот! Marbelous звучит потрясающе, мне нужно будет это проверить в ближайшее время :)
Kezz101

3
@ Kezz101 У нас есть черновик спецификации здесь
Мартин Эндер,

О, классно! Это выглядит действительно интересно
Kezz101

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

1
@overactor Хм, я не знаю ... вывод дополнительных символов (даже если они не печатаются) все еще нарушает формат вывода для меня. Может быть стоит мета вопрос, хотя.
Мартин Эндер

6

JavaScript (ES6) 29-5 = 24

Поддерживает отрицательную силу.

f=n=>(n&2?'-':'')+(n&1?'i':1)

ES5:

function f(n){return (n&2?'-':'')+(n&1?'i':1)}

Да, короче ( f=n=>[1,'i',-1,'-i'][n%4]). Но это менее сексуально и не поддерживает отрицательные силы. Это зависит от бонуса, я думаю.
Майкл М.

Нет, 29 байтов. Отрицательные поддерживаются с этим кодом.
Михаил Михайлович

У JS есть побитовый &оператор? Если это так, вы можете сделать &3для операции истинного модуля-4. Изменить: похоже, что он делает, как &2используется в вашем ответе ...
Feersum

5

Python 28 байт - 5 = 23

Поддерживает -ве входы.

Предполагая, что лямбда-функции приемлемы (спасибо FryAmTheEggman!):

lambda n:n%4/2*'-'+'1i'[n%2]

в противном случае 31 байт - 5 = 26

print[1,"i",-1,"-i"][input()%4]

1
Вы не можете назвать это точно. Вы должны хранить его там, где вы можете получить к нему доступ. Таким образом, вы можете сделать foo=..., или вы можете сделать, map(<your lambda>,range(10))чтобы получить список значений i^nиз 0-9.
FryAmTheEggman

2
В основном вы делаете указатель на функцию, если это более понятно: P
FryAmTheEggman

3
@DigitalTrauma: Да, хотя вы можете добиться большего успеха с помощью трюков с нарезкой строк. Например, lambda n:'--1i'[n%4-2::2].
user2357112 поддерживает Monica

2
Чтобы перевести сообщение user2357112: возьмите все остальные символы, '--1i'начиная с индекса n%4-2. Когда python получает отрицательный индекс, он начинает с того количества позиций, которое осталось от конца массива, и затем поднимается до 0. Таким образом, 0и 1никогда не ударяй по -указателям, пока так 3и 4сделай.
FryAmTheEggman

1
lambda n:n%4/2*'-'+'1i'[n%2]Убирает пробел и короче :)
FryAmTheEggman

4

(Emacs) Лисп - 34

Просто для удовольствия, в (Emacs) Lisp:

(lambda(n)(elt[1 i -1 -i](% n 4)))

Если вы хотите использовать его, используйте defunили используйте funcall:

(funcall
 (lambda (n) (elt [1 i -1 -i] (% n 4)))
 4) => 1

(mapcar
 (lambda(n)(elt[1 i -1 -i](% n 4)))
 [0 1 2 3 4 5 6 7 8])
 => (1 i -1 -i 1 i -1 -i 1)

4

APL (Dyalog) , 8 символов - 15 бонусов = оценка -7

Встроенная (и, следовательно, запрещенная) функция есть 0J1*⊢, но для этого используется метод @ blutorange .

¯12○.5×○

Автор вызова, Kezz101, написал :

Если вы поддерживаете любое действительное число, вы можете вывести его в любой действительной сложной форме

Это возвращает комплексное число в форме, aJbкоторая является нормальным способом для APL отображать комплексные числа.

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

объяснение

¯12○ найти единичный вектор, который имеет угол в радианах

.5× полтора раза

 аргумент, умноженный на 𝜋 (константа круга)



3

Befunge-98, 41-5 = 36 35-5 = 30 32-5 = 27

&4%:01-`!4*+:2%'8*'1+\2/d*' +,,@

Поддерживает отрицательные целые числа. Не собираюсь выигрывать никаких наград с этим решением, но как угодно

Он просто принимает число в качестве входных данных, делает некоторую хитрость с модулем (который, к сожалению, не работает как обычный модуль для отрицательных чисел в интерпретаторе, который я использовал для его проверки), чтобы заставить работать негативы, а затем выполняет некоторые глупые условия, чтобы решить, каким должен быть каждый персонаж.

Я уверен, что это может быть гораздо лучше. А пока вот еще одно решение, которое не принимает негативы, но компенсирует потерю бонуса, будучи короче:

Befunge-98, 32 26 23

&4%:2%'8*'1+\2/d*' +,,@

Редактировать - теперь используется тот факт, что «-» находится на расстоянии 13 (0xd) символов от «».

Редактировать 2 - Теперь, опять же, используется тот факт, что «я» 56 символов (0x38 или '8) от «1».


3

Java 8 Оценка: 72

На Яве самый худший язык в гольф! Golfed:

java.util.function.Function s=n->{new String[]{"i","-1","-i","1"}[n%4]};

Expanded:

class Complex{

    java.util.function.Function s = n -> {new String[]{"i","-1","-i","1"}[n%4]};

}

Примечание: я не привык к Java 8. У меня также пока нет времени выполнения. Пожалуйста, сообщите мне, если есть какие-либо синтаксические ошибки. Это тоже мой первый гольф.

Редактировать: Удалено import.

Редактировать: Удалено объявление класса.

Еще один ответ с оценкой = 87 - 15 = 72

java.util.function.Function s=n->{Math.cos(n*Math.PI/2)+"+"+Math.sin(n*Math.PI/2)+"i"};

Expanded:

class Complex{

    java.util.function.Function s = n -> {Math.cos(n * Math.PI/2) + " + " + Math.sin(n * Math.PI/2) + "i"};

}

Вы можете сохранить некоторые из них с помощью "import java.util. *"
Anubian Noob

@Anubian Функция Noob класса в пакете java.util.functionне java.util(или я ошибаюсь?).
TheNumberOne

Но если вы делаете java.util.*на .*средства импорта все под пакет. Также как вы сейчас импортируете все классы в fuctionпакете.
Анубиан Нуб

5
@ Anubian Noob importимпортирует только классы в этом пакете. Он не импортирует ни один из классов из пакетов в этом пакете. Например, класс Functionнаходится в пакете, java.util.functionно не в пакете java.util.
TheNumberOne

Боже мой, извините за это.
Анубиан Нуб

3

MATLAB, 33 байта - 5 = 28

x={'i','-1','-i','1'};x(mod(n,4))

Несмотря на то, что это на несколько байтов больше (37-5 = 32), мне на самом деле нравится такой подход:

x='1i -';x((mod([n/2,n],2)>=1)+[3,1])

i^3это -i, скорее , чем i, думаю , это только добавляет 1 символ. - Sidenote для других читателей: без первого правила задачи решение Matlab будет иметь длину всего 3 символа.
Деннис Джаэруддин

Да, это была опечатка. Исправлена! Спасибо, что обратили внимание ... По крайней мере, второй (немного более интересный) подход верен =)
Стьюи Гриффин,

3

C 77

main(){int n;scanf("%d",&n);char c[]={n%4>1?'-':' ',~n%2?'1':'i',0};puts(c);}

Улучшено благодаря Руслану

С 74-5 = 69

Ну и конечно самый очевидный подход

main(){unsigned n,*c[]={"1","i","-1","-i"};scanf("%d",&n);puts(c[n%4]);}

2
Вы можете убрать круглые скобки n%2и использовать ~вместо, !потому что nсначала отрицание , а затем использование %2 даст тот же результат, по крайней мере, для n<(1<<32)-1. И C не требует явно определять тип возвращаемого значения для функции, так что вы можете удалить int в начале. А также используйте 0вместо '\0'. Таким образом -9 символов.
Руслан

3

OCaml 47

let m n=List.nth["1";"i";"-1";"-i"](n mod 4);;

Не удостоенное наград решение, но это мой первый раз, когда я играю в код, так что я не совсем уверен в том, что я делаю. Я пытался использовать сопоставление с образцом, но это дало мне больше 58.



2

Руби 32-5 = 27

puts(%w[1 i -1 -i][gets.to_i%4])

Работает на негативные силы!


Вы можете тривиально играть в гольф с этим больше puts %w[1 i -1 i][gets.to_i % 4].
гистократ

2

Perl, 26 - 5 = 21

say qw(1 i -1 -i)[pop()%4]

работает как отдельная программа (аргумент в командной строке) или как тело функции.


2

Ява: 151 131-5 = 126

Golfed:

class A{public static void main(String[]a){int n=Integer.parseInt(a[0]);System.out.print(n%4==0?"1":n%4==1?"i":n%4==2?"-1":"-i");}}

Ungolfed:

class A {
    public static void main(String[] a) {
        int n = Integer.parseInt(a[0]);
        System.out.print(n % 4 == 0 ? "1" : n % 4 == 1 ? "i" : n % 4 == 2 ? "-1" : "-i");
    }
}

Как функция: 72-5 = 67

Golfed:

void f(int n){System.out.print(n%4==0?"1":n%4==1?"i":n%4==2?"-1":"-i");}

Ungolfed:

public void f(int n) {
    System.out.print(n % 4 == 0 ? "1" : n % 4 == 1 ? "i" : n % 4 == 2 ? "-1" : "-i");
}

Да, еще один ответ Java - и игра в гольф еще хуже, чем когда-либо. Но вы работаете с тем, что вы можете ...

РЕДАКТИРОВАТЬ : добавлена ​​версия функции.

РЕДАКТИРОВАТЬ 2 : так, после небольшого проб и ошибок, вот версия, которая пытается сделать это по книге, не исследуя лазейку цикла. Так…

Java с вычислением значения: 146-15 = 131

Golfed:

class B{public static void main(String[]a){float n=Float.parseFloat(a[0]);System.out.print(Math.cos((n*Math.PI)/2)+Math.sin((n*Math.PI)/2)+"i");}}

Ungolfed:

class B {
    public static void main(String[] a) {
        float n = Float.parseFloat(a[0]);
        System.out.print(Math.cos((n * Math.PI) / 2) + Math.sin((n * Math.PI) / 2) + "i");
    }
}

(по крайней мере, я думаю, что могу претендовать на главный бонус, поправьте меня иначе)


Вы можете уменьшить свой код, если передадите его в main в качестве аргумента.
user902383

@ user902383 Я всегда мог сделать функцию. Возможно выложу обе версии тоже.
Родольфо Диас

на самом деле я думал о разборе, так что у вас будетint n = Integer.parseInt(a[0])
user902383

@ user902383 Дааааамн, даже не помнил этого. недурно
Родольфо Диас

2

Python - 31

print[1,'i',-1,'-i'][input()%4]

Я только недавно начал изучать Python. Хотя я знаю, что это не хорошо, это лучшее, что я могу сделать.


2

Haskell GHCi, 29 байт - 15 = 14

i p=[cos(p*pi/2),sin(p*pi/2)]

Использование:

*Main> i 0
[1.0,0.0]
*Main> i pi
[0.22058404074969779,-0.9753679720836315]
*Main> i (-6.4)
[-0.8090169943749477,0.5877852522924728]

2

R , 29 - 5 = 24 байта

c(1,"i",-1,"-i")[scan()%%4+1]

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

То же самое, что и большинство методов выше, принимает модуль по 4 и увеличивает его на 1, потому что массивы R индексируются 1. Работает и для отрицательных целых чисел.

Я беспокоился о смешанных выводах здесь, но Джузеппе указал, что R приводит числовые типы к строковым типам, когда они смешаны.



@Giuseppe Полностью об этом не знает. Меня беспокоит то, что результат является технически смешанным, наполовину строковым, наполовину числовым.
Sumner18

Нет, R автоматически приводит numericтипы к тому, characterкогда они смешиваются! Книга Хэдли объясняет это довольно хорошо - просто Ctrl + F, чтобы «Принуждение», и вы увидите это, но всю книгу стоит прочитать (в основном для целей, не связанных с гольфом, но иногда вы берете трюк или два, хе-хе )
Джузеппе


1

Haskell, 29 байт - 5 = 24

f n=words"1 i -1 -i"!!mod n 4

Работает на негативные силы.

У меня была отработана точечная версия, но оказалось, что на самом деле она длиннее.

f=(words"1 i -1 -i"!!).(`mod`4)

1

Clojure ( 64 54 31 символов)

(defn i2n[n](println(case(mod n 4) 1 "i" 2 "-1" 3 "-i" 0 "1")))

редактировать

Согласно предложению @ SeanAllred, вот версия, в которой вместо caseфункции используется буквенный вектор :

(defn i2n[n](println (["1" "i" "-1" "-i"] (mod n 4))))

Редактировать 2

Полагаясь на REPL для распечатки результирующей коллекции и кодирования функции с помощью #()ярлыка, мы можем уменьшить его до

#(["1" "i" "-1" "-i"](mod % 4))

(Что на самом деле намного больше Clojure / Lisp-ish, так как функция теперь фактически возвращает сгенерированный результат, позволяя использовать функцию map, как в

(map #(["1" "i" "-1" "-i"](mod % 4)) [0 1 2 3 4 5 6 7 8])

какие отпечатки

("1" "i" "-1" "-i" "1" "i" "-1" "-i" "1")

Поделитесь и наслаждайтесь.


Вместо использования структуры выбора, вы не можете использовать какой-то явный массив, как в моем ответе ?
Шон Оллред


1

С 105, был 117

char c[2];
int main()
{
int n,i,j=0;scanf("%d",&n);i=n%4;
i>1?c[j++]='-':c[j+1]='\0';
c[j]=i&1?'i':'1';
puts(c);
}

Он даже не компилировать , потому что вы должны скобки задания после того, как :в ?:отчетности в простом C. Кроме того , в чем смысл использования , 0==0когда вы можете использовать одиночный символ 1? И нет необходимости в скобках раньше ?. Кроме того, последнее ?:утверждение может быть сокращено до c[j]=i&1?'i':'1';.
Руслан

@Ruslan В CodeBlocks Mingw есть только 1 предупреждение вокруг i & 0. i & 0 == 0 - это тест на
четность

Да, но какой смысл использовать, 0==0когда он идентичен 1? Обратите внимание, что ==имеет более высокий приоритет, чем &, иначе ваш (предполагаемый) тест (i&0)==0всегда будет верным.
Руслан

1

PARI / GP , 26 - 5 = 21

n->Str([1,I,-1,-I][n%4+1])

n->cos(t=Pi*n/2)+I*sin(t)на один символ короче, но не обрабатывает точных ответов. Конечно, n->I^nне разрешено, и, вероятно, также PARI powIs.


1

Желе , 2 - 20 = -18 байт

ı*

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

Он не использует i ^ xвстроенные функции, но использует встроенные функции для, 1jи **поэтому не уверен, разрешено ли это.


«Если ваш язык поддерживает комплексные числа, не используйте какие-либо функции или арифметику, которые могли бы решить эту проблему». Я думаю, что это довольно ясно ...
полностью человек

@totallyhuman Ну, я не уверен, что 1j литерал также запрещен?
Эрик Outgolfer

Да, но арифметика ( *) есть.
полностью человек

1
@totallyhuman Хм, может быть, я добавлю еще одну версию ниже, хотя «не используйте какие-либо функции или арифметику, которые могли бы решить эту проблему», похоже, говорит о том, что я не могу использовать встроенный модуль для выполнения этой конкретной задачи ... Кстати, то, как он выражается, заставляет меня думать, что вам рекомендуется использовать 1jлитералы.
Эрик Outgolfer

1

05AB1E , оценка 5 (10 байт - 5 бонусов)

'i®„-i1)Iè

Попробуйте онлайн или проверьте еще несколько тестов .

Объяснение:

'i         '# Push character "i"
  ®         # Push -1
   „-i      # Push string "-i"
      1     # Push 1
       )    # Wrap everything on the stack into a list: ["i", -1, "-i", 1]
        Iè  # Use the input to index into it (0-based and with automatic wrap-around)
            # (and output the result implicitly)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.