Rimozione lettere doppie

Stato
Discussione chiusa ad ulteriori risposte.

_Wizard

Utente Silver
12 Marzo 2009
0
0
0
55
Fonte: http://openh4ck.altervista.org/phpBB2/viewtopic.php?t=568
forse un po' banale, ma lo posto ugualmente. L'esercizio consiste nel trovare lettere doppie, togliere la doppia e printarla. Un esempio:
stringa: 01hello_boyss0122
l'output è qualcosa del genere:
nuova stringa = 01helo_boys012
rimosse = ls2
n rimossi = 3
Mie soluzioni:
Php:
Codice:
<?php
error_reporting(0);
if($argc < 2)
   die("Usage: ".$argv[0]." <string>");
for($i=0;$i<strlen($argv[1]);$i++)
   if($argv[1][$i] != $argv[1][$i+1])
      $out[0] .= $argv[1][$i];
   else
      $out[1] .= $argv[1][$i];
print "String passed: ".$argv[1]."\n";
print "New string: ".$out[0]."\n";
print "Letters removed: ".$out[1]."\n";
print "Numbers of removed: ".strlen($out[1])."\n";
?>
Perl:
Codice:
#!/usr/bin/perl -w
$a = shift or die("Usage: name.pl <string>");
@str = split //, $a;
for($i=0;$i<$#str+1;$i++) {
   if($str[$i] ne $str[$i+1]) {
      $out1 .= $str[$i];
   } else {
      $out2 .= $str[$i];
   }
}
print "String passed: ".$a."\n";
print "New string: ".$out1."\n";
print "Letters removed: ".$out2."\n";
print "Numbers of removed: ".length($out2)."\n";
Bye
 
Codice:
#include <iostream>

using namespace std;

int main() {
    string s,n,r;
    getline(cin, s);
    for(unsigned int i=0;i<s.length();i++)
        if(s[i] != s[i+1])
            n += s[i];
        else
            r += s[i];
    cout<<"Nuova: "<<n<<endl
        <<"Rimosse: "<<r<<endl
        <<"n* rimosse: "<<r.length();

    return 0;
}
 
Questo è il mio in C
in java ho alcuni problemi xD


Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rmdoppie(char*);

void rmdoppie(char *str)
{
    char *newstr=(char*)malloc(strlen(str)*sizeof(char));
    char *removed=(char*)malloc(strlen(str)*sizeof(char));
    int i,num=0,pos=0;
    
    for(i=0;i<=strlen(str);i++)
    {
       if (str[i]==str[i+1])
       {
          removed[num]=str[i];
          num++;
       }
       else
       {
           newstr[pos]=str[i];
           pos++;
       }
    }
    printf("Frase completa: %s\n",str);
    printf("Frase Modificata: %s\n",newstr);
    printf("Lettere eliminate: %s\n",removed);
    printf("Numero lettere eliminate %d\n",num);
}
    
int main()
{
    rmdoppie("01hello_boyss0122");
    getchar();
    return 0;
}
 
_Wizard ha detto:
Fonte: http://openh4ck.altervista.org/phpBB2/viewtopic.php?t=568
forse un po' banale, ma lo posto ugualmente. L'esercizio consiste nel trovare lettere doppie, togliere la doppia e printarla. Un esempio:
stringa: 01hello_boyss0122
l'output è qualcosa del genere:
nuova stringa = 01helo_boys012
rimosse = ls2
n rimossi = 3
[...]

Non ho capito bene l'esercizio (pur essendo in Italiano XD)...
se la stringa è: 01hello_boyss0122

le doppie dovrebbero essere: '0','l', 'o', 's', '1', '2'

per cui l'output sarà: 01helo_bys2

Scusate ma non capisco dove sbaglio nella comprensione... :confused:
 
Si doppie consecutive.
In java:

Codice:
class Stringhe
{
     public static void main(String args[])
     {
         Stringhe a = new Stringhe();
         a.rmDoppie("cciiaaoo");
     }
     
     public void rmDoppie(String str)
     {
        int i,conto=0,pos=0;
        String nuova="",removed="";
        
        for(i=0;i<str.length();i++)
        {
            if(i != str.length() -1 && str.charAt(i)==str.charAt(i+1))
            {
                removed+=str.charAt(i);
                conto++;
            }
            else
            {
                nuova+=str.charAt(i);
            }
        }
        
        System.out.println("Stringa Completa: "+str);
        System.out.println("Stringa Modificata: "+nuova);
        System.out.println("Lettere Tolte: "+removed);
        System.out.println("Numero Di Lettere Tolte: "+conto);
     }
}
 
