Encontre i ^ n, dado n


27

O desafio

No menor número de caracteres possível, encontre o valor de i ^ n, dado n, um número inteiro positivo maior que 0. Isso deve ser gerado como uma String.

Para aqueles que não sabem, i é definido de forma que i ^ 2 = -1. Tão:

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

Isso então se repete ..

Regras

  • Se o seu idioma suportar números complexos, não use nenhuma função ou aritmética que possa resolver isso.
  • Imprecisões de ponto flutuante são boas para respostas que retornariam decimais de qualquer maneira, mas entradas inteiras devem fornecer resultados exatos

Pontos bônus

-5 se você puder calcular o valor em que n também é negativo

-15 se você puder calcular o valor para qualquer número real (esse bônus inclui -5 do bônus acima)

Boa sorte!


1
Em que formato retornamos exatamente? Através da saída da função ou stdout?
haskeller orgulhoso

@proudhaskeller A tag wiki lista os padrões para isso. A menos que especificado de outra forma, funções e programas são bons, entrada via argumento da função, STDIN ou argumento da linha de comando e saída via STDOUT ou valor de retorno da função. As funções não precisam ser nomeadas.
Martin Ender

1
@ MartinBüttner mas se eu escolher a saída da função, como a saída deve ser formatada / armazenada sem números complexos nativos no meu idioma?
haskeller orgulhoso

16
@BetaDecay O que são números inteiros de ponto flutuante? oO
Martin Ender

2
@ MartinBüttner Haha palavra errada: / Número do ponto flutuante então
Decaimento Beta

Respostas:


15

Pontuação Ruby -2

(13 bytes, -15 de bônus)

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

Os recursos incluem: sem erros de arredondamento! (se você passar a entrada como um Rational)


publicado pelo autor, Kezz101

Se você oferecer suporte a qualquer número real, poderá gerar qualquer forma complexa válida.

Pontuações negativas fazem minha adrenalina avançar. Assim, as regras são abusadas são utilizadas para atingir esse objetivo nobre.

Cria uma função anônima e gera uma matriz com 2 entradas que representam um número complexo na forma polar (unidade angular: graus).


4
"Ruby, -2 bytes" .....
FantaC 20/17/17

3
Então, o download dessas 1.000.000.000.000 de vezes me dá 2 TB de espaço livre no disco rígido? Parece um bom negócio para mim.
Programas Redwolf

^ Meu navegador quebrou antes que eu conseguisse fazer isso. Talvez tente uma "bomba zip" com o arquivo dentro? (Extrair ele economiza espaço.)
A

15

CJam, 12 caracteres - 5 = 7

1'iW"-i"]li=

Teste aqui.

Suporta entradas negativas.

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

O resultado é impresso automaticamente no final do programa.

Mathematica, 22 20 19 caracteres - 15 = 4

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

Esta é uma função anônima, que você pode usar como

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

(Ou atribua-o a fdizer e faça f[15].)

Suporta reais e fornece resultados exatos para entrada inteira.

Observe que nãoi é o complexo i do Mathematica (que é ). É apenas uma variável indefinida.I

Além disso, apesar da ordem da expressão, o Mathematica reordenará a saída em R+Ciforma.


Você não precisa do 4%. Isso pode ser feito automaticamente.
precisa saber é o seguinte

@ user23013 astucioso :) #
Martin Ender

8
As duas respostas não deveriam ser separadas?
Justin

@ Quincunx Talvez ... originalmente eles estavam no CJam, e é por isso que os coloquei na mesma resposta. Mas o segundo não era válido, então eu o enviei para o Mathematica, mas o deixei onde estava. Se as pessoas insistirem, eu posso separá-las.
Martin Ender

E você pode salvar um personagem usando-o em f@15vez de f[15].
Orome

14

Python 2 - (24-5) = 19

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

A maior parte do crédito pertence a @ user2357112, apenas respondi um pouco mais a resposta dele nos comentários sobre essa resposta .

