Elencare i caratteri comuni in due parole

Stato
Discussione chiusa ad ulteriori risposte.

cyd

Utente Silver
11 Giugno 2007
59
0
1
70
(preso da hackerforum.devil.it)
Scrivere un programma che elenchi senza ripetizioni i caratteri comuni in due parole:

la mia in ruby
Codice:
#!/usr/bin/ruby
print "type the first world: "
w0=gets.chomp
print "Type the second word: "
w1=gets.chomp
a=Array.new
puts "Common Chars:"
w0.each_byte{|c| if w1=~Regexp.new(c.chr) and (a.include?(c.chr)==false) then a.push(c.chr) end}
if(a.length>0) then a.each_index{|cc| puts cc.to_s+": "+a[cc]} else puts "No matches" end
 
Abbastanza laborioso il mio:
[Python]
Codice:
#!/usr/bin/python
one=list(raw_input("Inserisci prima parola: "))
two=list(raw_input("Inserisci seconda parola: "))
global common
common=[]
for i in range(0, len(one)):
    for j in range(0, len(two)):
        if one[i]==two[j]:
            common.append(one[i])
            break
common.sort()
for k in range(0, len(common)):
    try:
        if common[k]!=common[k+1]:
            print common[k]
    except:
        print common[k]
 
Grazie a questa idea ho creato una bella funzione :)
Il programma è case insensitive, perchè la stringa viene "abbassata"

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

char *sgetstr()
{

    unsigned long i = 1;
    int ch;
    char *str;

    if (!(str = (char*)calloc(i, sizeof(char))))
        return 0;

    while (((ch = getchar()) != '\n') && (ch != EOF))
    {
        if (!(str = (char*)realloc(str, ++i * sizeof(char))))
        {
            free(str);
            return 0;
        }
        str[i - 2] = ch;
        str[i-1] ='\0';
    }

    return str;
}

int main()
{
    char *stringa, *chiave, *chiavesr;
    int i,j=0;
    printf("Inserisci la stringa in cui fare la ricerca\n");
    stringa=strlwr(sgetstr());
    printf("Inserisci la stringa che fara' da chiave di ricerca\n");
    chiave=strlwr(sgetstr());
    for(i=0;i<strlen(chiave);i++){
        if(!strchr(chiavesr,chiave[i])){
            chiavesr = (char*)realloc(chiavesr, ++j * sizeof(char));
            chiavesr[j-1]=chiave[i];
            chiavesr[j]='\0';
        }
    }
    j=1;
    char *find;
    find = (char*)calloc(j, sizeof(char));
    for(i=0;i<strlen(chiavesr);i++){
        if(strchr(stringa,chiavesr[i])){
            find = (char*)realloc(find, (j=j+2) * sizeof(char));
            find[j-3]=chiavesr[i];
            find[j-2]=' ';
            find[j-1]='\0';
        }
    }
    if(j<=0)
        printf("Nessuna corrispondenza trovata\n");
    else{
        printf("Sono state trovate le seguenti lettere: %s\n",find);
    }
    #if defined(WIN32)
        system("pause");
    #endif
    return 0;
}

Più vado avanti e più mi rendo conto che ci sono pochi linguaggi più tosti del C (bf incluso) XD
 
Javascript: http://pastebin.com/f3b1429bd
Scrivendo mooolto meno (XD): http://pastebin.com/f5fb228b

Test della cosa che mi ha fatto morire dal ridere:
Codice:
meh@lolcahost ~ $ ./lol.js vaffanculo stro***
["n", "o"]
meh@lolcahost ~ $
 
PHP:
PHP:
<?php
$str = $argv[1];
$str2 = $argv[2];
$split = array ($str, $str2);

$searched = array ();
for ($i=0;$i<count ($split);$i++) {
	for ($y=0;$y<strlen ($split[$i]);$y++) {
		if (in_array ($split[$i][$y], $searched)) continue;
		if (strpos (@$split[($i+1)], $split[$i][$y])!==false) $searched[] = $split[$i][$y];
	}
}

print ((count ($searched) > 0) ? "Str: ".implode (", ", $searched)."\n\n" : "Nessun risultato\n\n");
?>
(Progettato per linea di comando, uso: php nomefile stringa1 stringa2)
UPDATE: Corretto bug che se non trovava niente non stampava niente.
phpscript.png
 
Piccolo abbozzo in c++, secondo me c'è qualche errorino ma mi scazza troppo questo esercizio xD, il suo dovere comunque lo fa:
Codice:
#include<iostream>
using namespace std;
int main()
{
	char parola1[10];
	char parola2[10];
	char common[10];
	
	cout<<"Inserisci la prima parola"<<endl;
	cin>>parola1;
	cout<<"Inserisci la seconda parola"<<endl;
	cin>>parola2;
	for(int a=0; a<10; a++)
	{
		for(int b=0; b<10; b++)
		{
			if (parola1[a]==parola2[b])
			{
				for(int c=0; c<5; c++)
				{
					if (common[c]==parola1[a])
					{
						break;
					}
					else
					{
					cout<<parola1[a]<<endl;
					break;
					}
					}
				parola1[a]=common[a];
				}
				
			}	
			}
			
	
	return 0;
}
 
