Ponteiros, ponteiros, ponteiros!


46

Introdução

Nas saídas de erro de algumas linguagens como Java, um ponteiro é mostrado para dar ao programador uma idéia exata de onde o erro deu errado.

Veja este exemplo no Ideone:

Main.java:12: error: ';' expected
    Invalid Java!
                ^

Observe que o sinal de intercalação mostra onde está o código inválido?

Desafio

Seu desafio é: dado número N e corda S , coloque um ponteiro no N º personagem em S .

Exemplos

Entrada :2, "Lorem ipsum, dollar sit amet."

Saída :

Lorem ipsum, dollar sit amet.
 ^

Regras

  • A entrada é recebida via STDIN ou parâmetros de função
  • A saída é impressa no console ou returned
  • Trailing novas linhas, espaços etc são permitidos na saída
  • O caractere do ponteiro deve ser um caractere ^ e deve estar em uma nova linha.
  • Isso é código de golfe, então a resposta mais curta vence. Boa sorte!

16
Sinto que este é um problema extremamente simples, por isso não tenho certeza de que será recebido muito bem. Você pode tentar a sandbox depois de ter representante suficiente.
FryAmTheEggman

6
Eu acho que isso poderia ter sido um pouco mais interessante se a entrada tivesse várias linhas, para que você tivesse que inserir uma nova linha, espaços e quilates na (s) posição (ões) correta (s). Honestamente, a especificação não diz realmente que será uma única linha, mas acho que aplicar isso agora invalidará injustamente algumas respostas, já que não há exemplo que mostre isso.
Geobits

3
Como eu disse, o gato provavelmente está fora do saco neste. As alterações das regras após a publicação de respostas válidas geralmente não funcionam bem. Viva e aprenda;)
Geobits

1
@SohamChowdhury Vou apenas fingir que foi intencional;) ​​Você quer que eu conserte?
monkeyonkeyboard

9
Embora isso possa ser muito simples, você certamente se saiu bem no primeiro desafio! Você tem + 16 / -0 votos, 1.300 visualizações e 28 respostas (até o momento em que este artigo foi escrito) e você fez a lista de perguntas sobre a rede quente. Bom trabalho!
Alex A.

Respostas:


36

C 33

Se apenas uma função é permitida, mesmo c pode competir.

(Para o registro, 2 bytes salvos thx no @Cool Guy. O comentário do Mt thx é evaporado inesperadamente.)

Mais 1 char economizado thx @Mig

f(a,c){printf("%s\n%*c",a,c,94);}

19
C sempre pode competir, mas nem sempre pode vencer. ;)
Alex A.

3
@AlexA. <shrug> parece que está ganhando para mim ;-)
Digital Trauma

3
Salve 1 caractere:f(a,c){printf("%s\n%*c",a,c,94);}
Michael M.

Se eu fosse uma pessoa cínica, diria que ainda é cerca de 4 vezes maior que a resposta mais curta em um idioma de golfe. Que é sobre negócios, como de costume. ;) Isso é inteligente, no entanto. Eu acho que já tinha visto a *opção na string de formato antes, mas tinha esquecido completamente. Pode ser útil para alguns dos desafios da arte ascii no futuro.
Reto Koradi

35

Brainf * ck - 133 bytes

+++++>>+>>+++>>+++++++++<<<<<<[[->++++++++++<]>>]<++++<<++<<<<--<,>[->+<<->]>>>,<<[->>-<<]<<[->>>>++++++++++<<<<]>>+[,.]>.>[->.<]>>>.

Espera entrada como, [0-9]{2}.*por exemplo, "02Olá mundo !!!" produziria

Olá Mundo!!!
 ^

Bem-vindo à Programação de Puzzles e Code Golf! Este é um ótimo primeiro post, bom trabalho! : D
Alex A.

O problema é que ninguém sabe se isso é mesmo código válido, muito menos resolve o problema :)
Simon

Sim, acho que há um erro off-by-one aqui. O sinal de intercalação deve estar abaixo edo exemplo. Com o custo de 1 byte, isso pode ser corrigido com a adição de um -na frente de[->.<]
FryAmTheEggman

@FryAmTheEggman você está certo - veja a edição. Originalmente, eu o tinha sob o e como está agora, mas fiquei confuso usando dois IDEs com fontes diferentes.
Sudo rm -rf slash

