Знайдіть i ^ n, заданий n


27

Змагання

Якнайменше символів знайдіть значення i ^ n, задане n, додатне ціле число, що перевищує 0. Це повинно виводитися у вигляді рядка.

Для тих, хто не знає, i визначається таким чином, що i ^ 2 = -1. Так:

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

Потім це повторюється ..

Правила

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

Бонусні бали

-5, якщо ви можете відпрацювати значення, де n також від'ємне

-15, якщо ви можете розробити значення для будь-якого реального числа (цей бонус включає -5 із зазначеного вище бонусу)

Удачі!


1
У якому форматі ми точно повертаємось? Через функціональний вихід або stdout?
гордий haskeller

@proudhaskeller У вікі тегів перелічені за замовчуванням для цього. Якщо не вказано інше, функції та програми є точними, вводяться через аргумент функції, STDIN або аргумент командного рядка та виводяться через STDOUT або повертають значення функції. Функції не потрібно називати.
Мартін Ендер

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

16
@BetaDecay Що таке цілі числа з плаваючою комою? oO
Мартін Ендер

2
@ MartinBüttner Haha неправильне слово: / Номер з плаваючою точкою тоді
Beta Decay

Відповіді:


15

Рубі, оцінка -2

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

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

Особливості включають: відсутні помилки округлення! (якщо ви передаєте дані як раціональні)


розміщено автором, Kezz101

Якщо ви підтримуєте будь-яке реальне число, ви можете вивести будь-яку дійсну складну форму.

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

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


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

3
Отже, чи завантаження цього 1 000 000 000 000 разів дає мені 2 ТБ вільного місця на жорсткому диску? Мені це здається гарним.
Програми Redwolf

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

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.";

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

Математика, 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 nifty :)
Мартін Ендер

8
Чи не повинні обидві відповіді бути окремими?
Джастін

@Quincunx Можливо ... спочатку вони були обидва у CJam, саме тому я поставив їх на одну відповідь. Але друга не була дійсною, тому я переніс її до Mathematica, але залишив її там, де вона була. Якщо люди наполягають, я можу їх розділити.
Мартін Ендер

І ви можете зберегти персонажа, використовуючи його f@15замість нього f[15].
orome

14

Пітон 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потрібно python призначати змінній? Як мінімум, для його виклику потрібно оточити його в дужках, додавши два байти, щоб його можна було викликати (lambda...)(n).
mbomb007

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

11

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

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

Якщо ви хочете отримати комплексне повернене значення, замініть iкінець на (комплекс i).


@ MartinBüttner TI-Basic, здається, використовує якийсь тип 'Expression', і вбудовані методи повертають для них точні результати.
Shujal

Я бачу, все добре тоді. ;)
Мартін Ендер

Що стосується правила "Якщо ваша мова підтримує складні числа, не використовуйте жодних функцій чи арифметики, які могли б це вирішити". + i - арифметична
edc65

@ edc65 + насправді є складною операцією. Однак якщо вам це не подобається, замініть нормальнимi . Якщо змінна iне визначена, ви отримаєте комплексне число, просто за допомогою, iа не . Я просто розраховую реальні та уявні частини окремо.
Shujal

1
@Shujal У такому випадку, я думаю, вам iвсе одно слід скористатися . Складний я навіть не є персонажем, про який задається запитання, і це врятує вас два байти, тож ви хоч би прив'язали до мене;).
Мартін Ендер

7

Marbelous , 43 байти

Насправді не переможець, але Marbelous - це весело. :)

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

Це програма, яка читає вхід як одне ціле число з першого аргументу командного рядка. Зауважте, що вхід приймається по модулю 256, але це не впливає на достовірність результату для входів, що перевищують 255, оскільки 256 ділиться на 4.

Пояснення

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

Давайте переглянемо використовувані пристрої:

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

Тому, фактично, я повинен тримати трьох відповідних символів у трьох синхронізаторах і випускати ті, залежно від того, як на вході встановлено найменш значущі біти.

Для отримання додаткової інформації дивіться проект проекту .


1
Мені дуже подобається цей! Faber 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]). Але вона менш сексуальна і не підтримує негативних сил. Це залежить від бонусу, який я здогадуюсь.
Майкл М.

Nop, 29 байт. Мінус підтримується цим кодом.
Майкл М.

Чи має JS бітовий &оператор? Якщо це так, ви можете зробити &3справжню операцію з модулем-4. Редагувати: виглядає так, як &2це використовується у вашій відповіді ...
feersum

5

Python 28 байт - 5 = 23

Підтримує -ve входи.