Finalmente lavoro con le stringhe XD

In C... Sembra funzionare...

Codice:
/* Trovare eventuali lettere doppie in una stringa, togliere la doppia e printarla. */

#include <stdio.h>
#include <string.h>
#define MAX 100

int main()
{
    int i, j=0, l=0, n;
    //Vettori per la stringa da inserire, quella che sarà l'output e quella contenente le doppie
    char parola[MAX], stringa[MAX], doppia[MAX];
    printf("Inserisci stringa \n");
    gets(parola);
    for(i = 0; parola[i] != '\0'; i++){
          if(parola[i] != parola[i+1]){
                       stringa[j] = parola[i];
                       j++;
          }
          else{
               doppia[l] = parola[i+1];
               l++;
               }
    }
    n = strlen(doppia); //conta numero di doppie
    printf("Stringa senza doppie: %s\n\n Numero caratteri eliminati: %d\n\n", stringa, n);
    printf("Caratteri eliminati --> ");
    for(i = 0; i < n; i++)
          printf("%c ", doppia[i]);
    return 0;
}
 
ecco il mio java fatto al momento:
Codice:
public delDoubleChar(String str){
        String result="",deleted="";
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)!=str.charAt(i+1)){
                result+=str.substring(i,i+1);
            }else{
                result+=str.charAt(i);
                deleted+=str.charAt(i);
                i++;
            }
        }
        System.out.println("Nuova Stringa: "+result+"\nRimosse: "+deleted+"\nN° Rimosse: "+deleted.length());
     }
 
Caso strano avevo già fatto questo esercizio, se non sbaglio di SiD sul forum di xhd
[C]
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *rmdouble (char *str, char **removed, int *occ);

int
main ()
{
  char *str = "01hello_boyss01222", *rem, *result;
  int i;
  result = rmdouble (str, &rem, &i);
  printf ("stringa = %s\nnuova stringa = %s\nrimosse = %s\nn rimossi = %i\n", str, result, rem, i);
  free(rem);
  free(result);
  return 0;
}

char *
rmdouble (char *str, char **removed, int *occ)
{
  int i = 0, j = 0, x = 0;
  char *res, *rem;
  *occ = 0;
  rem = (char *) malloc (x * sizeof (char));
  while (i < strlen (str) - 1)
    {
      if (str[i] == str[i + 1])
	{
	  rem = (char *) realloc (rem, ++x * sizeof (char *));
	  rem[x - 1] = str[i];
	  *occ += 1;
	}
      i++;
    }
  rem[x] = '\0';
  *removed = (char *) calloc (strlen (rem), sizeof (char));
  sprintf (*removed, "%s", rem);
  free(rem);
  res = (char *) calloc (strlen (str) - *occ, sizeof (char));
  i = 0;
  while (j < strlen (str) - 1)
    {
      if (str[j] != str[j - 1])
	{
	  res[i] = str[j];
	  i++;
	}
      j++;
    }
  res[i] = '\0';
  *removed[x] = '\0';
  return res;
}
 
[Python]
Codice:
#!/usr/bin/python
var=list(raw_input("Parola: "))
global new
new=[]
for i in xrange(0, len(var)-1):
    if var[i]!=var[i+1]:
        new.append(var[i])
new.append(var[len(var)-1])
print ''.join(new)
 
Perl:
Codice:
#!/usr/bin/perl
$word = <>;
chomp $word;
@a = split '', $word;
$a = @a;
for ($i=0;$i<$a;$i++){
	if ($i != 0){
		$n = $i - 1;
		if ($a[$i] ne $a[$n]){
			push @b,$a[$i];
		}
		if ($a[$i] eq $a[$n]){
			push @c,$a[$i];
		}
	}
}
unshift @b,$a[0];
print "Stringa risultante : "; print @b; print "\n";
print "Rimosse : "; 
foreach $c(@c) { 
	print $c." ";
} 
print "Nessuna" if @c == 0 ; print "\n";
print "N rimosse : "; print $#c + 1 .  "\n";
Bruttino ma funziona.
 
Stato
Discussione chiusa ad ulteriori risposte.