25

Código de máquina IA-32, 24 bytes

Hexdump:

66 b8 5e 00 42 38 22 75 fb 66 c7 02 0d 0a 42 42
c6 02 20 e2 fa 89 02 c3

É uma função (usando a fastcallconvenção da MS ) que atualiza a string no local:

__declspec(naked) void __fastcall carrot(int n, char* s)

Código de montagem:

    mov ax, '^'; // ah = 0, al = '^'

mystrlen:
    inc edx;
    cmp [edx], ah;
    jne mystrlen;

    mov word ptr [edx], '\r\n'; // append a newline
    inc edx;

mymemset:
    inc edx;
    mov byte ptr [edx], ' ';
    loop mymemset;

    mov [edx], eax; // append a caret and terminate the string
    ret;

Ele usa dados de WORDtamanho (16 bits) em alguns lugares. Isso tem uma penalidade (prefixo de 1 byte) no código de 32 bits, mas diminui o código de qualquer maneira - o uso de dados de 32 bits colocaria dois bytes zero no código!

No final, ele grava 4 bytes ( eax) em vez de 2 bytes ( ax) - o código é menor dessa maneira e 2 bytes extras de lixo eletrônico são eliminados após o término da string, para que ninguém os note.

Uso:

int main()
{
    char s[100] = "Lorem ipsum, euro sit amet.";
    carrot(2, s); // credit to Digital Trauma for the name
    puts(s);
}

1
A instrução é 66 b8 5e 00movida 0x5epara al, não para ahe zero para em ahvez de al, portanto, seu comentário no código de montagem é enganoso.
Ruslan

@Ruslan Thanks! Fixo. Isso foi um remanescente de uma versão anterior.
anatolyg

Por que está nakedaí? E por que é a primeira coisa que vi?
caird coinheringaahing

Foi a Microsoft que decidiu colocar a questão nakedà frente: msdn.microsoft.com/en-us/library/h5w10wxs.aspx
anatolyg

20

Pitão , 8

zp\^*tQd

Essa solução não funciona mais, pois o commit após o qual eu pvinculei como o nome do idioma mudou para ter aridade 1. Existem várias outras maneiras de obter uma pontuação semelhante no Pyth que ainda funcionam hoje, como zp+*dQ\^.

Se a sequência precisar de aspas, adicionar vao início do código funcionará. Se tiver que ser separado por vírgula, aumentará para 10 bytes:

eQp\^*dthQ

Eu acho que este é o mais curto até agora. Bem feito.
monkeyonkeyboard

O algoritmo parece errado para mim, acho ^que sempre estará sob o primeiro caractere. E pela maneira como os parâmetros de entrada são fornecidos na ordem errada ao intérprete on-line (por isso, falha na execução).
Jim

1
@ Jim Esta resposta usou uma versão mais antiga do pyth, onde phavia arity 1. Isso fez com que a primeira linha da saída fosse impressa primeiro e, em seguida, o cursor na próxima linha, seguido pelos espaços. Agora você pode fazer z+*dQ\^uma pontuação menor, mas com uma nova linha à direita, ou adicionar um pantes do +para removê-lo. Não tenho certeza do que fazer aqui, já que as pessoas aprovaram esta versão da resposta, acho que tentarei encontrar a versão em que ela trabalhou.
FryAmTheEggman

16

T-SQL, 90

Embora seja uma pergunta bastante simples, é sempre interessante experimentá-las em idiomas que realmente não tendem a apoiá-los ou jogar bem nesse assunto.

É quase garantido que esta resposta seja a mais longa.

Isso cria uma função de tabela embutida para o SQL Server que usa @n e @ como parâmetros e retorna os resultados como uma coluna. O retorno de carro é significativo, caso contrário eu precisaria usar char (13).

CREATE FUNCTION G(@N INT,@ VARCHAR(MAX))RETURNS TABLE RETURN SELECT @+'
'+SPACE(@n-1)+'^'R

É usado da seguinte maneira

SELECT R 
FROM (VALUES
    (1,'This is test 1'),
    (2,'This is test 2'),
    (3,'This is test 3'),
    (4,'This is test 4'),
    (5,'This is test 5')
    )T(n,S)
    CROSS APPLY G(n,S)