Припустимо, що лямбда-функції прийнятні (спасибі 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 (Діалог) , 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 - Тепер, знову ж таки, скористається тим, що "i" знаходиться на відстані 56 (0x38 або '8) символів від "1".


3

Оцінка Java 8: 72

На Яві - найгірша гольф мова коли-небудь! Гольф:

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

Розширено:

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"};

Розширено:

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пакеті.
Anubian Noob

5
@ Anubian Noob importімпортує лише класи в цьому пакеті. Він не імпортує жодного класу з пакунків у цьому пакеті. Наприклад, клас Functionє в пакеті, java.util.functionале не в пакеті java.util.
TheNumberOne

О мій поганий, вибач за це.
Anubian Noob

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 is -i, rather than i, guess it just adds 1 char. -- Sidenote for other readers: without the first rule of the challenge, the Matlab solution would only be 3 characters long.
Dennis Jaheruddin

Yes, that was a typo. Fixed! Thanks for noticing... At least the second (a bit more interesting) approach is correct =)
Stewie Griffin

3

C 77

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

Improved thanks to Ruslan

C 74-5=69

Oh and of course the most obvious approach

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

2
You can remove parentheses around n%2 and use ~ instead of ! because negating n first, then %ing with 2 will give the same result, at least for n<(1<<32)-1. And C doesn't require to explicitly define return type for function, so you can remove int at the beginning. And also use 0 instead of '\0'. Thus -9 chars.
Ruslan

3

OCaml 47

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

Not an award winning solution, but this is my first time code-golfing, so I'm not exactly sure of what I'm doing. I tried to use pattern matching, but that got me over 58.


3

Pari/GP, 19 bytes - 5 = 14

As a ring, C is isomorphic to R[x]/(x2+1).

n->Str(i^n%(i^2+1))

The i here is just a symbol, not the imaginary unit (which is I in Pari/GP).

Try it online!


2

Ruby 32-5=27

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

Works for negative powers!


You can trivially golf this more with puts %w[1 i -1 i][gets.to_i % 4].
histocrat

2

Perl, 26 - 5 = 21

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

works as a standalone program (argument on the commandline) or the body of a function.


2

Java: 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");
    }
}

As a function: 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");
}

Yes, yet another Java reply - and golfed even worse than ever. But you work with what you can...

EDIT: added function version.

EDIT 2: so, after a bit of trial and error, here's a version that tries to do it by the book, without exploring the cycle loophole. So…

Java with value calculation: 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");
    }
}

(at least, I think I can claim the top bonus, correct me otherwise)


you could reduced your code, if you pass it to main as argument.
user902383

@user902383 I could always make a function, indeed. Probably will post both versions, too.
Rodolfo Dias

actually i was thinking about parsing it, so you will have int n = Integer.parseInt(a[0])
user902383

@user902383 Daaaaamn, didn't even remember that. thumbs up
Rodolfo Dias

2

Python - 31

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

I have only recently started learning python. Even though I know it's not good, it's the best I can do.


2

Haskell GHCi, 29 Bytes - 15 = 14

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

Usage:

*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 bytes

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

Try it online!

Same as most methods above, takes a modulo of 4, and increases that by 1, because R's arrays are 1-indexed. Works for negative integers as well.

I was worried about mixed outputs here, but Giuseppe pointed out that R coerces numeric types to string types when they are mixed.



@Giuseppe Totally blanked on that. My concern with that is that the output is technically mixed, half string, half numeric.
Sumner18

nope, R automatically coerces numeric types to character when they're mixed! Hadley's book explains this pretty well -- just Ctrl + F to "Coercion" and you'll see it, but the whole book is worth a read (for non-golfing purposes mostly, but sometimes you pick up a trick or two, heheh)
Giuseppe


1

Haskell, 29 bytes - 5 = 24

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

Works for negative powers.

I had a pointfree version worked out, but it turns out it's actually longer.

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

1

Clojure (64 54 31 chars)

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

Edit

Per @SeanAllred's suggestion, here's a version which uses a literal vector instead of a case function:

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

Edit 2

By counting on the REPL to print out the resultant collection and coding the function using the #() shortcut we can reduce it to

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

(Which is actually much more Clojure/Lisp-ish as the function now actually returns the generated result, allowing the function to be used with map, as in

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

which prints

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

Share and enjoy.


Instead of using a select structure, can't you use some sort of explicit array as in my answer?
Sean Allred


1

C 105, was 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);
}

It doesn't even compile because you must parenthesize the assignments after : in ?: statements in plain C. Also, what's the point of using 0==0 when you can use single char 1? And no need in parentheses before ?. Also, the last ?: statement could be shortened to c[j]=i&1?'i':'1';.
Ruslan

@Ruslan In CodeBlocks Mingw there is only 1 warning around i&0. i&0==0 is a test for even, if i is even the result is 0 else it is 1.
bacchusbeale

Yeah, but what's the point of using 0==0 when it's identical to 1? Note that == has higher precedence than &, otherwise your (supposed) test of (i&0)==0 would always be true.
Ruslan

1

PARI/GP, 26 - 5 = 21

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

n->cos(t=Pi*n/2)+I*sin(t) is one character shorter, but doesn't handle exact answers. Of course n->I^n is disallowed, and presumably also PARI's powIs.


1

Jelly, 2 - 20 = -18 bytes

ı*

Try it online!

It doesn't use an i ^ x builtin but it uses builtins for 1j and ** so not sure if allowed.


"If your language supports complex numbers, don't use any functions or arithmetic that could work this out." I think it's pretty clear...
totallyhuman

@totallyhuman Well, I'm not sure if the 1j literal is banned either though?
Erik the Outgolfer

Yeah, but the arithmetic (*) is.
totallyhuman

1
@totallyhuman Hm, maybe I'll add another version below, although "don't use any functions or arithmetic that could work this out" seems to suggest that I can't use a built-in to do this exact task...BTW the way he phrases it gets me to think that you're encouraged to use 1j literals.
Erik the Outgolfer

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.