Resultados 1 a 8 de 8

Tópico: Desafio amigo oculto

  1. #1
    Membro ingresso
    Data de Ingresso
    Apr 2012
    Posts
    70
    Post Thanks / Like

    Exclamation Desafio amigo oculto

    Desafio amigo oculto

    Época de final de ano é normal esse tipo de coisa , por isso eu tive essa ideia , segue abaixo o desafio:

    Regras:

    1. Receba o numero de participantes do usuário, o numero recebido não pode ser menor do que 3;
    2. Depois de receber o numero de participantes , receba os nomes , se os nomes tiverem menos de 4 caracteres informe que somente são permitidos nomes usuários com 4 caracteres ou mais;
    3. Não use o loop while;
    4. Quando um elemento do array for sorteado , apague esse elemento da lista;
    5. Nenhum participante pode tirar ele mesmo;
    6. Cada participante tem que tirar um participante único;
    7. No final imprima qual participante ficou com qual , se o participante x tirou o participante y , e vice-versa , imprima somente uma vez , não duas , e coloque -> "(ambos)" na frente;
    8. Somente saia do programa quando ctrl+c for pressionado 3 vezes , ou então depois de o programa ser corretamente usado.


    Dicas (caso não consiga pensar em nada):
    Código:
     * Coloque os participantes recebidos em um array;
    
     * Faça um sistema que gere números aleatórios , como os participantes estão em um array use esses números para pegar o elemento do
       array correspondente ao numero aleatório gerado.
    Obs.: O programa pode ser feito em qualquer linguagem!
    É isso ai C;
    Última edição por str0p; 10 Dec 2013 às 14:35.

  2. #2
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    Bom fazendo TOTALMENTE dentro das regras, deu algo meio grandinho, claro que não parei para otimizar, mas ai vai munha solução em Perl:

    Código PHP:
    #!/usr/bin/perl

    #######################
    #Desafio Amigo Secreto#
    #    guedes.acp       #
    #   Forum Invaders    #
    #forum-invaders.com.br#
    #######################

    use common::sense;
    use 
    DDP;
    my @n;
    my $n;
    my $c 0
    @
    SIG{qw(INT TERM HUP)} = sub $c >= ? die : $c++ };
    {
        
    my $nome;
        
    sub opglobp{
             
    say "Insira o numero de partidipantes";
            
    chomp ($n = <>);
            
    $n participantes($n);
            &
    opfn;
        }
        
    sub opglobn{
            
    say "Insira o nome do partidipante";
            
    chomp ($nome = <>);
            
    nomes($nome) ? push(@n$nome) : &opglobn;
        }
        
    sub opfn{
            for (
    my $i 0$i <= $n -1$i){
                
    opglobn;
                
    $i++;
            }
        &
    main;
        }
    }
        
    sub help{
         
    given($_[0]){
            
    when(1){say "O numero de participantes deve ser maior ou igual a 3"; return 0}
            
    when(2){say "Nao e permitido nomes com menos de 4 caracteres";opglobn}
        }
    }
    sub participantes {($_[0] <= 2) ? return help(1) : return $_[0]} #determina n de participantes
    sub nomes {(length $_[0] < 4) ? return help(2) : return $_[0]} #recebe os nomes dos participantes
    sub sortnamemy $p int rand(@_); return $_[$p], $p}

    sub main {
        
    my @nomes = @n;
        
    my @nomesi = @nomes;
        
    my $cn = @nomes;
        
    my %sort;
        
    DUMP: for (my $i =0$i <= $cn$i++){
            
    my ($s$po) = sortname(@nomes);
             
    my ($si$poi) = sortname(@nomesi);
            if (
    $s ne $si){
                
    splice(@nomes$po1);
                
    splice(@nomesi$poi1);
                if(!
    exists $sort{$si}){
                    
    $sort{$s} = $si;
                }
                else{
                    if(
    $sort{$sieq $s){
                        
    $sort{$si} = $sort{$si} . " =>ambos";
                    }
                    else{
                        
    $sort{$s} = $si;
                    }
                }
            }
            else{
     if (@
    nomes != 0) {
    $i--;
     
    next DUMP;
    }
    }
         }
        
    %sort;
    }
    opglobp
    link pastebin

    Para quem não sabe ou não tem, o common::sense pode ser substituído por
    Código PHP:
    use stricts;
    use 
    warnings;
    use 
    features qw'say'
    o DDP é o Data::Printer é serve para exibir a estrutura de dados de forma mais "bunitinha"
    mas quem não tem o DDP pode substituir
    Código PHP:
    %sort
    por
    Código PHP:
    say "$_ => $sort{$_}foreach keys %sort
    Agora o melhor seria fazer
    Código:
    cpan install Data::Printer
    cpan install common::sense
    na shell ou cmd e ser feliz
    Última edição por .Nero; 25 Nov 2013 às 18:05.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  3. #3
    Moderador ingresso Avatar de .Nero
    Data de Ingresso
    Feb 2012
    Localização
    Earth
    Posts
    699
    Post Thanks / Like
    Amigo Oculto feito em Java.

    PS: Agradecimentos ao hacker_wap, por me dar uma luz num problema banal na parte do sorteio, mas que mudava tudo.


    Código:
    package invaders;
    
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    
    
    class QIExc extends Exception {
    
    
        @Override
        public String toString() {
            return "Quantidade de jogadores inválida, o jogo deve conter três ou mais jogadores.";
        }
    }
    
    
    class NIExc extends Exception {
    
    
        @Override
        public String toString() {
            return "Nome muito curto, o nome deve conter quatro ou mais letras.";
        }
    }
    
    
    class IMExc extends Exception {
    
    
        @Override
        public String toString() {
            return "O valor digitado não é um número inteiro.";
        }
    }
    
    
    abstract class Pessoa {
    
    
        private String nome;
    
    
        public Pessoa(String nome) {
            this.nome = nome;
        }
    
    
        protected String getNome() {
            return nome;
        }
    }
    
    
    class Jogador extends Pessoa {
    
    
        private Jogador sorteou;
        private boolean sorteado = false;
    
    
        public Jogador(String nome) {
            super(nome);
        }
    
    
        protected boolean foiSorteado() {
            return sorteado;
        }
    
    
        protected void sortear(Jogador jogador) {
            sorteou = jogador;
            jogador.sorteado = true;
        }
    
    
        protected Jogador sorteou() {
            return sorteou;
        }
    }
    
    
    class Jogo {
    
    
        private List<Jogador> jogadores = new ArrayList<>();
    
    
        void setJogadores() throws QIExc, NIExc, IMExc {
            Scanner in = new Scanner(System.in);
            int quantidade = 0;
    
    
            System.out.print("[1] Digite a quantidade de jogadores (3+): ");
            try {
                quantidade = in.nextInt();
            } catch (java.util.InputMismatchException e) {
                throw new IMExc();
            }
    
    
            if (quantidade < 3) {
                throw new QIExc();
            }
    
    
            System.out.println("\n[2] Digite o nome dos jogadores:\n");
            for (int i = 0; i < quantidade; i++) {
                int aux = i;
    
    
                System.out.print("Jogador #" + ++aux + ": ");
                String nome = in.next();
    
    
                if (nome.length() > 3) {
                    jogadores.add(new Jogador(nome));
                } else {
                    throw new NIExc();
                }
            }
        }
    
    
        void iniciarSorteio() {
            List<Jogador> presenteador = new ArrayList<>(jogadores);
            List<Jogador> presenteado = new ArrayList<>(jogadores);
    
    
            Collections.shuffle(presenteador);
            Collections.shuffle(presenteado);
    
    
            for (int i = 0; i < presenteador.size(); i++) {
                List<Jogador> temp = new ArrayList<>(presenteado);
                temp.remove(presenteador.get(i));
    
    
                for (int j = 0; j < temp.size(); j++) {
                    if (temp.get(j).foiSorteado()) {
                        temp.remove(j);
                    }
                }
    
    
                Collections.shuffle(temp);
                presenteador.get(i).sortear(temp.get(0));
            }
    
    
            jogadores = presenteador;
        }
    
    
        void getResultado() {
            List<Jogador> resultado = jogadores;
    
    
            System.out.println("\n[!] Resultado:\n");
    
    
            for (int i = 0; i < resultado.size(); i++) {
                String nome1 = resultado.get(i).getNome();
                String nome2 = resultado.get(i).sorteou().getNome();
    
    
                System.out.print(nome1 + " - " + nome2);
    
    
                // Se A sorteou B e vice-versa
                if (resultado.get(i).sorteou().sorteou().equals(resultado.get(i))) {
                    System.out.print(" (ambos)");
                    resultado.remove(resultado.get(i).sorteou());
                }
    
    
                System.out.println("");
            }
        }
    }
    
    
    public class Main {
    
    
        public static void main(String[] args) throws QIExc, NIExc, IMExc {
            Jogo amigoOculto = new Jogo();
    
    
            amigoOculto.setJogadores();
            amigoOculto.iniciarSorteio();
            amigoOculto.getResultado();
        }
    }
    - kiss principle -
    - repeat after me: harem -


  4. #4
    Veterano ingresso
    Data de Ingresso
    Jan 2011
    Localização
    Pguá ~ PR
    Posts
    2.363
    Post Thanks / Like
    Salve!
    Fiz em Perl, quase uma cópia do Acp. =]

    Código:
    #! /usr/bin/perl
    
    use common::sense;
    use List::Util 'shuffle';
    
    my @users;
    
    sub doinput
    {
        my $foo = shift;
        print $foo;
        chomp(my $baz = <STDIN>);
        return $baz;
    }
    
    sub ask
    {
        my $np = doinput("Insira o numero de participantes: ");
        ($np < 3) ? die("O numero de participantes deve ser >= 3.\n"):!3;
        for(my $i = 0; $i < $np; $i++)
        {
            my $usr = doinput("Insira o nome do participante ".$i .": ");
            (length($usr) < 4) ? die "O nome do participante deve conter >= 4 letras\n":!4;    
            push(@users, $usr);
        }    
    }
    
    sub doshuffle
    {
        my @poo = @_;
        return((shuffle 0..$#poo)[0..$#poo]);
    }
    
    sub dosort
    {
        my (@list, %table);
        for (my $i = 0; $i < @users; $i++)
        {
            my $sorted = int(doshuffle(@users));        
            
            $table{$i} = $sorted if(($i != $sorted) and (not $sorted ~~ @list));
            exit &dosort if (($sorted ~~ @list) or ($i == $sorted));
            push(@list, $sorted);
        }
        for my $key (keys %table) 
        {
            my $val = $table{$key};
            printf("%s => %6s\n", $users[$key], $users[$val]);
        }
    }
    
    sub main
    {
        my $c = 0;
        @SIG{'INT'} = sub { $c >= 2 ? die"\n$!!\n" : $c++ }; # Aureliano!
        ask;
        dosort;     
    }
    main;
    O código cumpre com todas as regras descritas no tópico, exceto a 7.

    Última edição por str0p; 25 Dec 2013 às 12:13.

  5. #5
    Moderador ingresso Avatar de .Nero
    Data de Ingresso
    Feb 2012
    Localização
    Earth
    Posts
    699
    Post Thanks / Like
    Meu presente pro acp: [PRESENTE] 18+

    E ai wap, o que eu vou ganhar? '-'
    - kiss principle -
    - repeat after me: harem -


  6. #6
    Membro ingresso Avatar de hacker_wap
    Data de Ingresso
    Feb 2009
    Posts
    152
    Post Thanks / Like
    Nero é simplório mais vai ser o primeiro de muitos [...]
    Falta o resto da turma distribuir os presentes.

    Feliz Natal a todos
    É melhor não dizer nada e pensarem que é bobo, do que abrir a boca e acabar com as duvidas.

  7. #7
    Banned ingresso
    Data de Ingresso
    Aug 2014
    Localização
    Óêðàèíà
    Posts
    19
    Post Thanks / Like

    ÓÊÐÏËÀÑÒÈÊ

    This post requires you to click the Likes button to read this content. This post requires you to click the Likes button to read this content.

  8. #8
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.445
    Post Thanks / Like
    This post requires you to click the Likes button to read this content. This post requires you to click the Likes button to read this content.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  9. Likes mmxm liked this post

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •