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


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

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

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.

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


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


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.


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.

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

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.


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

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


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

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

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

@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

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.


2

Javascript

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

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

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
}

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

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))

1

J

Alguma arte ascii ...

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


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

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 ... :)


1

Bater

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

Só funciona se n <256.


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


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

1

Scala:

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

scala> q(9)
res21: Int = 81

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.