Explicação: Inicia no índice n%4na sequência '1i--'. Em seguida, itera para trás em etapas de dois sobre cada letra da string. Assim, por exemplo, n=6começaria no índice 2, o primeiro -, depois ignoraria ie pegaria o 1, para retornar -1.

@xnor apontou uma solução do mesmo comprimento:

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

Pitão - (14-5) = 9

Eu só consigo obter 14, não importa como eu tente inverter / cortar / etc. : '(

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

Que é essencialmente o mesmo que a resposta python acima, mas em 2 etapas, porque o pyth não suporta as opções de indexação completas do python. Experimente online.

Vou conversar com isaacg sobre a indexação Pyth;)


O python não lambdaprecisa ser atribuído a uma variável? No mínimo, para chamá-lo, você precisará colocá-lo entre parênteses, adicionando dois bytes para que ele possa ser chamado (lambda...)(n).
mbomb007

@ mbomb007 De acordo com a meta, isso é aceitável. O código aqui cria uma função que executa a tarefa necessária. Lambdas anônimas são usadas com relativa frequência em python para funções como mape sorted.
FryAmTheEggman

11

TI-BASIC (NSpire) - 5 (20 caracteres-15)

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

Se você deseja receber um valor de retorno complexo, substitua ino final por (complexo i).


@ MartinBüttner O TI-Basic parece usar algum tipo de 'Expressão', e os métodos internos retornam resultados exatos para eles.
Shujal 21/11

Entendo, tudo bem então. ;)
Martin Enders

E a regra "Se o seu idioma suportar números complexos, não use nenhuma função ou aritmética que possa resolver isso". + i é aritmética
edc65

@ edc65 O + é realmente uma operação complexa. No entanto, se você não gostar disso, substitua-o por um normal i. Se a variável inão estiver definida, você obterá o número complexo, apenas com em ivez de . Estou apenas calculando as partes reais e imaginárias separadamente.
Shujal 21/11

1
@Shujal Nesse caso, acho que você deveria usar de iqualquer maneira. O complexo i nem mesmo é o personagem que a pergunta pede, e você economizará dois bytes, então você pelo menos amarraria comigo;).
Martin Ender

7

Marbelous , 43 bytes

Não é realmente um vencedor, mas Marbelous é divertido. :)

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

Este é um programa que lê a entrada como um único inteiro a partir do primeiro argumento da linha de comando. Observe que a entrada é obtida no módulo 256, mas isso não afeta a validade do resultado para entradas maiores que 255, porque 256 é divisível por 4.

Explicação

Marbelous é uma linguagem de programação 2D, que simula "bolinhas de gude" (valores de bytes) caindo em vários dispositivos. O quadro é composto de células largas de 2 caracteres (os dispositivos), que podem processar os mármores. Tudo o que cai do fundo de um quadro é impresso em STDOUT.

Vamos examinar os dispositivos em uso:

  • }0é onde o primeiro argumento da linha de comando vai. Eu usei duas instâncias deste dispositivo, então recebo duas cópias do valor de entrada (ao mesmo tempo).
  • ^nverifica o nth bit do mármore de entrada (onde n=0é o bit menos significativo) e produz 1ou 0depende do bit.
  • =0verifica a igualdade com 0. Se o mármore de entrada for igual, ele simplesmente cai direto, se não for, é empurrado para a direita.
  • \/ é uma lata de lixo, apenas engole o mármore de entrada e nunca produz nada.
  • 2Dé o código ASCII de -, 31é o código ASCII de 1e 69é o código ASCII de i.
  • Os &nsão sincronizadores. Os sincronizadores paralisam uma bola de gude até que todos os sincronizadores com a mesma nbola segurem uma bola de gude, altura em que todos deixarão cair a bola de gude armazenada.

Portanto, na verdade, o que faço é manter os três caracteres relevantes em três sincronizadores e liberá-los, dependendo de como os bits menos significativos são definidos na entrada.

Para mais informações, consulte o rascunho das especificações .


1
Eu realmente gosto deste! Sons Marbelous fab Vou precisar fazer check-out em breve :)
Kezz101

3
@ Kezz101 Temos um projecto de especificação aqui
Martin Ender

Ah legal! Parece muito interessante
Kezz101

Não esqueça que você pode fornecer entradas para a placa principal na linha de comando, para que esta placa possa ser usada como está.
Sparr

1
@overactor Hm, eu não sei ... a saída de caracteres adicionais (mesmo que não sejam imprimíveis) ainda parece violar o formato de saída para mim. Pode valer a pena uma meta questão, no entanto.
Martin Ender

6

JavaScript (ES6) 29-5 = 24

Suporta energia negativa.

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

ES5:

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

Sim, mais curto ( f=n=>[1,'i',-1,'-i'][n%4]). Mas é menos sexy e não suporta poderes negativos. Depende do bônus, eu acho.
Michael M.

Não, 29 bytes. Negativos são suportados com este código.
Michael M.

JS tem um &operador bit a bit ? Nesse caso, você pode fazer &3uma verdadeira operação no módulo-4. Edit: parece que ele faz, como &2é usado em sua resposta ...
feersum

5

Python 28 bytes - 5 = 23

Suporta entradas -ve.

Supondo que as funções lambda sejam aceitáveis ​​(Obrigado FryAmTheEggman!):

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

caso contrário, 31 bytes - 5 = 26

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

1
Você não pode chamá-lo exatamente. Você precisa armazená-lo em algum lugar que possa acessar. Então você poderia fazer foo=..., ou você poderia fazer map(<your lambda>,range(10))para obter uma lista de valores de i^nfrom 0-9.
FryAmTheEggman

2
Basicamente, você está criando um ponteiro de função, se isso for mais claro: P
FryAmTheEggman

3
@DigitalTrauma: Sim, embora você possa fazer melhor com truques para cortar cordas. Por exemplo lambda n:'--1i'[n%4-2::2],.
User2357112 suporta Monica

2
Para traduzir a postagem de user2357112: Pegue todos os outros caracteres, '--1i'começando no índice n%4-2. Quando o python obtém um índice negativo, ele inicia muitas posições restantes do final da matriz e depois sobe 0. Desta forma, 0e 1não nunca atingiu os -sinais, enquanto 3e 4fazer.
FryAmTheEggman

1
lambda n:n%4/2*'-'+'1i'[n%2]Remove o espaço e é mais curto :)
FryAmTheEggman

4

(Emacs) Lisp - 34

Apenas por diversão, no (Emacs) Lisp:

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

Se você deseja usá-lo, use a defunou use 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 caracteres - 15 de bônus = pontuação -7

A função interna (e, portanto, proibida) é 0J1*⊢, mas ela usa o método de @ blutorange .

¯12○.5×○

O autor do desafio, Kezz101, escreveu :

Se você oferecer suporte a qualquer número real, poderá gerar qualquer forma complexa válida.

Isso retorna um número complexo no formulário, aJbque é a maneira normal de o APL exibir números complexos.

Experimente online!

Explicação

¯12○ encontre o vetor unitário que tem o ângulo em radianos de

.5× vezes e meia

 o argumento multiplicado por 𝜋 (a constante do círculo)


3

Festa pura, 29 bytes - 5 = 24

Suporta entradas -ve.

a=(1 i -1 -i)
echo ${a[$1%4]}

3

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

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

Suporta números inteiros negativos. Não vou ganhar nenhum prêmio com esta solução, mas tanto faz.

Ele apenas aceita um número como entrada, faz alguns truques no módulo (que, frustrantemente, não funciona como o módulo habitual para números negativos no intérprete que eu o testei) para fazer os negativos funcionarem e, em seguida, faz algumas condições tolas para decida o que cada personagem deve ser.

Tenho certeza que isso pode ser jogado muito mais longe. Por enquanto, aqui está outra solução que não aceita negativos, mas compensa a perda do bônus sendo mais curta:

Befunge-98, 32 26 23

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

Editar - Agora aproveita o fato de que "-" está a 13 (0xd) caracteres de "".

Editar 2 - Agora, novamente, aproveita o fato de que "i" está a 56 (0x38 ou '8) caracteres de "1".


3

Java 8 Pontuação: 72

Em Java, a pior linguagem de golfe de todos os tempos! Golfe:

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

Expandido:

class Complex{

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

}

Nota: Não estou acostumado ao Java 8. Também não tenho o tempo de execução para isso. Por favor, diga-me se houver algum erro de sintaxe. Este também é o meu primeiro golfe.

Editar: Removido import.

Editar: declaração de classe removida.

Outra resposta com pontuação = 87 - 15 = 72

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

Expandido:

class Complex{

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

}

Você pode salvar alguns com "import java.util. *"
Anubian Noob

A Função Classe Anubian Noob java.util.functionnão está no pacote java.util(ou estou errado?).
TheNumberOne

Mas se você fizer java.util.*a .*tudo, a importação, no âmbito do pacote. Assim como você está importando todas as classes no fuctionpacote.
Anubian Noob

5
@ Anubian Noob importimporta apenas as classes nesse pacote. Ele não importa nenhuma das classes dos pacotes nesse pacote. Por exemplo, a classe Functionestá no pacote, java.util.functionmas não no pacote java.util.
TheNumberOne 23/11

Oh meu mal, desculpe por isso.
Anubian Noob

3

MATLAB, 33 bytes - 5 = 28

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

Mesmo com alguns bytes a mais (37-5 = 32), eu realmente gosto mais dessa abordagem:

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

i^3é -i, em vez de i, acho que apenas adiciona 1 caractere. - Sidenote para outros leitores: sem a primeira regra do desafio, a solução Matlab teria apenas 3 caracteres.
Dennis Jaheruddin

Sim, isso foi um erro de digitação. Fixo! Obrigado por reparar ... abordagem Pelo menos o segundo (um pouco mais interessante) é = corretas)
Stewie Griffin

3

C 77

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

Melhorado graças a Ruslan

C 74-5 = 69

Ah, e claro, a abordagem mais óbvia

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

2
Você pode remover os parênteses n%2e usá- los , em ~vez de !negar nprimeiro; em seguida, %inar com 2 dará o mesmo resultado, pelo menos para n<(1<<32)-1. E C não exige definir explicitamente o tipo de retorno para a função, para que você possa remover int no início. E também use em 0vez de '\0'. Assim -9 caracteres.
Ruslan

3

OCaml 47

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

Não é uma solução premiada, mas esta é minha primeira vez em código de golfe, por isso não tenho exatamente certeza do que estou fazendo. Tentei usar a correspondência de padrões, mas isso me deu mais de 58 anos.


3

Pari / GP , 19 bytes - 5 = 14

CR[x]/(x2+1)

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

O iaqui é apenas um símbolo, não a unidade imaginária (que está Iem Pari / GP).

Experimente online!


2

Ruby 32-5 = 27

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

Funciona para poderes negativos!


Você pode trivialmente jogar mais com isso puts %w[1 i -1 i][gets.to_i % 4].
histocrat

2

Perl, 26-5 = 21

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

funciona como um programa independente (argumento na linha de comando) ou no corpo de uma função.


2

Java: 151 131-5 = 126

Golfe:

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

Como função: 72-5 = 67

Golfe:

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

Sim, mais uma resposta do Java - e jogou ainda pior do que nunca. Mas você trabalha com o que pode ...

EDIT : versão da função adicionada.

EDIT 2 : então, depois de algumas tentativas e erros, aqui está uma versão que tenta fazer isso pelo livro, sem explorar a brecha do ciclo. Tão…

Java com cálculo de valor: 146-15 = 131

Golfe:

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

(pelo menos, acho que posso reivindicar o bônus máximo, me corrija o contrário)


você pode reduzir seu código, se você o passar para main como argumento.
user902383

@ user902383 Eu sempre poderia fazer uma função. Provavelmente também publicará as duas versões.
Rodolfo Dias

