Calcular o quadrado de um número inteiro com restrições [fechado]

8

The Puzzle

Você deve escrever um programa ou função p (n) que retorne o quadrado do que é inserido nele e você pode assumir que a entrada é um número inteiro não negativo. Em termos mais simples, retorne n 2 .

Regras

  1. Você não tem permissão para usar *ou /(ou qualquer outro operador de raiz quadrada ou de energia, como POWou SQRT, se o seu idioma contiver essas funções)
  2. Você não pode usar um loop ou usar construções semelhantes a um loop. Exemplo de construções tipo loop GOTOe recursão.

Exemplo

Function p(n)
Dim r()
ReDim r(n)
p = Len(Join(r, Space(n)))
End Function

Seja criativo e (ab) use as funções e os recursos fornecidos pelo idioma de sua escolha.

*editar

Estruturas tipo loop são loops que permitem repetir 1 ou mais instruções

-se você poderia adicionar um stdout "1"ao seu código e acabar repetindo essa saída n vezes, ele contará como um loop

dwana
fonte
1
@dwana A segunda parte da primeira regra e a terceira regra não são a mesma?
Def
14
Isso não deveria ter sido reaberto, porque ainda falta clareza no que conta como "loop-like". Por exemplo, e as dobras?
Peter Taylor
5
@PeterTaylor ou mapas para esse assunto.
Martin Ender
7
@dwana Você pode ser específico sobre essas coisas nas suas regras: (1) São permitidas funções construídas que possuem inerentemente loops, como mapas, iteradores, dobras, reduções, etc. (2) A avaliação de string como um código usando eval / exec é permitida?
Optimizer
4
Isso é em grande parte uma duplicata de um desafio anterior do codegolf, que solicitava o mais geral em m*nvez de n*nsem usar o *. Veja codegolf.stackexchange.com/a/18283/14485
Mark Lakata

Respostas:

42

CJam, coloca os óculos

q~33c

(*_*)

(*_")>⌐■-■

(⌐■_■)

"]sG>4%,)

Entrada via STDIN

Experimente o código aqui

Observe que *no código não é usado como multiplicador, mas como um operador de junção

Observe também que a parte legal do código não é apenas string, metade é o código envolvido na localização do quadrado. Então .. lide com isso

Isso o ajudará a lidar com isso:

q~33c                    "Read the number and put ASCII character 33 on stack with it"
(                        "Decrease it to get ASCII code 32 character, which is a space";
 *_                      "Repeat the space input number times and make another copy";
   *                     "Put that many spaces in between each space. Now we have";
    )                    "n*n spaces string. We take out the last space out of it";
(                        "Decrement the space to get ASCII 31 character";
 *                       "Fill the n*n - 1 spaces with that to get 2*n*n - 3";
  _                      "string. Then copy it again.";
   ")>⌐■-■               "Put the sun glasses in";
(⌐■_■)                   "Wear the sun glasses. Be cool.";
"]s                      "Add everything to a single string of 4*n*n - 6 + 16"
   G>                    "length. Remove first 16 characters";
     4%                  "Take every 4th character from that string to get n*n - 1"
       ,)                "length string. Take length and increment to get n*n";
Optimizer
fonte
20

Rubi

def square(n)
  case n
  when 0..1
    n
  when 2..36
    '100'.to_i(n)
  else
    raise RangeError, 'Integer overflow!'
  end
end
histocrata
fonte
10
Isso é realmente inteligente.
Ypnypn
3
Para o registro, no Mathematica isso funciona inteiros muito arbitrárias (incluindo 0 e negativo), sem ter que lidar com quaisquer casos especialmente: FromDigits[{1, 0, 0}, Input[]]. O mesmo em CJam:4Ybl~b
Martin Ender
20

APL? ∊⍵⍵

{+/ ∊⍵⍵ ⍴1}

Esta resposta é dedicada a todas as pessoas que usam "∊⍵⍵" sempre que veem os símbolos da APL :-)

Exemplos

      {+/∊⍵⍵⍴1} 3
9
      {+/∊⍵⍵⍴1}¨⍳20
1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400