E retorna

R
---------------
This is test 1
^
This is test 2
 ^
This is test 3
  ^
This is test 4
   ^
This is test 5
    ^

Uso muito criativo de uma linguagem não é realmente concebido para golfe;) +1
monkeyonkeyboard

14

Python, 27

lambda n,s:s+'\n%%%dc'%n%94

Isso usa dois níveis de formatação de string.

E aqui está uma solução de 25 bytes , parcialmente roubada da resposta do feersum (com a ordem dos argumentos invertida):

lambda*p:'%s\n%%%dc'%p%94

12

Bash, 27

printf %s\\n%$[$1-1]s^ "$2"

Resultado

$ ./carrot.sh 2 "Lorem ipsum, dollar sit amet."
Lorem ipsum, dollar sit amet.
 ^$ 

Cenoura? Além disso, qual é o dólar no final?
Scimonster

7
O dólar parece ser o alerta da concha.
M.Herzkamp

3
@ Scimonster Carrot foi minha tentativa de piada - veja minha edição da pergunta . E sim, o $final é o prompt do shell. A pergunta especifica que as novas linhas à direita são permitidas, mas não dizem que são necessárias.
Digital Trauma

10

Python, 29

lambda n,s:s+'\n'+' '*~-n+'^'

Concatena a sequência, uma nova linha, n-1espaços e a ^.


2
Se ao menos rjustnão fosse tanto tempo ...
Sp3000 10/10/2015

10
Ah, o operador do girino.
user253751

10

sed, 16

2y/1/ /;2s/ $/^/

Isso é uma espécie de caixa de teste dessa meta resposta . Especificamente, estou exigindo que o número N seja inserido como unário. Por exemplo, para o cursor na posição 2, a entrada para N seria 11. Também não está estritamente especificado qual ordem S e N deve ser, então aqui S vai primeiro, seguido por N unário em uma nova linha, por todo STDIN.

Resultado:

$ { echo "Lorem ipsum, dollar sit amet."; echo 11; } | sed '2y/1/ /;2s/ $/^/'
Lorem ipsum, dollar sit amet.
 ^
$

1
2y/1/ /;2s/ $/^/
manatwork

@manatwork Boa chamada!
Digital Trauma

9

JavaScript (ES6): 63 62 56 52 32 bytes

Agradecemos ao nderscore por reduzir bastante o tamanho do código.

p=(a,b)=>b+`\n${' '.repeat(a)}^`

Versão que funciona em mais navegadores (47 bytes):

p=function(a,b){return b+`\n${' '.repeat(a)}^`}

1. A pergunta usa indexação baseada em 1, então você precisa Array(a-1). 2. A função anônima é permitida por padrão, portanto você não precisa point=. 3. Para a versão ES6, você pode se livrar da returninstrução e do aparelho. Apenas use (a,b)=>b+"\n"+Array(a-1).join(" ")+" ^".
Dennis

1
33 bytes: (substitua \npor uma nova linha real)p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
nderscore

@dennis A indexação funciona perfeitamente para mim: i.stack.imgur.com/Tdejc.png
adroitwhiz

@ Dennis Array(1).join(' ')resultado em uma seqüência vazia :)
nderscore

@nderscore não consigo encontrar uma maneira de usar uma nova linha real sem causar uma quebra de linha no trecho de código, ea indexação segue o exemplo dado: i.stack.imgur.com/Tdejc.png
adroitwhiz

7

CJam, 9 bytes