Na verdade, eu estava pensando em analisá-lo, assim você teráint n = Integer.parseInt(a[0])
user902383

@ user902383 Daaaaamn, nem me lembrava disso. polegar para cima #
Rodolfo Dias

2

Python - 31

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

Apenas recentemente comecei a aprender python. Mesmo sabendo que não é bom, é o melhor que posso fazer.


2

Haskell GHCi, 29 bytes - 15 = 14

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

Uso:

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

Experimente online!

O mesmo que a maioria dos métodos acima, pega um módulo de 4 e aumenta em 1, porque as matrizes de R são indexadas em 1. Também funciona para números inteiros negativos.

Eu estava preocupado com saídas mistas aqui, mas Giuseppe apontou que R restringe tipos numéricos a tipos de string quando eles são misturados.



@ Giuseppe Totalmente ignorado por isso. Minha preocupação com isso é que a saída é tecnicamente mista, meia corda, meio numérica.
Sumner18

Não, o R automaticamente coage os numerictipos characterquando eles são misturados! O livro de Hadley explica isso muito bem - apenas Ctrl + F para "Coercion" e você verá, mas o livro inteiro vale a pena ser lido (principalmente para fins não relacionados ao golfe, mas às vezes você aprende um truque ou dois, heheh )
Giuseppe


1

Haskell, 29 bytes - 5 = 24

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

Funciona para poderes negativos.

Eu tinha uma versão sem pontos elaborada, mas na verdade é mais longa.

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

1

Clojure ( 64 54 31 caracteres)

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

Editar

Por sugestão do @ SeanAllred, aqui está uma versão que usa um vetor literal em vez de uma casefunção:

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

Editar 2

Contando com o REPL para imprimir a coleção resultante e codificando a função usando o #()atalho, podemos reduzi-la para

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

(Na verdade, é muito mais Clojure / Lisp-ish, pois a função agora realmente retorna o resultado gerado, permitindo que a função seja usada com map, como em

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

que imprime

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

Compartilhe e curta.


Em vez de usar uma estrutura de seleção, você não pode usar algum tipo de matriz explícita, como na minha resposta ?
Sean Allred

1

Groovy: 27-5 = 22

f={n->[1,'i',-1,'-i'][n%4]}

1

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

Ele nem é compilado porque você deve colocar entre parênteses as atribuições after :em ?:instruções simples C. Além disso, qual é o sentido de usar 0==0quando você pode usar um único caractere 1? E não há necessidade de parênteses antes ?. Além disso, a última ?:declaração pode ser abreviada para c[j]=i&1?'i':'1';.
Ruslan

@Ruslan No CodeBlocks Mingw, há apenas 1 aviso em torno de i & 0. i & 0 == 0 é um teste para até, se i é ainda o resultado é 0 então é 1.
bacchusbeale

Sim, mas qual é o sentido de usar 0==0quando é idêntico 1? Observe que ==tem maior precedência do que &, caso contrário, seu (suposto) teste de (i&0)==0sempre seria verdadeiro.
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)é um caractere mais curto, mas não lida com respostas exatas. É claro que n->I^nnão é permitido e, presumivelmente, também é do PARI powIs.


1

Gelatina , 2 - 20 = -18 bytes

ı*

Experimente online!

Ele não usa um i ^ xbuiltin, mas usa builtins para 1je, **portanto, não tem certeza se é permitido.


"Se o seu idioma suportar números complexos, não use nenhuma função ou aritmética que possa resolver isso". Eu acho que é bastante claro ...
totallyhuman

@totallyhuman Bem, eu não tenho certeza se o 1j literal é banido também?
Erik the Outgolfer

Sim, mas a aritmética ( *) é.
totallyhuman

1
@totallyhuman Hm, talvez eu adicione outra versão abaixo, embora "não use nenhuma função ou aritmética que possa resolver isso" parece sugerir que eu não posso usar um built-in para fazer essa tarefa exata ... Aliás, a maneira como ele frases me faz pensar que você é incentivado a usar 1jliterais.
Erik the Outgolfer

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.