Explicação

{       }   This function takes a number ⍵,
{   ⍵⍵⍴1}   builds a matrix of ⍵ by ⍵ all filled with ones,
{+/∊    }   and sums all its elements together.
Tobia
fonte
3
eww ... <! - placeholder ->
Kroltan
4
A soma de todos os elementos de uma matriz pseudo-looping? Somando é feito por meio de reduzir ou dobrar, ambos são ciclo
Optimizer
+/em outras línguas é chamado sum()e vejo muitas respostas usando-o. Pelo mesmo raciocínio que você não pode usar *no CJam.
Tobia
Entendo o seu ponto de vista, mas a união não exige a leitura do valor de cada elemento; portanto, isso pode ser feito sem um loop em um nível baixo. A soma dos elementos da matriz realmente precisa iterar sobre todos os elementos a serem adicionados. Como alternativa, você pode fazer algo como achatar a matriz e obter seu comprimento.
Optimizer
2
Parece o símbolo de um presunto prensado !?
FreeAsInBeer
15

Abusando de algumas funções no Mathematica

Duas vezes a área de um triângulo retângulo isósceles

a =RegionMeasure@SASTriangle[n,ArcSin[1], n] 
a+a

A área de um quadrado. Claro!

RegionMeasure[Rectangle[{0, 0}, {n, n}]]

A mesma ideia, de uma forma diferente:

Integrate[n, {x, 0, n}]  (* thx to DigitalTrauma *)

O número de elementos em uma matriz quadrada:

 Length[Flatten[Normal[AdjacencyMatrix[RandomGraph[{n, RandomInteger[n]}]]]]]

ou

 Plus@@Flatten[ConstantArray[1, {n, n}]]

ou

 Length@Flatten[Outer[f,Range[n],Range[n]]]

ou

 Length[Distribute[p[Range[n],Range[n]],List]]

etc ...

DavidC
fonte
1
Outro k[n_] := Integrate[n, {x, 0, n}]:?
Digital Trauma
DigitalTrauma, Integratemuito bom, mas itera, o que acredito ser uma forma de loop.
DavidC
É verdade, embora eu pense que é apenas um loop implícito. Pelo mesmo argumento que eu iria reclamar Areae amigos são multiplicação implícita (mas também permitido)
Digital Trauma
13

C

p(n){int a[n];return(&a)[n]-a;}

Nota:

  • Matrizes de comprimento variável são um recurso suportado condicionalmente desde o C99.
  • Implícito inté usado para reduzir a contagem de caracteres e para pontos de estilo.
ecatmur
fonte
6
stackoverflow.com/q/27828822/1530508
ApproachingDarknessFish
12

Mathematica

Outra resposta usando alguns recursos engraçados do Mathematica

n = Input[];
g = EdgeCount@CompleteGraph@n;
g + g + n

Um gráfico completo com nvértices possui binom(n,2) = n(n-1)/2arestas (que também é o enésimo número triangular). Portanto, o resultado é simplesmente o dobro disso, mais a entrada.

Martin Ender
fonte
1
Muito inteligente, usando gráficos.
DavidC
12

Python 2

Puramente matemático, evitando qualquer uma das operações proibidas:

import cmath
n=input()
if n:
  l=complex(0, -cmath.log(n) - cmath.log(n))
  print int(round(abs(complex(cmath.cos(l),cmath.sin(l)))))
else:
  print 0

Este é o exp(ln(x)*y)truque usual adaptado para esse problema:

  • Como y é 2, podemos simplesmente fazer isso ln(x)+ln(x)para nos livrar da multiplicação.
  • Eu senti que math.exp()estava um pouco perto do "prisioneiro de guerra" banido para jogar limpo, então tudo se converte em complexo e a identidade de Euler é usada para substituir o exp()por cos()esin()
  • Para evitar as situações em que ié necessária multiplicação / divisão explícita por , a complex()função é usada.
