iMasters Fóruns: Trocar Valores entre 2 var.... - iMasters Fóruns

Ir para

Bom uso da área



Atenção:
Este subfórum é destinado apenas para postagem de desafios que ajudarão na elevação do nível de seus participantes.
Não é permitido a abertura de tópicos com dúvidas. Para isso, use o Fórum de PHP.
Página 1 de 1
  • Novo tópico
  • Responder

Trocar Valores entre 2 var.... Testando a lógica!

#1 Membro offline   David Ramires Ícone

  • David Ramires
  • Ícone
  • Grupo: Membros
  • Posts: 887
  • Cadastrado: 14-setembro 06
  • Sexo:Masculino
  • Localização:Suzano - SP

Ícone  Postou 09 fevereiro 2007 - 10:06

Galera.. beleza...
Bom tomara q ninguém me critique por colcoar esse desafio.. mas é bem interessante

dado os valores:

a = 100;
b = 20;

----------------
trocar os valores sem usar uma terceira variável... e claro o resultato é:


a = 20;
b = 100;


t+

#2 Membro offline   madeinnordeste Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 13
  • Cadastrado: 27-junho 03

Postou 10 fevereiro 2007 - 00:54

a = 100;
b = 20;

a = a + b // a = 100 + 20 (120)
b = a - b // b = 120 - 20 (100)
a = a -b // a = 120 - 100 (20)

;)

#3 Membro offline   David Ramires Ícone

  • David Ramires
  • Ícone
  • Grupo: Membros
  • Posts: 887
  • Cadastrado: 14-setembro 06
  • Sexo:Masculino
  • Localização:Suzano - SP

Postou 12 fevereiro 2007 - 07:01

beleza.... madeinnordeste ... certinho! ... :thumbsup:

#4 Membro offline   nolfolk Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 443
  • Cadastrado: 21-abril 04

Postou 27 fevereiro 2007 - 19:53

ok, a regra é

trocar os valores sem usar uma terceira variável...
então eu faria assim:

$a = 20;
$b = 100;

pronto, não usei uma terceira variavel o.O

#5 Membro offline   David Ramires Ícone

  • David Ramires
  • Ícone
  • Grupo: Membros
  • Posts: 887
  • Cadastrado: 14-setembro 06
  • Sexo:Masculino
  • Localização:Suzano - SP

Postou 01 março 2007 - 11:24

então monta um script para mim.... para fazer desse jeito que você faz .. rsrs :thumbsup:

#6 Membro offline   Perfect Lion Ícone

  • TOMA A PATADA DO LION ´0:
  • Ícone
  • Grupo: Membros
  • Posts: 857
  • Cadastrado: 29-outubro 04
  • Localização:São Bernardo do Campo/SP

Postou 13 março 2007 - 09:33

=D

$a= 20;
$b=100;
list($b,$a) = array($a,$b);
echo "a = " . $a . " e b = " . $b;


#7 Membro offline   Epyllion Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 155
  • Cadastrado: 05-janeiro 06

Postou 14 março 2007 - 15:30

$a = 20;
$b = 100;
extract(array('a' => $b, 'b' => $a));
echo "a-> " . $a . " | b-> " . $b;


#8 Membro offline   cristtianodf Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 2
  • Cadastrado: 18-junho 05

Postou 26 julho 2007 - 16:51

vale assim?rs

$$a=$b;
$b=$a;
$a=$$a;

#9 Membro offline   Alaerte Gabriel Ícone

  • Soluções
  • Ícone
  • Grupo: Membros
  • Posts: 3943
  • Cadastrado: 28-abril 07
  • Sexo:Masculino
  • Localização:Itabuna-BA

Postou 20 setembro 2007 - 17:40

Esse ta certo :D

<?
$a= 100;
$b=20;
list($b,$a) = array($a,$b);
echo "\$a = $a e \$b =  $b";
?>


#10 Membro offline   batatinha66 Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 224
  • Cadastrado: 12-outubro 07

Postou 12 outubro 2007 - 14:00

oi sou novo aki
mais tah aih:
$a = str_replace('100','20',$a);
$b = str_replace('20','100',$B);
:thumbsup:

