Juego de programación

S

Típico juego en foros de solucionar un problema, cada uno en un lenguaje y/o algoritmo distinto.

Lo primero que se me ocurre:
Programa que tome una línea de texto y la imprima con el orden de las palabras invertido ¡Sólo de las palabras!
Se entenderá por palabra toda secuencia de caracteres distintos de espacio.
Edit: Para simplificar, se supone que no habrá dobles espacios, ni al principio ni final de la cadena.

Ejemplo:
<-Mi mamá me mima.
->mima. me mamá Mi

Mejor si es entrada/salida estándar.

Editado, van:

Perl
C++
C (2)
Haskell
PHP
Prolog (creo que no funca)
C--
Java
ASM x86
COOL
Visual Basic (creo)
JavaScript
Ada95
Clipper/FiveWin (no funca aún)
VBScript/ASP

R

no te ayudare a hacer los deberes ¬¬

LiuM

jajaja 2 anda borra el post, voy hacerlo en c++ ahora lo pongo

S

#!/usr/bin/perl
print join(" ",reverse split(/ |\n/,<STDIN> ))."\n";

#2 Luces.

LiuM

int main(){
vector<string> contenedor;
string palabra;
cout << "Introduce la frase a invertir: " << endl;
while(cin >> palabra)
contenedor.push_back(palabra);
for(int i=contenedor.size()-1;i>=0;i--){
cout << contenedor << " ";
}
cout << endl;
system("pause");
return 0;
}

Se que hay maneras mas faciles y eficientes, pero tengo la cabeza como un bombo de otras cosas XD
Lo pongo sin cabeceras, no lo he probado pero supongo que funcione

EDIT: #1 pillin tu lo hiciste a posta para demostrarnos la simplificacion de perl en este caso ehhhh xDDDD

S

#5 xDDD Ahora lo intento en Haskell, pero nunca me he puesto a manejar strings en él.

Edit: Ok, son listas de caracteres :P

maRc

Recursiva en C:

#include <stdio.h>
#include <string.h>

void invierte(char *linea, int tam) {
int i=0;
if (tam<=0)
return;
while(linea != ' ' && linea!= '\n' && i < tam)
i++;
invierte(linea+i+1,tam-i-1);
linea='\0';
printf("%s ", linea);
}

int main() {
char linea[100];
fgets(linea, 100, stdin);
invierte(linea, strlen(linea));
printf("\n");
return 0;
}

S

Haskell (recursivo y con orden superior):

main = do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linea <- getLine
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putStrLn (invertir linea)
invertir :: [Char] -> [Char]
invertir s = foldl (space) [] (reverse (palabras s []))
space :: [Char] -> [Char] -> [Char]
space [] pal = pal
space p pal = p++" "++pal
palabras :: [Char]->[Char]->[[Char]]
palabras [] ac = [ac]
palabras (l:ls) ac = if l == ' '
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then (ac):(palabras ls [])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else palabras ls (ac++[l])

EnZo

En php :D podria usar la funcion explode() que corta cadenas definiendo el caracter cortante, pero me parecia un poco trampa xD

<?
$cadena="Cadena elegida ya que php no es como C xD y se debe recoger el campo por get o por post";
$total=strlen($cadena);
$wb=0;
for ($bucle=0;$bucle<$total;++$bucle) {
$letra=substr($cadena,$bucle,1);
if ($letra==" ") ++$wb;
$word[$wb].=$letra;
}
for ($orden=count($word);-1<$orden;--$orden) {
echo "$word[$orden] ";
}
?>

Porcierto que es recursivo?

S

Por ejemplo, esta funcion:

palabras (l:ls) ac = if l == ' '
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then (ac) : palabras ls [])
&nbsp;&nbsp;&nbsp;&nbsp;else palabras ls (ac++[l])

Es recursiva porque se llama a sí misma para seguir solucionando el problema.

LOc0

¿Algún manual bueno de Haskell para poder descrifrar #8?

Salu2 ;)

PD: Sin utilizar funciones "comodín", ni empezar a declarar strings auxiliares no veo otra forma que no sea recursiva...

PD2:

#9 Con la explicación de Soy_heaton te habrás quedado frío xDD. Un ejemplo muy típico de una función definida recursivamente es el factorial de n, que se calcula multiplicando n por el factorial de (n-1) hasta llegar al caso n=0.

S

ftp://lsd.ls.fi.upm.es/pub/dsp/0405/Var_Docs/IntHaskell98.pdf
ftp://lsd.ls.fi.upm.es/pub/dsp/0405/Var_Docs/haskell-98-tutorial.pdf

Aunque tampoco profundizan demasiado.

EnZo

no si lo habia entendido :D es como hacer un bucle llamando una funcion a si misma.

Porcierto yo he usao variables auxiliares?

guiye

En cristiano