q~N@(S*'^

Experimente online.

Como funciona

q~  e# Read the input from STDIN and interpret it.
    e# This pushes the integer and the string on the stack.
N@  e# Push a linefeed an rotate the integer on top of it.
(S* e# Subtract 1 and push a string consisting of that many spaces.
'^  e# Push a caret.

6

Python, 29

Aqui está uma maneira mais divertida de fazer isso em 29:

lambda*p:'%s\n%*s'%(p+('^',))

Exemplo de uso:

>>> f=lambda*p:'%s\n%*s'%(p+('^',))
>>> print f('lorem',5)
lorem
    ^

5

TI-BASIC, 10 (?) Bytes

Disp Ans
Output(3,N,"^

A entrada é fornecida na variável N, conforme a pergunta, mas você não pode usar a letra var S como uma string. Em lugar disso, é preciso entrada para a cadeia de Ans, de modo a executar o exemplo no OP: 2->N:"Lorem ipsum, dollar sit amet.":prgm<program name>.

Estou ciente de que isso provavelmente não conta, pois cada segmento delimitado por dois pontos é tecnicamente uma declaração separada; aqui está um programa de 46 bytes que recebe entrada como N "S"( 2 "Lorem ipsum, dollar sit amet.")

Input Str1
2+inString(Str1," 
//^there's a space after the quote
Disp sub(Str1,Ans,length(Str1)-Ans
Output(4,expr(sub(Str1,1,1)),"^

Ambos assumem que a tela foi limpa antes da execução.


Seria melhor você digitar Input da entrada para o número e Ans para a string.
lirtosiast

O primeiro também não funciona se o nome do programa, a atribuição e a sequência combinados tiverem mais de 16 caracteres.
lirtosiast

@ThomasKwa 26, na verdade, já que tenho uma calculadora de cores: P Tecnicamente funciona, se você contar sobrescrever parte da entrada como 'trabalhando'.
MI Wright

O primeiro funciona se você adicionar um ClrHome: Input N, porque o voto atual na meta para misturar métodos de E / S é +7.
lirtosiast

5

dc, 19

?pr256r^255/32*62+P

A entrada é de STDIN. dcstrings são definições de macro e estão contidas em [ ]. A sequência de espaços é gerada calculando o número que, quando expresso como um fluxo base de 256 bytes, fornece a sequência necessária. O cálculo é ((n ^ 256) / 255) * 32). Isso fornece nespaços (caractere ASCII 32), mas precisamos n-1segui-los ^, portanto, basta adicionar 62 ao último dígito base de 256.

Resultado

$ dc -e '?pr256r^255/32*62+P' <<< "2 [Lorem ipsum, dollar sit amet.]"
Lorem ipsum, dollar sit amet.
 ^$

4

C, 59 57 47 bytes

f(a,c){for(puts(a);--c;putchar(32));puts("^");}

Bem direto. Versão não destruída:

f(char* a,int c){
    puts(a);        //Print the string first

    for(;--c;)      //Until number-1 is not 0
        putchar(32);//Print a space
    puts("^");      //Print a caret
}

Teste aqui
Graças a @anatolyg por economizar 10 bytes!


É mais bonito mover-se puts(a)e putchar(32)entrar nos parênteses do forloop - existem exatamente 2 lugares vazios lá! Além disso, não acho que você precise declarar o tipo de ae c- apenas use o implícito intpara eles - funcionará se não o fizer #include <stdio.h>.
anatolyg

@anatolyg, Obrigado! Não achei que omitir os tipos funcionaria, mas, para minha surpresa, funcionou.
Spikatrix 10/06

4

C # 55

Uma função, conceito semelhante à minha resposta C, mas esse retorno de tempo é menor que a saída.

string f(string a,int b){return a+'\n'+"^".PadLeft(b);}

4

SAS, 35 bytes

%macro a(n,s);put &s/@&n."^";%mend;

Esse é o equivalente do SAS a uma função nua; adicionar a etapa de dados para chamá-lo (equivalente à função principal C para chamá-lo) seria um pouco mais (9 bytes a mais - Ty Alex), mas acho que isso não é necessário para esse fim. Como seria chamado:

data;
%a(3,"My String");
run;

Existe uma implementação somente de macro, mas é muito mais longa, mesmo que você permita que ele avise sobre parâmetros inválidos em n = 1.

Se pudéssemos usar parâmetros predefinidos, o SAS seria relativamente curto nesse caso, o que é uma raridade para um idioma que definitivamente não pretende ser curto.


Se um conjunto de dados pode ser a fonte de entrada, é como você o faria no SAS (ou por instruções% let), mas provavelmente não é permitido, isso é ainda mais curto ( 27 bytes , que na verdade pode ser 25). se você garantiu que o conjunto de dados foi construído imediatamente antes de executar isso [como você poderia usar set;]]):

(conjunto de dados pré-existente)

data b;
  n=3;
  s="My String";
run;

(código real)

data;set b;put s/@n"^";run;

É bom ver o especialista em SAS residente da SO aqui no PPCG. :)
Alex A.

Tenho certeza de que alguns dos veteranos que conhecem o script DM podem obter essa pontuação melhor ... E minhas habilidades no cmdmac são péssimas.
Joe

Eu sempre esqueço que o DM existe, e eu nem sei o que é cmdmac! Btw, quando você está contando bytes para toda a etapa de dados, não precisa data a;, basta fazer o data;que economizará 2 bytes. Mas, como você disse, não é necessário para esse fim.
Alex A.

Sim, meus reflexos arraigados no SAS não me deixam usar isso intuitivamente, eu acho :). Obrigado.
Joe

Falando em timers antigos, acho que você poderia salvar alguns bytes desafiando toda a intuição do SAS e usando uma macro de estilo antigo. Não me lembro se eles podem aceitar parâmetros.
Alex A.

3

Matlab / Octave, 41

@(n,s)sprintf('%s\n%s^',s,ones(1,n-1)+31)

Esta é uma função anônima que retorna a string. Isso produz um aviso, que pode ser suprimido pela chamada anterior warning off.


Você quer dizer o aviso do editor ou ele realmente imprime um aviso para você? Além disso, eu venci você por 16 caracteres ;-) Mas o meu imprime o ans =bit; portanto, depois de consertar isso, há apenas 10 caracteres de diferença.
Oebele