#11 Membro offline   Dukelouis Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 6
  • Cadastrado: 31-outubro 07

Postou 01 novembro 2007 - 16:39

Mas o interessante seria pensar em variáveis com qualquer valor... e nesse caso muitas aki falham :P

#12 Membro offline   lmbagolin Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 59
  • Cadastrado: 12-novembro 07
  • Localização:Joinville SC

Postou 13 novembro 2007 - 11:19

é isso ai óh

$a = 20;
$b = 100;

echo "<br>a = $a <br>b = $b";

$b = $b - $a;
$a = $b + $a;
$b = $a - $b;

echo "<br>a = $a <br>b = $b";

Passo a Passo
a = 20
b = 100

b = 100 - 20 (80)
a = 80 + 20 (100)
b = 100 - 80 (20)

a = 100
b = 20

:thumbsup:

#13 Membro offline   Ricardo.RFS Ícone

  • Ricardo Floriano
  • Ícone
  • Grupo: Membros
  • Posts: 155
  • Cadastrado: 04-março 04
  • Localização:Ribeirão Preto / SP

Postou 03 janeiro 2008 - 22:59

Muito show... aprende muito sobre o list agora... rss

valeu

#14 Membro offline   Rarylson Freitas Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 35
  • Cadastrado: 14-junho 08

Postou 18 outubro 2008 - 21:20

Acredito que a idéia do desafio deve ser: trocar dois valores sem utilizar uma terceira variável e utilizando um algoritmo eficiente.
Dessa forma, como a imensa maioria dos algoritmos aqui apresentados não são nada eficientes, não devem ser consideradas como solução.
Pior é quando se usam funções para realizar a operação de troca. Chamada de função ocorre em tempo de execução maior e, para piorar, são criadas mais variáveis pela função chamada (assim, não houve economia de variáveis, e sim um aumento delas).
Além do que chamar uma função que resolve um problema nem sempre é resolver o problema. Na verdade quem resolveu o problema foi a função, não vocês.

A solução "boa" apresentada aqui foi:

Quote

$b = $b - $a;
$a = $b + $a;
$b = $a - $b;


já que ela só utiliza duas variáveis de fato (não existem funções criando outras variáveis), não há chamadas a funções, o algoritmo só utiliza três operações básicas de atribuição e retorna o valor esperado. Parabéns MadeInNordeste

Uma solução melhor é através de operadores bit-a-bit XOR.
Suponha que $a e $b sejam inteiros e que suas representações em binário sejam, respectivamente, 1001 e 0011.
O operador && (OR não bit-a-bit) é bastante conhecido. Ele converte os operandos um booleanos e faz a comparação

Quote

$c = $a && $b;

neste exemplo, $a é convertido pra true, $b pra true e TRUE AND TRUE = TRUE, logo, $c = TRUE.
Usamos && muito em if.
Um operador bit-a-bit é parecido, só que ele não faz a conversão para booleano. Ele compara os valores bit-a-bit.
Exemplo:

Quote

$c = $a & $b; // usamos só um & quando desejamos utilizar o operador bit-a-bit

nesse exemplo, $c = 0001, pois realizamos a operação com cada um dos bits de $a e $b

Quote

1001 &
0011 =
0001

olhando pro 1º algarismo de $a e $b, 1 & 0 = FALSE (0); pro segundo, 0 & 0 = 0; pro terceiro, 0 & 1 = 0; pro último, 1 & 1 = TRUE (1).
O operador XOR (^) é parecido com o OR (|), só que só retorna true se os bits comparados forem, ou o 1º TRUE, ou o segundo TRUE, mas não os dois ao mesmo tempo (por isso é chamado de OU EXCLUSIVO). Assim, 0^0=0, 1^1=0, 0^1=1, 1^0=1.
Demonstra-se matematicamente que o operador comuta ($a^$b=$b^$a), é associativo ($a^$B)^$c = $a^($b^$c) e que $a^$a^ = operador identidade, isto é, $a^$a^$b = I($B) = $b, isto é, é como se não existisse $a^$a^. Para entender a última propriedade, basta ver que $a ^ $a = 0, para todo $a, e que 0^$b=$b, para todo $b.
Ver este link, do site PHP.net
Além disso, a utilização desse operador é mais rápido que os operadores + e -, o que faz o algoritmo apresentado a seguir ser mais eficiente do que o algoritmo que eu falei inicialmente, mostrado por MadeInNordeste.
$a = $a^$b;
$b = $a^$b;	  // b passa a ser ($a^$b)[novo valor de $a] ^$b = $a^($b^$b)= $a^0 = $a
$a = $a^$b;	  // a passa a ser ($a^$b)[novo valor de $a, associado na 1ª linha] ^ $a[novo valor de $b, após a segunda linha] = $a^($b^$a) = $a^($a^$b) (pela propriedade da comutatividade) = ($a^$a)^$b= 0^$b = $b