Massi, ho già detto che l'ho fatto velocemente perchè è un esercizio che proprio non mi stuzzica xDDD
 
vabbè, visto che in c++ è stato fatto usando gli array di caratteri, io l'ho fatto usando la classe string...

Codice:
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string parola1, parola2, matched;
    int ind1, ind2;
    char match;
    cout << "Inserisci 2 parole\n";
    cin >> parola1 >> parola2;
    if (parola1.empty() || parola2.empty()) {
                        cout << "nessuna corrispondenza trovata"; 
                        cin.get(); 
                        exit(0);
    }
    for (int k=0; k<=parola1.length(); k++) {parola1[k]=tolower(parola1[k]);}
    for (int k=0; k<=parola2.length(); k++) {parola2[k]=tolower(parola2[k]);}
    for (int num=0; num<=26; num++)
    {
        match='a'+num;
        ind1=parola1.find(match);
        ind2=parola2.find(match);
        if (ind1 != string::npos && ind2 != string::npos) matched+=match;
    }
    if (matched.empty()) cout << "nessuna corrispondenza trovata";
    else cout << "corrispondenza trovate per le lettere " << matched << endl;
    cin.get();
    return 0;
}
 
Implementazione stupida
Codice:
#include <iostream>

using namespace std;

void put(string &l,char a);

int main()
{
    string a="vaffanculo",b="stonzo",l="";

    for(unsigned int i=0;i<a.length();i++)
        for(unsigned int j=0;j<b.length();j++)
            if(a[i]==b[j])
                put(l,a[i]);

    cout<<l;
    
    cin.get();
    return 0;
}

void put(string &l,char a) {
    for(unsigned int i=0;i<l.length();i++)
        if(l[i] == a) return;
    l+=a;
    l+=" ";
}
 
ecco il mio in java:
Codice:
import java.io.*;
public class CaratteriComuni{
    public static void main(String[] args){
        String p1="",p2="",p3="",f="";
        try{
            BufferedReader t=new BufferedReader(new InputStreamReader(System.in));
            System.out.println("1a parola:");
            p1=t.readLine();
            System.out.println("2a parola:");
            p2=t.readLine();
            if(p1.length()<p2.length()){p3=p1;p1=p2;p2=p3;}
        }catch(Exception e){}
        for(int i=0;i<p2.length();i++){
            if(p1.contains(""+p2.charAt(i))==true){
                f+=""+p2.charAt(i)+" ";
            }
        }if(!f.equals("")){System.out.println(f);}else{System.out.println("Nessun risultato.");}
    }
}
ho evitato di usare due for annidati utilizzando l'apposito metodo della classe String contains().
 
Mie soluzioni in c:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
   int i,j,k;
   char *w,*ww;
   w = (char*)malloc(sizeof(char));
   ww = (char*)malloc(sizeof(char));
   printf("Inserisci la prima parola >");
   scanf("%s",w);
   printf("Inserisci la seconda parola >");
   scanf("%s",ww);
   printf("Le lettere in comune sono: ");
   for (i = 0; i < strlen(w); i++) {
       for (j = 0; j < strlen(w); j++) {
           if (w[i] == ww[j]) printf(" %c ",w[i]);
       }
   }
   printf("\n");
   return 0;
}
e python:
Codice:
#!/usr/bin/python
class Words:
   w1 = 0;
   w2 = 0;
   l = [];
   def __init__(self):
      self.w1 = raw_input("Insert a word >");
      self.w2 = raw_input("Insert another word >");
   def Find(self):
      for i in self.w1:
         for j in self.w2:
            if i == j:
               if i in self.l:
                  continue;
               else:
                  self.l.append(i);
      print self.l;
a = Words();
a.Find();
EDIT:
php (command line):
Codice:
<?php
error_reporting("E_ALL &~ E_NOTICE &~ E_WARNING");
if($argc < 3) {
	print "Usage: ".$argv[0]." parola1 parola2";
	exit(1);
}
for($i=0;$i<strlen($argv[1]);$i++)
	for($j=0;$j<strlen($argv[2]);$j++)
		if($argv[1][$i] == $argv[2][$j])
			if(!in_array($argv[2][$j], $c))
				$c[] = $argv[2][$j];
	print (!empty($c)) ? "Letters Found: ".join(",",$c) : "Nothing Result";
?>
 
Stato
Discussione chiusa ad ulteriori risposte.