Newsgroup: it.comp.www.php
Titolo: [GIOCHINO] Tutto in una riga!

Ciao a tutti,
sono in casa da solo e mi è venuto in mente questo assurdo giochino... più
che altro il modo di scervellarsi sul php =)
INPUT
un array di interi, il valore di un elemento da cancellare ($par1) e un
intero ($par2)
OUTPUT
bisogna scrivere
- l'indice dell'elemento che si va a cancellare o "-1" se l'elemento non è
presente nell'array
- un trattino "-"
- "1" se il prodotto degli elementi restanti nell'array è uguale a $par2
LIMITAZIONI, e qui viene il bello
- non si possono assegnare valori a variabili
- non si possono usare cicli (for, while, foreach...)
- Si deve usare un echo nella forma
echo FUNZIONE."-".FUNZIONE;
dove
FUNZIONE = FUNZIONE(PARAMETRO [, PARAMETRO...])
PARAMETRO = FUNZIONE | valore
- FUNZIONE deve essere una funzione standard del PHP (non una creata da voi,
altrimenti che gioco è?)
quindi cose del tipo
SI -> echo trim(implode(", ", $array))."-".array_values(array($par2, $par1,
10, 11, 12));
- NON si possono assegnare variabili nè usare cicli neanche indirettamente
NO -> eval ("$a = explode('.',$b)");
NO -> eval ("for .....")
- NON si possono usare if-then-else,
- NON si può usare la forma (cond)?1:0
__________________________________
Immaginando un input di questo tipo
$array = array(1,2,3,4,5);
$par1 = "5";
$par2 = "24";
il risultato dovrà essere
4-1
(4 è l'indice dell'elemento con valore 5)
(1 perchè il prodotto 1*2*3*4 è 24)
Buon divertimento!
Ludovico

 - "1" se il prodotto degli elementi restanti nell'array ? uguale a $par2
se no "0" o vuoto?

 $par2 = "24";
Taroccato in
$par2 = "11";
per fare quadrare la cosa con la somma al posto del prodotto!
Ecco il parto: (scusate le linee lunghe! Metterlo tutto in una linea era
un po' un caos!)
echo strpos(implode("", $array), $par1) .
' - ' .
(array_sum(preg_split("//", (substr(implode("", $array), 0, strpos(implode("", $array), $par1)-1) .
 substr(implode("", $array),strpos(implode("", $array), $par1), count($array))))) == $par2);
In pratica "gioca" a creare una stringa dall'array, togliendo l'elemento
selezionato (tramite substr/strpos), ricreando la stringa, parsandola in
un array e sommando i valori dell'array! (non so se sia più facile
spiegarlo che scriverlo!)
Ho vinto mezzo premio? ;-)
Ciao!
--ev

 substr(implode("", $array),strpos(implode("", $array), $par1), count($array))))) == $par2);
Pork, mi sono accorto che è buggato ... :-\
Riciao!
--ev

 se no "0" o vuoto?
0
Ludovico

 echo strpos(implode("", $array), $par1) .
non ti dà l'indice dell'elemento nell'array, ma la posizione della stringa
da cercare all'interno dell'implode...
se hai array(11,12,13,1)
se cerchi 1 ti da 0 anzichè 3
Ludovico

> Pork, mi sono accorto che č buggato ... :-\
=))) cmq sono contento che abbiate capito il problema (mio, mentale) e che
stiate provando a risolverlo!
Ti ricordo che non č vietato usare eval, e potresti sfruttarlo in qualche
modo per il prodotto! (almeno io ho fatto cosě)
Domani vi do la mia soluzione!
Ludovico
N.B. Con <<sono contento che abbiate capito il problema>> non intendo dire
che siete stupidi e che sono piacevolmente colpito dal fatto che abbiate
capito il problema, č che avevo paura di non averlo spiegato bene io =)

 giochino... piy che altro il modo di scervellarsi sul php =)
Salve,
anche io sono riuscito a completare solo la prima parte :((, per la
seconda avevo pensato di utilizzare array_walk e create_function ma
senza assegnazioni non e' facile.
<?
$array = array(1,2,3,4,5);
$par1 = "5";
$par2 = "24";
print (((array_search ($par1, $array)==0)*-1) + array_search ($par1,
$array));
?>
-- 
I'am what I'am, I do what I can

 se cerchi 1 ti da 0 anzich? 3
Hmmm, vero ... altro bug!! Dai, dai, dacci la soluzione! :-DDD
--ev

> Hmmm, vero ... altro bug!! Dai, dai, dacci la soluzione! :-DDD
SOLUZIONE
Nascondo la soluzione per chi stesse ancora provando a risolverlo, l'ho
scritta qualche riga più sotto
.
.
.
.
.
.
.
.
.
.
.
.
.
hai provato a risolverlo?
penserai forse "aaaah, ma che stronzata!"?? Beh, allora devi  aver già
postato la tua soluzione :-p
La mia SOLUZIONE:
echo
max(-1,key(array_intersect($array,array($par1))))."-".(int)(eval("return
(".implode("*",array_diff($array,array($par1))).");") == $par2);
In pratica:
faccio l'intersezione dell'array con l'array composto dall'elemento da
cercare.
key mi ritorna la chiave dell'elemento corrente di questo array (il primo)
che è l'indice dell'elemento. se l'elemento non esiste max non lo considera
e ritorna -1
per il prodotto ho usato eval facendogli ritornare il risultato della
moltiplicazione degli elementi (l'implode con * dell'array senza l'elemento
cancellato).
Ludovico

 cancellato).
Argh argh ... A dire la verità avevo letto male io perchè pensavo che
non si potesse usare eval; la prossima volta leggo meglio! :-D
E adesso ... sempre più difficile ... Stessa identica solfa ma bandiamo
anche l'eval! Auguri! (dimenticavo: non ho già la soluzione sottomano!
Non so neanche se sia possibile!)
Ciao
--ev

 Non so neanche se sia possibile!)
E guerra sia!! =))) Oddio, non ho idea di come fare... ci penso un pochino,
stasera ho da fare.
Ludovico