Essa solução pode ser até de difícil compreensão, mas está correta e é eficiente.

Agora, uma dica pra vcs. Embora seja fácil ver que a solução do MadeInNordeste está correta, sempre é bom demonstrar (e não dá um exemplo), pois tem algoritmos ineficazes que funcionam somente para alguns exemplos. Demonstrando, sabemos q o algoritmo funciona para todos os casos.
Demonstrando o algoritmo do MadeInNordeste:

Quote

$b = $b - $a;
$a = $b + $a; // $a = ($b-$a)[$b depois da primeira linha] + $a = $b + ($a-$a) = $b
$b = $a - $b; // $b = $b[novo valor de $a, após a segunda linha] - ($b-$a)[$b depois da primeira linha] = $b-$b+$a = $a


Vlw galera pelo interessante problema.

-----------
Rarylson Freitas
2º Ano
Instituto Militar de Engenharia

#15 Membro offline   Math Man Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 7
  • Cadastrado: 30-maio 06

Postou 20 outubro 2008 - 16:54

$a = 100;
$b = 20;

$a ^= $b ^= $a ^= $b;

echo "{$a}\n{$b}";


#16 Membro offline   Rarylson Freitas Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 35
  • Cadastrado: 14-junho 08

Postou 22 outubro 2008 - 23:39

Valew Math Man por ter colocado a solução usando XOR em uma forma mais compacta. Se ficou um pouco complicado o código dele pra alguém, vou colocar outro com praticamente a mesma velocidade de execução que é bem claro.
$a ^= $b;
$b ^= $a;
$a ^= $b;

Vale salientar que

Quote

$b = $b - $a;
$a = $b + $a;
$b = $a - $b;

apresenta alguns problemas. Imagine, por exemplo, um programa em C que utiliza inteiros de 8 bits.
Sejam também

Quote

$a = 01111111
$b = 11001111

Usei $ (embora não seja o padrão do C) para manter a sintaxe do PHP.
Lembrar que em C o primeiro algarismo se refere ao sinal, assim,

Quote

$a = -1111111
$b = +1001111

Ao realizar a primeira operação, executa-se o código da direita para a esquerda e

Quote

-$a = +1111111
$b - $a = (+1111111) + (+1001111)

Daí, o número resultante é maior que o maior inteiro que pode ser armazenado, o que ocorrerá em um erro.
Um erro deste tipo não acontece usando o algoritmo que usa XOR, já que o valor atribuído para $b continuará a ter 8 algarismos.
Outra observação relevante é que este algoritmo também serve para trocar variáveis de outros tipos (como string, float) sem nenhum problema.

#17 Membro offline   Daniel o rei Ícone

  • danielbelmiro
  • Ícone
  • Grupo: Membros
  • Posts: 186
  • Cadastrado: 31-maio 08
  • Sexo:Masculino

Postou 13 novembro 2008 - 06:57

a = b
b = a

#18 Membro online   Beraldo Ícone

  • Insônia
  • Ícone
  • Grupo: Membros
  • Posts: 7069
  • Cadastrado: 02-julho 06
  • Sexo:Masculino
  • Localização:Curitiba - PR

Postou 13 novembro 2008 - 07:13

Ver postDaniel o rei, em 13/11/2008 - 07:57, disse:

a = b
b = a

Já testou isso para ver se funciona?
Nem precisa testar. Basta pensar um pouco.