@ Obele imprime um aviso, mas a string retornada não é afetada.
FryAmTheEggman

3

K, 21 bytes

{y,"\n",1_|"^",x#" "}

Exemplo:

ryan@DevPC-LX:~/golf/caret$ rlwrap k
K Console - Enter \ for help

  `0:{y,"\n",1_|"^",x#" "}[2;"Lorem ipsum, dollar sit amet."]
Lorem ipsum, dollar sit amet.
 ^  

Explicação ( xé o número, yé a sequência):

{                   }   enclosing function
               x#" "    repeat the space `x` times
           "^",         prepend the caret
          |             reverse the string to put the caret at the end
        1_              drop the extra space
   "\n",                prepend a newline
 y,                     prepend the text

3

R, 49 48 46

Como uma função sem nome que gera STDOUT. Obrigado a @Flounderer pela melhoria.

usa strwrap agora para identificar o sinal de intercalação para n-1. cat usa um separador de \ n em vez de uma string vazia.

function(n,s)cat(s,strwrap('^',,n-1),sep='\n')

Execução de teste

> f=function(n,s)cat(s,strwrap('^',,n-1),sep='\n')
> f(29,'The caret should point here v hopefully')
The caret should point here v hopefully
                            ^
>

função (n, x) gato (x, "\ n", rep ("", n-1), "^", setembro = "") é de 48 caracteres
Flounderer

@Flounderer Obrigado por isso ... a minha ideia original era semelhante a isso, mas eu não fazê-lo tão bem
MickyT

Se me é permitido dois espaços iniciais, isso funciona: function(n,x)cat(" ",x,"\n",rep("",n),"^")e poupa alguns personagens
Flounderer

@ Flounderer Eu suspeito que não. O strwrap também tem algumas possibilidades, mas provavelmente acabaria por mais tempo.
MickyT

1
Isso é bom! Eu nunca vi a strwrapfunção antes. Existe uma maneira simples de dizer o que faz? Não consigo descobrir na documentação.
Flounderer

3

Python3, 38 36 bytes

def f(s,i):return s+'\n'+' '*~-i+'^'

# OR 

def f(s,i):print(s+'\n'+' '*~-i+'^')

Teste aqui!
Obrigado ao @Dennis por economizar 2 bytes!


(i-1)->~-i
Dennis

Eu sou fraco com operações de bits e matemática .... Obrigado mesmo assim! :-D
Spikatrix

2

Julia, 27 bytes

(n,s)->s*"\n"*" "^(n-1)*"^"

Isso cria uma função sem nome que aceita um número inteiro e uma string como entrada e retorna uma string. Para chamá-lo, dê um nome, por exemplo f=(n,s)->....

Tudo o que está acontecendo aqui é que estamos acrescentando uma nova linha, n-1espaços e o sinal de intercalação. A concatenação de strings é realizada usando *e repetição de strings com ^.

Ungolfed:

function f(n, s)
    s * "\n" * " "^(n-1) * "^"
end

Exemplo:

julia> println(f(2, "Lorem ipsum, dollar sit amet."))
Lorem ipsum, dollar sit amet.
 ^

2

PHP (CLI) - 42

<?=sprintf("%s\n%$argv[1]s",$argv[2],'^');

Chame a partir da linha de comando:

php pointer.php 2 "Lorem ipsum, dollar sit amet."

Eu só notei agora. Mas sua resposta é exatamente como minha segunda opção. Eu estou oferecendo a você: <?printf("$S\n%{$P}s",'^');. Substitua \npor uma nova linha real . O total é de 5 bytes. Isso funciona apenas no PBP4.1 e abaixo.
Ismael Miguel

Uau, tantos erros nesse comentário ... eu quis dizer que ele tem 26 bytes de comprimento e que só funciona no PHP4.1. E é seu!
Ismael Miguel

2

Matlab, 25

Este é extremamente atrevido. Aparentemente, exibe imprime caracteres não imprimíveis como espaços. O código a seguir define uma função chamada ans, que atende às especificações.

@(N,S)[S 10 ones(N-1) 94]

chamando essa função assim:

ans(2, 'Lorem ipsum, dollar sit amet.')

dá a saída:

ans =

Lorem ipsum, dollar sit amet.
 ^

Eu sempre não gosto da ans =parte das respostas do Matlab. Se isso for um problema, preciso adicionar 6 bytes ... mas sempre o vi assim nas respostas do Matlab. Observe que a execução desse código substitui a variável ans; portanto, você precisa redefinir a função se quiser usá-la uma segunda vez!


Muito agradável! Eu não sabia que colocar uma string em um vetor funcionava assim. Meu entendimento era que, como essa é uma função, a string retorna o valor significativo e o ambiente de substituição do MATLAB por acaso a imprime. ou seja, se você x=ans(2, 'asdf');não receber uma coisa ans =.
FryAmTheEggman

2

Minha primeira chance no codegolf

Java, 133 65

String g(int i,String s){for(s+="\n";--i>0;)s+=" ";return s+"^";}

Tenho certeza que pode ser reduzido ainda mais.

Código antigo

public void go(int i,String s){System.out.println(s);IntStream.range(1,i).forEach(j->System.out.print(" "));System.out.println("^");}

Você pode armazenar em algum System.outlugar?
Ismael Miguel

2
Não há necessidade public. E mude IntStream.range(1,i).forEach(j->System.out.print(" "));parafor(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuy aha! às vezes simples é melhor
pallavt

Você pode mover o s+="\n"interior da for()inicialização para usar o ponto-e-vírgula aí?
lirtosiast

@ThomasKwa 1 byte less
pallavt

2

Swift, 41

É decepcionante que o Swift não tenha o operador *ligado Arrayou String.

{$1+reduce(0..<$0,"\n",{$0.0+" "})+"^"}

Para Swift 2.0:{$1+(0..<$0).reduce("\n"){$0.0+" "}+"^"}
Kametrixom 22/07/2015

1

EspecificaçõesBAS - 34

1 INPUT n,s$: PRINT s$'TAB n-1;"^"

O apóstrofo PRINTforça uma nova linha, basta mover o cursor para a posição correta.



1

JavaScript - 52 bytes

Aqui está o meu, é bem simples.

function f(n,s){return s+"\n"+Array(n).join(" ")+"^"}

Uso:

$ console.log(f(7, "Any string at all"))

Any string at all
      ^

Aponta para o sétimo caractere.


Nice save Scimonster O_O
Florrie

1
Você pode escrever assim alert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^"). E você economiza 2 bytes. Além disso, você pode transformá-lo em um stasksnippet para mostrar o código em execução. Que espera que a corda para vir em primeiro lugar, então a posição
Ismael Miguel

1

Perl 5, 31

sub{"$_[0]
"." "x($_[1]-1)."^"}

Você pode salvar 2 a 3 caracteres. Solte a nova linha final como ela não é necessária e altere a primeira nova linha para uma nova linha literal. (Perl está tudo bem com cordas multi-linha)
Mr. Llama

@ Mr.Llama obrigado, esses são bons.
hobbs
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.