Cavolo, ci ho pensato un po', ma non sono arrivato a nulla di buono.
Naturalmente insieme ad eval è escluso anche exec, vero?
Ho provato a fare una regexp "ricorsiva", oppure insieme ad array_walk()...
ma non sono molto pratico con nessuna delle due... ma insomma, sono io che
faccio i giochini, cos'è questa novità?!? =))
Ludovico

 faccio i giochini, cos'? questa novit??!? =))
Ti dirò, io l'ho proposto ma sono ancora fermo (anche a causa del poco
tempo utile!).
Può anche morire dov'è nato, purtroppo non ho molto tempo da dedicare al
brainfuc%ing! ;-)
Ciao!
--ev

 faccio i giochini, cos'? questa novit??!? =))
hint:
$result=preg_replace("/.*/e","$0", "1*2*3*4*5");

Ciao,
Ludovico Grossi (LAMASE) wrote:
in effetti  arrivo un po' tardi, e questa soluzione non vale, però mi 
sono divertito e volevo proporla lo stesso (ho biecamente cambiato le 
regole per l'espressione condizionale e creato una funzione per 
array_reduce, però non ho dovuto usare eval :P)
<?php
$array = array(1,2,3,4,5);
$par1 = "5";
$par2 = "24";
function per ($n,$k){
  $n*=$k;
  return $n;
}
echo ((array_search( $par1, $array))?array_search( $par1, $array):-1) . 
" - ".(((array_reduce(array_diff($array,array($par1)), 
'per'))==$par2)?1:"prodotto non corrispondente");
?>
la seconda parte poteva essere 
((array_reduce(array_diff($array,array($par1)), 'per'))/$par2));
ho usato l'espressione condizionale visto che non hai indicato che cosa 
doveva scrivere se il prodotto non corrispondeva...
e se per caso poi il numero non c'è, ma il prodotto torna...
es:
$par1 = "7";
$par2 = "120";
Grazie per il giochino, ti ringraziano anche i miei ultimi neuroni persi 
per questo divertente esercizio :)
Ciao Gianfranzo
-- 
ICQ#: 21258924 Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
"dopo tutto, gli angeli non sono altro che dei volatili" D. Pennac

 per questo divertente esercizio :)
Quando li vedi salutameli tanto!
Ludovico

 $result=preg_replace("/.*/e","$0", "1*2*3*4*5");
GRAZIE!!! non conoscevo il modificatore "/e"... il bello di questi giochini
č che si imparano nuove cose
Quindi la soluzione diventa:
echo
max(-1,key(array_intersect($array,array($par1))))."-".(int)(preg_replace("/.
*/e","$0", implode("*",array_diff($array,array($par1)))) == $par2);
Per chi non avesse voglia di arrivare fino al manuale:
preg_replace ( espressione_regolare, sostituto, testo)
Il modificatore /e, permette alla funzione di considerare il testo posto in
sostituto come codice PHP dopo aver valorizzato gli opportuni riferimenti.
Suggerimento: accertarsi che sostituto sia del codice PHP valido, altrimenti
si ottiene un errore di parsing alla linea della funzione preg_replace().
Ludovico

 */e","$0", implode("*",array_diff($array,array($par1)))) == $par2);
 
Ecco, ho perso! :-((((
Ma almeno so che non era impossibile! :-DDD
Ciao!
--ev

 postatelo (sempre scrivendo [GIOCHINO] nel post cos? si capisce)
Stessa problematica, usando chiamata/e a mysql (esempio: SELECT 2*3; ecc.)

> Stessa problematica, usando chiamata/e a mysql (esempio: SELECT 2*3; ecc.)
Puoi spiegare meglio?
Abbiamo una tabella di una colonna con gli interi o cosa?
Per quale versione di MySql? (per vedere eventuale disponibilità di UNION e
simili)
Ludovico

 simili)
senza tabelle predefinite, usare solo il parser di mysql per creare i statement, 
e solo una idea, non ho avuto il tempo di studiare la fattibilita.
in mysql puoi usare un mucchio di roba (select su stringe, set, operazioni 
matematici, if, then. ecc.)

 matematici, if, then. ecc.)
Quindi una sola query? Fico! Potrebbe anche essere un problema diverso, no?
Ludovico