#19 Membro offline   Alaerte Gabriel Ícone

  • Soluções
  • Ícone
  • Grupo: Membros
  • Posts: 3943
  • Cadastrado: 28-abril 07
  • Sexo:Masculino
  • Localização:Itabuna-BA

Postou 13 novembro 2008 - 08:20

kkkkkkkkkk

#20 Membro offline   Raul Souza Silva Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 24
  • Cadastrado: 18-janeiro 08
  • Localização:São Paulo

Postou 25 fevereiro 2009 - 14:40

É a coisa mais fácil do mundo fazer isso..xD
<?php
$a = 100;
$b = 20;
$a = $b;
$b = $a;
?>


Ver postDavid Ramires, em 09/02/2007 - 10:06, disse:

Galera.. beleza...
Bom tomara q ninguém me critique por colcoar esse desafio.. mas é bem interessante

dado os valores:

a = 100;
b = 20;

----------------
trocar os valores sem usar uma terceira variável... e claro o resultato é:


a = 20;
b = 100;


t+


#21 Membro online   Beraldo Ícone

  • Insônia
  • Ícone
  • Grupo: Membros
  • Posts: 7069
  • Cadastrado: 02-julho 06
  • Sexo:Masculino
  • Localização:Curitiba - PR

Postou 25 fevereiro 2009 - 14:46

Ver postRaul Souza Silva, em 25/02/2009 - 14:40, disse:

É a coisa mais fácil do mundo fazer isso..xD
<?php
$a = 100;
$b = 20;
$a = $b;
$b = $a;
?>



Repito o que eu disse aqui

#22 Membro offline   João Vitor Ramos Tonolli Ícone

  • João Vitor
  • Ícone
  • Grupo: Membros
  • Posts: 154
  • Cadastrado: 17-abril 09
  • Sexo:Masculino
  • Localização:Guarulhos - SP

Postou 14 outubro 2009 - 22:49

a coisa mais fácil do mundo de se fazer usando mais de 3 linhas; a graça do tópico é usar a lógica economizando código.

#23 Membro offline   darklady Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 10
  • Cadastrado: 29-março 09

Postou 16 outubro 2009 - 00:16

Nao funciona mesmo

$a = $b;
$b = $a;

#24 Membro offline   João Vitor Ramos Tonolli Ícone

  • João Vitor
  • Ícone
  • Grupo: Membros
  • Posts: 154
  • Cadastrado: 17-abril 09
  • Sexo:Masculino
  • Localização:Guarulhos - SP

Postou 21 outubro 2009 - 12:40

eu faria



$valores = array($b,$a);
list($a,$B) = $valores;



#25 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 21 outubro 2009 - 13:21

Ver postJoão Vitor Ramos Tonolli, em 21 outubro 2009 - 13:40 , disse:

eu faria
$valores = array($b,$a);
list($a,$B) = $valores;


Quote

trocar os valores sem usar uma terceira variável...


Sem usar uma terceira variável.

Carlos Eduardo

#26 Membro offline   João Vitor Ramos Tonolli Ícone

  • João Vitor
  • Ícone
  • Grupo: Membros
  • Posts: 154
  • Cadastrado: 17-abril 09
  • Sexo:Masculino
  • Localização:Guarulhos - SP

Postou 22 outubro 2009 - 03:14

não seja por isso.
 list($a,$B) = array($b,$a);


#27 Membro online   Beraldo Ícone

  • Insônia
  • Ícone
  • Grupo: Membros
  • Posts: 7069
  • Cadastrado: 02-julho 06
  • Sexo:Masculino
  • Localização:Curitiba - PR

Postou 22 outubro 2009 - 08:26

um array não deixa de ser uma "variável" (na verdade uma estrutura de dados) auxiliar.

#28 Membro offline   João Vitor Ramos Tonolli Ícone

  • João Vitor
  • Ícone
  • Grupo: Membros
  • Posts: 154
  • Cadastrado: 17-abril 09
  • Sexo:Masculino
  • Localização:Guarulhos - SP

Postou 22 outubro 2009 - 11:02

na verdade ele não conta como uma variavel, o primeiro modelo que eu fiz contava, pois eu colocava o array dentro da variavel, e jogava a variavel no list()
ai não listei os valores delimitados pelo array(), que pode ser chamado de função nativa auxiliar no caso.