Pepe
Pepe

tas kedao? ~~

LiuM

La verdad que viendo como lo haceis toy por hacerlo en plan funcion con un array en vez con un vector STL, pa tar a la altura xD..esque claro donde este un vector stl que se kite uno de bajo nivel, que soy mu vago XDD

TeTu

Mañana lo intento hacer en pascal.

Que ahora estoy perruno xDD

darkange

En prolog:

inversa([],[]).
inversa([X|Xs],SxX) :- inversa(Xs,Sx), concatena(Sx,[X],SxX).


concatena([],Ys,Ys).
concatena([X|Xs],Ys,[X|Zs]) :- concatena(Xs,Ys,Zs).

B

#17 puto prolog !!!!! XDDDD

en C-- para SISA-F 2005
sincronización por interrupciones

unsigned char fi_tec;
char caracter;
char caracteres[N];
int cursor;
int espacios;
int pos_esp[M];

main () {
· cursor=0;
· espacios=0;
· char=0;
· int ini=0;
· int fin=0;
· out (Rcon_tec, 1);
· interrupts_vector[1]=&keyb
· ei();
· while (fi_tec == 0);
· while (espacios>=0) {
· · ini=pos_esp[espacios-1];
· · fin=pos_esp[espacios];
· · for (i=ini; i<fin; i++) {
· · · out (Rdat_pant, caracteres);
· · · out (Rfil_pant, i/64);
· · · out (Rcol_pant, i%64);
· · · out (Rcon_pant, 0x8000);
· · }
· · out (Rdat_pant, ' ');
· · out (Rfil_pant, i/64);
· · out (Rcol_pant, i%64);
· · out (Rcon_pant, 0x8000);
· · espacios--;
· }
}

keyb () {
· caracter = tteclat[in (Rdat_tec)];
· if (caracter == '\n') {
· · fi_tec=1;
· } else if (caracter == ' ') {
· · pos_esp[espacios]=cursor;
· · espacios++;
· } else {
· · caracteres[cursor]=caracter;
· · cursor++;
· }
}

nota: SISA-F es una arquitectura inventada en la UPC para no producir desgarros de esfínter cuando nos enseñen ia32. permite escribir en una pantalla de 16 filas y 64 columnas. si no se supone el scroll de la pantalla, sólo se podrían introducir hasta 1024 caracteres. SISA IS LOVE

S

?- inversa([h,o,l,a,' ',m,a,m,a],X).

X = [a,m,a,m,' ',a,l,o,h] ? ;

:P

RoAzZ

void inversa (char cadena[])

{
int n;
int cont; /* Sera nuestro contador de letras que tiene cada palabra /
int i=0; /
Contador para el avance de la inversión /
int j; /
Variable que recorre la cadena /
char aux; /
Contiene la ultima letra para despues de correr la cadena colocarla al inicio donde le toque /
char aux2; /
Simplemente guardará el valor de cierre de cadenas */

n=strlen(cadena);
j=n;
aux2=cadena[n];

 do

  {

cont=0;                                      /* igualamos el contador a 0 para contar las letras que movamos */
    j=n;

 while ((cadena[n-1]!=' ')&&(n>i+cont))      /* Queremos que pare cuando el espacio este en penultimo lugar */
                                                 /* o cuando la suma de huecos + letras pasadas iguale al total */
  {

    while (j>i)                              /* funcion que recorre y cambia los caracteres */

     {

      cadena[j]=cadena[j-1];
      j--;

     }

   j=n;
   aux=cadena[j];                             /* guardamos el ultimo caracter */

   if (cadena[j]!=' ')

    {

     cadena[i]=aux;                           /* Pasamos el ultimo caracter al comienzo de su hueco */
     cont++;

    }


  }
                                                  /* i valdrá el valor de letras cambiadas para empezar con la */
i=cont+i;                                     /* nueva palabra a invertir, ya que la ya invertida anteriormente */
                                                  /* debe quedarse en ese lugar, si no la frase queadria como al inicio */
 while (j>i)

  {

   cadena[j]=cadena[j-1];                    /* corremos la parte no invertida */
   j--;

  }

if (i<n)
                                                 /*  si no se trata de la ultima palabra, pondremos el espacio */
 {                                           /* que precederá a la siguiente palabra */

cadena[i]=' ';
i++; 

 }


  }

 while (i<n);              /* Se repite hasta que llegue al final toda la inversión */

cadena[n]=aux2; /* Le damos a la ultima posición de la cadena el valor \o para terminar */

printf (" -== Su Frase Invertida ==- \n\n"); /* Resultado de la frase invertida */
printf (" ");
puts (cadena);
printf ("\n --============================--");

printf ("\n");

}

RoAzZ

Es la función que utilicé para una práctica de C que me pedía la uni ( no, no estudio informatica, así que si es una barbaridad de largo, simple, o lo que sea.. entendedlo.. estudio industrial mecánica.. ^^ se hace lo que se puede :P )