Trauma Digital
fonte
2
Se você mudar math.logpara cmath.logque você pode lidar com números negativos. Você também não precisa import mathentão.
FryAmTheEggman
inputnão faz o que você pensa no Python 2 e no Python 3 printé uma função em vez de uma instrução.
Cristian Ciupitu
@CristianCiupitu O que eu acho que inputfaz no Python 2? ;-). Certamente eu escreveria isso de maneira diferente se fosse um código de produção, mas, para os propósitos desse desafio, está ótimo, desde que a entrada seja uma expressão numérica bem formada. Eu entendo que há uma avaliação implícita lá e seu potencial mal.
Digital Trauma
8

Pure Bash

Sem loops explícitos ou aritméticos:

(($1))||{ echo 0;exit;}
eval a=({1..$1}{1..$1})
echo ${#a[@]}

Usa expansões de bash para criar duas listas 1-n e expandir-chaves entre elas e exibir o tamanho da matriz resultante.


Método semelhante, mas usando coreutils:

join <(seq -f "1 %g" $1) <(seq -f "1 %g" $1) | wc -l
Trauma Digital
fonte
8

R, deliciosa ineficiência com Monte Carlo

A expectativa E[x]para a parametrização de forma / escala da Distribuição Gama é shape*scale.

Não vejo meansendo banido, então aqui está a solução de exemplo commean()

f = function(n, k = 1e9){round((mean(rgamma(k, shape = n, scale = n))))}
f(99) 

Sem usar mean(), é possível usar mode[x], o que é igual a (shape-1)*scale, mas isso envolve escrever uma add.onefunção para ignorar +1e escrever outra Modefunção para tabular o modo.

add.one = function(x) length(c(seq(x),NA))
Mode = function(x) (u<-unique(x))[which.max(tabulate(match(x,u)))]
f.mode = function(n, k = 1e9){Mode(round(rgamma(k, shape = add.one(n), scale = n)))

Precisão não garantida, mas leis de grande número devem valer 1.000.000.000 de amostras, o que me deu os resultados corretos para todos os meus casos de teste.

Vlo
fonte
Eu estava pensando em um hack semelhante, +1
shadowtalker
7

Java

Primeira entrada, é assim que funciona?

int g(int n){
    int[] a = new int[n];
    Arrays.fill(a,n);
    return IntStream.of(a).sum();       
}
Anders Sundheim
fonte
... não é engraçado u_u
6

C #

Cria uma sequência com n caracteres e substitui cada caractere pela sequência de n caracteres. Isso produz uma string com um comprimento de n * n.

using System;

public class Test
{
    public static void Main()
    {
        int n = Int32.Parse(Console.ReadLine());
        String s = "".PadLeft(n, 'X');
        Console.WriteLine(s.Replace("X", s).Length);
    }
}

Teste aqui: http://ideone.com/lubIFg .

hetzi
fonte
2
Isso é criativo!
TheNumberOne
5

Matlab

um aviso: isso é baseado principalmente em matemática, portanto, não espere código-fonte sofisticado

Note que a = n^2iff log(a) = log(n)*2iff log(log(a)) = log(log(n))+log(2). Portanto, esta função está apenas encontrando o zero da função f(a) = log(log(n))+log(2) - log(log(a))que obviamente está a = n^2.

function s = g(n)
    f = @(a) log(log(n))+log(2)-log(log(a));
    s = fnzeros(f);
end

Aqui estão algumas outras funções não muito criativas:

Aqui, o programa somará o número 1+2+3+...+n = 1/2 * (n^2+n)duas vezes e subtrairá n, para que o resultado seja sempren^2

g=@(n)sum(1:n)+sum(1:n)-n

Essa função cria uma n x nmatriz de números aleatórios (entre 0 e 1) e, em seguida, retorna o número de elementos.

g=@(n)numel(rand(n));

A função a seguir cria uma matriz de vandermonde do vetor (0,0,n)e gera a entrada que consiste emn^2

function s = g(n)
    a = vander([0,0,n]);
    s = a(3,1)
end

Essa função cria o inverso de uma matriz hilbert de tamanho em nque o elemento superior esquerdo é sempren^2

function s = g(n)
    a = invhilb(n);
    s = a(1);
end
flawr
fonte
Anúncio nº 3: é claro que em aplicações da vida real, seria usado g=@(n)nnz(nan(n));em prol da eficiência e da brevidade. ;-)
knedlsepp
Quando se trata de eficiência Acho que o cálculo da inversa da matriz Hilbert explicitamente será mais eficiente: function s = g(n); a = inv(hilb(n)); s = a(1); end. Mas, novamente, sua solução é mais curta; P
flawr
5

C

sizeof(char[n][n])

Funciona até INT_MAX em tempo constante e sem alocação de memória.

Exemplo:

#include <stdio.h>
#include <limits.h>
int main(){
    for( int n=0 ; n<10 ; n++ ){
        printf("%d: %ld\n", n, sizeof(char[n][n]));
    }
    int n = INT_MAX;
    printf("%d: %ld\n", n, sizeof(char[n][n]));
}

exibe

0: 0
1: 1
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64
9: 81
2147483647: 4611686014132420609
Florian F
fonte
talvez tornar óbvio que o loop é apenas um wrapper para mostrar o programa rodando em vários valores
masterX244
4

Java

Esta é a primeira resposta que realmente não usa loops ou recursão.

int square(int n){
    if (n > 0){
        n = -n;
    }
    return m(n,0) + m(n,1) + m(n,2) + m(n,3) + m(n,4) + m(n,5) + m(n,6) + m(n,7) + m(n,8) + m(n,9) + m(n,10) +
            m(n,11) + m(n,12) + m(n,13) + m(n,14) + m(n,15) + m(n,16) + m(n,17) + m(n,18) + m(n,19) + m(n,20) +
            m(n,21) + m(n,22) + m(n,23) + m(n,24) + m(n,25) + m(n,26) + m(n,27) + m(n,28) + m(n,29) + m(n,30) + m(n,31);
}

int m(int number, int index){
    if (number >> index << 31 >>> 31 == 0){
        return 0;
    } else {
        return number << index;
    }
}
O número um
fonte
@FlorianF Todas as outras respostas chamam funções que usam loops. Tanto quanto eu sei, chamar uma função 32 vezes e depois adicionar os resultados não conta como usar loops. Se eu adicionasse a declaração System.out.print(1)a m, o programa imprimiria 1exatamente 32 vezes, não n vezes.
TheNumberOne
3

GolfScript

O Histocrat mostrou uma maneira de usar a conversão de base: aqui está outra.

{.,1base.++}:p;

Dissecação

{       # Function boilerplate
  .     # Duplicate the input. Stack: x x
  ,     # Turn the second one into an array [0 1 ... x-1]
  1base # Sum the elements of the array. Stack: x x(x-1)/2
  .+    # Double. Stack: x x(x-1)
  +     # Add. Stack: x*x
}:p;    # Question asks for the function to be called p
        # The fact that this destroys the built-in p is unfortunate, but required
Peter Taylor
fonte
2

Emacs Lisp

(defmacro square-it (n)
  (cons '+ (make-list n n)))

(square-it 11) ;; => 121

A macro simples que se expande (square-it 5)em (+ 5 5 5 5 5). Obviamente, a entrada deve ser uma constante de tempo de compilação.

Jordon Biondo
fonte
2

Javascript

function square(i) {
    return new Array(++i).join(new Array(i).join(' ')).length;
}
bjb568
fonte
2

Haskell

Existem muitas possibilidades se intervalos [x..y]forem permitidos, alguns deles são:

f n|x<-sum[1..n]=x+x-n
f n=sum$take n[n,n..]
f n=length$[1..n]>>[1..n]
f n=sum$[1..n]>>[1..n]>>[1]

Os dois últimos usam a instância de listas do Monad. para listas xs, ysretenções que xs>>yssão ysanexadas a si mesmas length xsvezes.

outro truque é apenas

import Data.Monoid
f x=x<>x

esta função, quando recebe um argumento 'apropriado' (que é claro da classe Num) retorna seu quadrado. Product 3 :: Num a => Product aé um exemplo de tal argumento.

basicamente, essa função quando aplicada em Product a(que na Numclasse sea está em i)mappend é ela mesma e retornaProduct (a*a) .

se formos mais rigorosos sobre o que é um número / em que números nossa função deve funcionar, podemos definir fcomo

import Data.Monoid
f n|x<-Product n=getProduct$x<>x
orgulhoso haskeller
fonte
2

Java

Isso é muito longo para responder, mas basicamente uma das linhas de código ocorre uma quantidade de vezes aproximadamente igual ao sqrt de Integer.MAX_VALUE (que é 46340). : D

Sem comentários ou quebras de linha, o código digitado seria 1.112.155 caracteres.

int s(int n){
    if(n==0|n==1)return n;
    int c=2,r=n+n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
    if(n==c++)return r;r+=n;
                            //... (same line of code a total of 46336 times)
    if(n==c++)return r;r+=n;
    if(n==c++)return r;
    return n==c?r+n:r+n+n; //r = 46340^2
}
mbomb007
fonte
2

R

Esta função é baseada na contagem de todas as combinações possíveis de duas seqüências que variam de 1 a n. O valor 0 é tratado separadamente.

f <- function(n) if (n) nrow(expand.grid(s <- seq(n), s)) else 0
Sven Hohenstein
fonte
2

Clojure

(def squares (lazy-cat [0] (map (fn [sq x] (+ sq x x 1)) squares (range))))

Sequência infinita de todos os quadrados a partir de 0. A função:

(defn square [n] (nth squares n))
Jarlax
fonte
1

J

Alguma arte ascii ...

p =. ( $ @,@  ( ($*) ([-])"*/ ($*) ))
randomra
fonte
1

perl:

$n=8;
$x = "$n +" x $n;
$x =~ s/\+$//;
print eval $x;
michael501
fonte
1

SQL (PostGIS)

Fazendo uso da área e criar funções de envelope na extensão PostGIS para PostGreSQL para criar uma geometria quadrada e retornar sua área. Também pode ser alterado para retornar o quadrado de carros alegóricos.

CREATE FUNCTION square(n int)RETURNS int AS $$
BEGIN 
    RETURN ST_Area(ST_MakeEnvelope(0,0,n,n));
END;
$$LANGUAGE plpgsql;

Em uso;

SELECT square(150);

Square Integer
--------------
22500
MickyT
fonte
1

Pitão

Usa matemática simples. Com base na soma de uma progressão aritmética.

s=lambda n:(sum(range(n))<<1)+n

Explicação:

a = sum(range(n)) # sum of arithmetic progression from 1 to n-1:  n*(n-1)/2
b = a<<1          # bitshift left by 1 (multiply by 2):  n*n - n
c = b+n           # add n:  n*n

Embora sum e range provavelmente contenham loops implícitos,
mas de acordo com as especificações da pergunta, não há como inserir uma declaração de impressão aqui para repetir, então ... :)

Vetorizado
fonte
1

Bater

yes|xargs -L$1|xargs -L$1|head -n1|iconv -futf16|wc -m

Só funciona se n <256.

jimmy23013
fonte
1

PHP

function square($v) {
    return array_sum(array_fill(0, $v, $v));
}

trabalha com número inteiro no intervalo [0; 46340]

Edit: Acabei de ver o código @thebestone e é basicamente o mesmo

DE ANÚNCIOS
fonte
1

Perl

$_=<>;chop;s/./$_/g;print

o programa espera que o número de entrada seja quadrado de forma unária (ou seja, base 1). A saída também é unária. Simplesmente substitui todos os dígitos pelo número inteiro.

Exemplo de uso:

perl -e '$_=<>;chop;s/./$_/g;print'
000                                   # <- user input
000000000                             # <- output
nimi
fonte
1

Scala:

scala> val q = (n:Int) =>(List.fill (n)(n)).sum
q: Int => Int = <function1>

scala> q(9)
res21: Int = 81
Usuário desconhecido
fonte
1

Scala:

scala> val s=(n:Int)=>(("x"*(n))*n).size
s: Int => Int = <function1>

scala> s(7)
res22: Int = 49
Usuário desconhecido
fonte
Mesmo? Parece um loop ou você sabe que deve haver algum loop oculto?
usuário desconhecido