#29 Membro online   Beraldo Ícone

  • Insônia
  • Ícone
  • Grupo: Membros
  • Posts: 7069
  • Cadastrado: 02-julho 06
  • Sexo:Masculino
  • Localização:Curitiba - PR

Postou 22 outubro 2009 - 11:19

array é uma estrutura de dados, que fica armazenada na memória, como uma variável qualquer. Logo, é considerada "variável" auxiliar.

#30 Membro offline   João Vitor Ramos Tonolli Ícone

  • João Vitor
  • Ícone
  • Grupo: Membros
  • Posts: 154
  • Cadastrado: 17-abril 09
  • Sexo:Masculino
  • Localização:Guarulhos - SP

Postou 22 outubro 2009 - 12:06

e mais a estrutura pode aderir mais de uma forma
no caso se eu tivesse feito
$var[] = $b
$var[] = $a

ai sim iria guardar na memória

mais como só usei
list($a,$B ) = array($b,$a);
pracitamente não guardei na memória, porque não atribui a nenhuma variavel, array(); não é uma variavel que guarda valores
tanto que eles seriam perdidos na hora, diferentemente do primeiro exemplo que sim, seria um array na variavel que estaria guardando espaço temporario na memoria
no modo que usei, utilizei a estrutura basica do array, seus indices.

#31 Membro online   Beraldo Ícone

  • Insônia
  • Ícone
  • Grupo: Membros
  • Posts: 7069
  • Cadastrado: 02-julho 06
  • Sexo:Masculino
  • Localização:Curitiba - PR

Postou 22 outubro 2009 - 16:41

você está se referindo ao script PHP.
Quando isso é compilado, em linguagem de máquina, o array ocupa, sim, espaço na memória. Caso contrário, seria impossível armazenar os valores. Você teria de salvá-los em cache ou em registradores do processador, o que não é possível fazer com PHP.

#32 Membro offline   Renato Siroma Ícone

  • ... aprecie o silêncio
  • Ícone
  • Grupo: Membros
  • Posts: 856
  • Cadastrado: 08-dezembro 08

Postou 06 novembro 2009 - 12:45

Quote

pracitamente não guardei na memória, porque não atribui a nenhuma variavel, array(); não é uma variavel que guarda valores

Defina Array:
_________________________________________________________


PS: Sempre tive a visão de que um array era um espaço alocado na memória do sistema...podendo conter vários índices.
PS2: Variável "$a" é um array.
PS3: Variável é array ,logo , Array é variável.

$txt = 'abc';
echo $txt[1];//Mostra a


#33 Membro offline   João Batista Neto Ícone

  • Verschränkung
  • Ícone
  • Grupo: Moderadores Trainee
  • Posts: 876
  • Cadastrado: 03-janeiro 09
  • Sexo:Masculino
  • Localização:Franca/SP

Postou 07 novembro 2009 - 10:58

Bom, falando de arrays e troca de valores me lembrou de ordenação, então:

function qsort( array &$m , $l = 0 , $r = null ){
	$r = $r == null ? count( $m ) - 1 : $r;
	$i = (int) $l; $j = (int) $r;
	$p =& $m[ floor( ( $l + $r ) / 2 ) ];

	if ( $i < $j ){
		while ( $m[ $i ] < $p ) ++$i;
		while ( $m[ $j ] > $p ) --$j;

		if ( $i <= $j ){
			if ( $m[ $i ] != $m[ $j ] ) $m[ $i ] ^= $m[ $j ] ^= $m[ $i ] ^= $m[ $j ];
			$i++; $j--;
		}
	}

	if ( $j > $l ) qsort( $m , $l , $j );
	if ( $i < $r ) qsort( $m , $i , $r );
}


$arr = array( 1 , 8 , 3 , 5 , 7 , 2 , 6 , 9 , 4 );
qsort( $arr );

var_dump( $arr );


Saída:

Quote

array(9) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
[6]=>
int(7)
[7]=>
int(8)
[8]=>
int(9)
}


:P

Página 1 de 1
  • Novo tópico
  • Responder

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)