IS4kO

JAVA (J2SE)

import java.util.;
import javax.swing.
;

public class Main
{
    public static void main(String[] args)
    {

        String palabra;
        palabra=JOptionPane.showInputDialog("Introduce Palabra");

        for (int i=palabra.length()-1;i>=0;i--)
        {
            System.out.println(""+palabra.charAt(i));
        }
    }

}

Cyph3r

Es en asembler ya lo tenia creado y sorry por el catalan.

cr EQU 13
lf EQU 10
print macro arg1
push ax
push dx
lea dx,arg1
mov ah,9
int 21h
pop dx
pop ax
endm

read macro arg1
push ax
push dx
lea dx,arg1
mov ah,10
int 21h
pop dx
pop ax
endm

dades SEGMENT PARA PUBLIC
missatge DB 'Entra el texte',cr,lf,'$'
maxcad DB 29
lencad DB 0
cadena DB 30 DUP(0)
girat DB 30 DUP(0)
linia_blanc DB cr,lf,'$'

missatge1 DB 'Vols sortir del programa?      
            (Premeu "s" per sortir)',cr,lf,'$'
    maxcad1 DB 2
    lencad1 DB 0
    cadena1 DB 3 DUP(0)

dades ENDS

codi SEGMENT PARA PUBLIC 'code'
main PROC FAR

ASSUME CS:codi,DS:dades,SS:pila,ES:dades
mov ax,dades
mov ds,ax
mov es,ax
inici:

print missatge			;Imprimim el missatge
	
print linia_blanc 		;Imprimim linia en blanc
    
read maxcad			;Cridem la macro 'read'

mov bh, 0 ;posem 0 a bh
mov bl, 0 ;posem 0 a bl
mov bl, lencad ;posem la longitud de la cadena a bl

afegir:
;Fer el pas de l'array a la pila

mov al, cadena[bx]		;Posem a al el valor de la posició de bx de cadena
push ax				;posem el valor d'ax a la pila

dec bl				;decrementem bx q es el nostre contador
cmp bl, -1			;comparem si es 0

jne afegir ; si no es 0 continua el bucle

mov bh, 0			;posem 0 a bh
mov bl, 0              		;posem 0 a bl
mov bl, lencad   		;posem la longitud de la cadena a bl
mov girat[bx+1],'$'

treure:
;Fer el pas de la pila a l'array

pop ax				;Treiem de la pila un valor i el guardem a ax
mov  girat[bx], al		;Posem a girat el valor tret de la pila
	
dec bl				;decrementem bx q es el nostre contador
cmp bl, -1			;comparem si es 0

jne treure ;si no es 0 continua el bucle

;---------------------------------------------------------------------------------------------------------------------

print linia_blanc 		;Imprimim linia en blanc


print girat			;Imprimim la cadena girat


print linia_blanc 		;Imprimim linia en blanc
print linia_blanc 		;Imprimim linia en blanc

    print missatge1 		;Imprimeix missatge1
    
    read maxcad1  			;llegim per teclat
   

print linia_blanc 		;Imprimeix linia_blanc

cmp cadena1,'s'
je final
;Comparem el contingut de cadena1 amb el caracter 's'
jmp inici

final:

mov ax,4c00h
int 21h

main ENDP
codi ENDS
pila SEGMENT PARA STACK 'stack'
DB 128 DUP(0)
pila ENDS
END main

Kansei

Se que me vais a mandar al carajo, pero ahi va:

Sub Main()
Dim strCadena As String

    System.Console.WriteLine("Introduce la frase: ")
    strCadena = System.Console.ReadLine

    Dim cad() As String = strCadena.Split(" ")
    System.Array.Reverse(cad)
    System.Console.WriteLine(cad)
End Sub

PD. hay que darle una oportunidad a tito gates.

EnZo

os queda algun lenguaje? xD

Alcanor

#26 castellano

xDD

guiye

#27 -> #14

#28 rulez xD

maRc

#27, como el hackercillo de palo que agregó el otro día a un amigo en el messenger y decía que programaba en inglés xD.

EnZo

Vamos a poner lenguajes por rellenar xD JavaScript. Al igual que php se podria usar la funcion split que corta cadenas definiendo el caracter pero es una manera cheta de hacerlo xD

< script>
cadena=prompt("introduce tu cadena");

total=cadena.length;
wb=0;
word=new Array;
for (bucle=0;bucle<total;++bucle) {
letra=cadena.substr(bucle,1);
if (letra==" ") { ++wb; }
word[wb] = (word[wb]==null) ? letra : word[wb] + letra;
}
for (orden=word.length-1;0<=orden;--orden) {
document.write(word[orden] + " ");
}
< /script>

Usuarios habituales