[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]

/tech/ - Tecnología

No rompas las leyes de Isaac Asimov
Nombre
Email
Comentario
Archivo





[]
Clave (Para eliminar el post.)

  • Archivos soportados: [ jpg, jpeg, png, gif ] , [ ogg, mp3 ] , [ webm ] & [ pdf ].
  • Adjuntos soportados: [ youtube, vimeo, dailymotion, metacafe & vocaroo ].
  • Tamaño máximo total 20MB.



File: 161131890347.jpg (11.75 KB, 180x157) ImgOpsiqdb

11.75 KB

No.1967

>ser yo
>estar progresando en los ejercicios de Project Euler
>ejercicio_4.jpg
>ir a Notepad++ y tener preparado el GCC
>EasyPissi.class
>tardar literalmente más de una semana en preparar un algoritmo correcto para recién descubrir si un número es capicúa o no
>mfw finalmente terminé
Y este ha sido el peor algoritmo que he hecho hasta ahora.

#include<iostream>

using namespace std;

int main(){
int res = 0, res_copy = 0, num = 0, digit_loop = 0, digit = 0, num_unit = 0, num_discover_div = 1, capicua = 0, div_res_copy = 0, div_res = 100000;

cout<<"Inserte numero: "<<endl; cin>>res;
if(res < 10 || res % 11 == 0){
div_res = 1;
capicua = 1;
}
while(div_res != 1 && res < 100000 /*&& res % 11 != 0 && res > 9*/){
if(res >= div_res){
if(num_unit == 0){
while(num_discover_div != div_res){
num_discover_div *= 10;
num_unit++;
}
}
res_copy = (res % div_res);
div_res_copy = (div_res / 10);
num = res / div_res;
//while(div_res_copy != 0){
for(int i = 0; i < num_unit-i; i++){
//cout<<"res_copy: "<<res_copy<<endl;
//cout<<"div_res_copy: "<<div_res_copy<<endl;
//cout<<"num: "<<num<<endl;
if(res_copy % div_res_copy num || res_copy / div_res_copy num){
digit++;
cout<<"^"<<endl;
}
if(div_res_copy != 1){
res_copy %= div_res_copy;
div_res_copy /= 10;
}
//cout<<"res_copy_2: "<<res_copy<<endl;
//cout<<"div_res_copy_2: "<<div_res_copy<<endl;
}
cout<<"res: "<<res<<endl;
cout<<"div_res: "<<div_res<<endl;
if(div_res != 1){
res %= div_res;
div_res /= 10;
}
//num_unit–;
}else{
div_res /= 10;
}
}
cout<<"num_unit: "<<num_unit<<endl;
if(res > 100000){
cout<<"El numero es demasiado grande"<<endl;
}else if(digit+1 == num_unit){
cout<<"Es capicua"<<endl;
}else if(res % 11 0 && capicua 1){
cout<<"Es capicua"<<endl;
}else if(res < 10 && capicua == 1){
cout<<"Es capicua"<<endl;
}else{
cout<<"No es capicua"<<endl;
}
cout<<"digit: "<<digit<<endl;

return 0;
}

Superen eso, perras. Y aún no me creo me fui tan a la mierda con este ejercicio, pensé que era decente con este tema de algoritmos
>>

No.1968

>>1967
Qué raro, los espacios se borraron.
>>

No.1975

>>1967
¿No podías usar strings? Lo mas simple sería recorrer una cadena de texto verificando que los caracteres sean iguales
>>

No.1976

>>1975
Eso mismo pensaba hacer; pero recordé una experiencia en tratar de manipular strings, que es, al tratar de insertar un número, me devolvía un carácter, pero ahora que lo mencionas, pude haber hecho algo con un tipo de dato char.
>>

No.1977

>>1976
Podías hacer esto

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


int main() {
const int MAX_LENGHT = 101;
bool capicuo = true;
int len, final;
char numero[MAX_LENGHT];

// Conseguimos el numero y verificamos que la longitud del numero
// sea mayor a uno, pues si es uno el numero es capicuo si o si
printf("Introduce un numero: \n");
fgets(numero, MAX_LENGHT, stdin);
// Aqui convertimos el numero a int y luego lo regresamos a string
// eso quita todas las letras de la cadena de texto y solo deja numeros
itoa(atoi(numero), numero, 10);

len = strlen(numero);
if(len < 2)
len = 0;

// - Si la longitud del numero es par entonces el numero
// puede ser comparado con su reciproco
// - Si no entonces el numero de en medio de estos no se compara con otro
final = len;
if((len % 2) != 0)
final–;

// Finalmente dividimos el tamaño del array para recorrer solo la mitad de este
// y le restamos uno a la longitud para usarlo en el indice del array
final = final/2;
len–;
for(int i = 0; i < final; i++) {
if(numero[i] != numero[len - i]) {
capicuo = false;
break;
}
}


if(capicuo)
printf("El numero %s es capicuo", numero);
else
printf("El numero %s no es capicuo", numero);

return 0;
}
>>

No.1978

No recordaba lo asqueroso que era c++, he estado aprendiendo haskell y es mucho mas entendible el codigo para detectar un numero capicua (filtrar un string palindromo al final), en fin haskell es un buen lenguaje


module Main where

import Data.Char

capicua :: String -> Bool
capicua x = x == reverse x

main :: IO ()
main = do
numero <- getLine
if capicua . filter isNumber $ numero then
putStrLn "El numero es capicua"
else
putStrLn "El numero no es capicua"
>>

No.1979

Así lo he hecho yo


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

int
main(void)
{
char numero[] = "12321";
int inicio, final, contador;
inicio = final = contador = 0;
char buf[1000];
contador = strlen(numero);
final = contador -1;
for(inicio = 0; inicio<contador;inicio++) {
buf[inicio] = numero[final];
final–;
}
if(!strcmp(buf,numero))
puts("es capicua");
else puts ("No es capicua");
}


Básicamente, las strings en C son arrays, cojemos el numero como array, le damos la vuelta, y si es igual, es capicua
ala
>>

No.1980

>>

No.1981

La solución a este tipo de ejercicios suele buscar que el usuario aprenda sobre como se guarda la unidad en el lenguaje de programación y como acceder a ella, esto es algo muy propio de C.
Esto hace que las soluciones como esta >>1980 sean las optimas. Este ejercicio se podría hacer mas simple con Python: transformando el numero a un string y la string a un array de caracteres, después se puede recorrer ese array por ambos lados y comprar, ademas da igual que sea la longitud sea par o impar ya que si es impar terminarías comparando el ultimo numero son si mismo y es indiferente. Es menos optimo que C pero puede que se entienda mejor.
>>

No.1982

File: osaka3.jpeg (20.4 KB, 542x593) ImgOpsiqdb

20.4 KB
Como veo que lo están haciendo en diferentes lenguajes acá les dejo mi versión del programa en shell script :3

#!/bin/sh
error() {
echo "Error. Uso: $(basename "$0") [número]"
exit 1
}
[ $# -eq 0 ] && error
[ $(expr "x$1" : "x[0-9]*$") -gt 0 ] || error

[ "$(echo $1 | rev)" = "$1" ] && \
echo "¡Es capicúa!" || \
echo "No es capicúa :c"

>>

No.1983

>>1982
Ups, la identación se elminó. Versión identada: https://bin.snopyta.org/?3d8d2d003fd901e4#Ef58KBwSDc8VZvjN9oWyj6WvQwJWTxLHEoJsd7VeHJy9
Node repara las identaciones
>>

No.1984

node podría integrar highlightjs al sistema wired-7. Es bonito y sería una gran herramienta para la comunidad.
>>

No.1985

>>1984
>js
dejé de leer ahí
>>

No.1986

File: 1610687178989.jpg (22.85 KB, 466x466) ImgOpsiqdb

22.85 KB
>>1985
Y en qué lenguaje implementarás front end.
>>

No.1987

>>1986
ninguno
>>

No.1988

>>1984
no es mala idea, igual los esquizos pueden desactivar el script con cualquiera de las miles de extensiones para bloquear js
>>

No.1992

File: 161058456521.gif (363.12 KB, 356x234) ImgOpsiqdb

363.12 KB
Bien Wais, aquí OP, el mejor script kiddie de /tech/ de momento.
¡Y ya lo resolví, ya lo hice!, tomando el tiempo del desarrollo del algoritmo sin el descanso y días en donde avance poco, fueron como poco más de una hora (estimo). Al principio, traté de crear un nuevo algoritmo basándose en variables tipo char, pero no me resultó y no podía aplicarlo como yo quería, así que decidí volver a analizar mi anterior algoritmo, tratar de optimizarlo y ver una manera más simple de hacerlo; aquí está el código: https://pastebin.com/bWug2EZm
>>

No.1993

>>1992
Sigo viéndolo muy rebuscado, como dijeron arriba, pudiste haber usado únicamente strings y C con sus funciones de str*() en lugar de números enteros y el frankenstein horrible de C++ que por alguna razón no tiene la función de strrev(), LOL. También puedes simplificar la entrada de datos haciendo que éstos sean leídos del argv al ejecutar el programa en lugar de usar cin, así solo tendrías que escribir en la línea de comandos ./capicua [número] y listo.
Pero bueno, si ibas a usar C++ al menos pudiste haberte tomado el tiempo de aprender cómo funcionan sus horribles strings (no los cstring, los string&).
Como últimos consejos:
- EVITA usar más de 80 caracteres por línea, se ve horrible y el código parece espagueti, no querrás ser un soydev de javascript.
- Evita usar más dos instrucciones por línea, se puede, pero no deberías. Lo que deberías hacer es enfocarte en hacer el algoritmo más simple si quieres menos líneas.
- Intenta dejar espacios entre palabras reservadas y símbolos, por ejemplo } else { en lugar de }else{
>>

No.1994

>>1993
>Sigo viéndolo muy rebuscado, como dijeron arriba, pudiste haber usado únicamente strings y C con sus funciones de str*() en lugar de números enteros
Tenía problemas en ver cuánto espacio tendrán las variables char y se me complicaba un poco su manipulación. ¿Algún consejo para aprender a usarlas?
>También puedes simplificar la entrada de datos haciendo que éstos sean leídos del argv al ejecutar el programa en lugar de usar cin
¿argv?, ¿de qué trata eso?
>así solo tendrías que escribir en la línea de comandos ./capicua [número] y listo.
De momentos estoy en Winbugs, ¿se puede hacer eso en la terminal de Windows?
>Pero bueno, si ibas a usar C++ al menos pudiste haberte tomado el tiempo de aprender cómo funcionan sus horribles strings (no los cstring, los string&).
Perdón, ¿pero a qué te refieres con eso?, de momento no me ha llamado del todo la atención del uso de strings.
>- EVITA usar más de 80 caracteres por línea, se ve horrible y el código parece espagueti, no querrás ser un soydev de javascript.
¿De verdad?, está bien. Es un consejo… Curioso.
>- Evita usar más dos instrucciones por línea, se puede, pero no deberías. Lo que deberías hacer es enfocarte en hacer el algoritmo más simple si quieres menos líneas.
Es decir, ¿utilizar más de dos condicionales en un if, por ejemplo?; perdón, pero no comprendo a lo que estás diciendo.
>- Intenta dejar espacios entre palabras reservadas y símbolos, por ejemplo } else { en lugar de }else{
Está bien, ¡muchas gracias por los consejos, Wai!
>>

No.1995

>>1994
>¿Algún consejo para aprender a usarlas?
Los cstrings con arreglos de caracteres o chars como dijeron arriba, y se usa la cabecera string.h para tener acceso a las funciones str*(), esas te permiten manipular los cstrings fácilmente.
>¿argv?, ¿de qué trata eso?
Todo programa al iniciarse espera una entrada de datos por parte del usuario, lo que serían los conocidos "argumentos" del programa. Para capturarlos en la rutina main() coloca lo siguiente:

int main(int argc, char **argv)

La variable argc es la cantidad de argumentos que se dan al programa y argv es un arreglo de arreglos de caracteres (básicamente un arreglo de strings) con los argumentos que le dio el usuario al programa. Por ejemplo, si ejecutas: ./miprograma -test 1 2 3, entonces argc sería igual a 5 (el nombre del programa cuenta como un argumento) y argv sería {"miprograma", "-test", "1", "2", "3"}
Podrías aplicar eso a tu programa leyendo el número desde el argv.
>De momentos estoy en Winbugs, ¿se puede hacer eso en la terminal de Windows?
Si. Tienes que escribir .exe al final del ejecutable en lugar de ./, ejemplo:
>capicua.exe [número]
(Tienes que estar en el directorio donde está el programa, para seleccionarlo usa el comando cd)
>¿pero a qué te refieres con eso?, de momento no me ha llamado del todo la atención del uso de strings.
Los strings de C++ no son lo mismo que los strings de C, los strings de C++ son una clase y los de C son arreglos de char
>¿De verdad?, está bien. Es un consejo… Curioso.
Mira el código fuente de cualquier software (ej.: en github o lo que sea) y verás que se intenta respetar un límite 80 caracteres porque bueno, simplemente es un estándar que todos los programadores conocen y la mayoría pone en práctica. Incluso si requieres de pasar varios argumentos a una función se usan varias líneas para respetar el límite, ejemplo:

int
mi_funcion(int parametro_muy_largo_1,
int parametro_muy_largo_2,
int parametro_muy_largo_3)
{
//…
}

>¿utilizar más de dos condicionales en un if, por ejemplo?
No, quiero decir que no hagas esto:

cout << "hola"; cin >> variable; system("clear");

En su lugar, cada instrucción que tenga su propia línea.
>>

No.1996

>>1995
>Los cstrings con arreglos de caracteres o chars como dijeron arriba, y se usa la cabecera string.h para tener acceso a las funciones str*(), esas te permiten manipular los cstrings fácilmente.
Ya veo.
>La variable argc es la cantidad de argumentos que se dan al programa
Al declararla en main(), y tomando en cuenta que pertenece al argumento de una función, me imagino que la podría nombrar como quiera, pero por los estándares de los programadores, se debe mantener con ese identificador, lo mismo para argv, ¿no?
>argv es un arreglo de arreglos de caracteres (básicamente un arreglo de strings) con los argumentos que le dio el usuario al programa.
¿Como un arreglo bidimensional?; ¿por qué están esos "**" al inicio de argv?, ¿representa la declaración de un arreglo?
>Podrías aplicar eso a tu programa leyendo el número desde el argv.
¿El propósito de todo esto es para ahorrar tiempo con las entradas?
>(Tienes que estar en el directorio donde está el programa, para seleccionarlo usa el comando cd)
Lo sé.
>Los strings de C++ no son lo mismo que los strings de C, los strings de C++ son una clase y los de C son arreglos de char
Ah, claro. Sí, eso lo sabía.
>Mira el código fuente de cualquier software (ej.: en github o lo que sea) y verás que se intenta respetar un límite 80 caracteres porque bueno, simplemente es un estándar que todos los programadores conocen y la mayoría pone en práctica. Incluso si requieres de pasar varios argumentos a una función se usan varias líneas para respetar el límite
Um, ok. Trataré de aplicar esto.
>En su lugar, cada instrucción que tenga su propia línea.
Oh, perdón, entendí mal.
>>

No.1997

>>1996
>me imagino que la podría nombrar como quiera
Si, pero no es una buena práctica por motivos de compatibilidad y en general porque es estándar.
>¿Como un arreglo bidimensional?
Si
> ¿por qué están esos "**" al inicio de argv?
Los asteriscos en dentro de los argumentos de una función significan "puntero a", en este caso es un puntero a un arreglo de cstrings (y cada uno de esos cstrings son arreglos, por lo que se usa otro puntero)
>¿El propósito de todo esto es para ahorrar tiempo con las entradas?
En general porque es la mejor práctica al escribir programas de línea de comandos. Mira a ffmpeg, git, etc. Todos hacen uso de argv y limitan el uso de entradas con scanf() o cin a muy pocas funciones para ahorrar tiempo, tanto de uso como de programación.

Suerte waiyado.
>>

No.1998

>>1997
>Si, pero no es una buena práctica por motivos de compatibilidad y en general porque es estándar.
Como dije anteriormente.
>Los asteriscos en dentro de los argumentos de una función significan "puntero a", en este caso es un puntero a un arreglo de cstrings (y cada uno de esos cstrings son arreglos, por lo que se usa otro puntero)
Sí, sé más o menos a lo que te refieres con eso. Pero a lo que voy es que habías mencionado que argv es un arreglo de arreglos, pero ahí no veo explícitamente un "[][]" para que sea declarado un arreglo bidimensional. ¿Cómo es?
>En general porque es la mejor práctica al escribir programas de línea de comandos. Mira a ffmpeg, git, etc. Todos hacen uso de argv y limitan el uso de entradas con scanf() o cin a muy pocas funciones para ahorrar tiempo, tanto de uso como de programación.
Me intrigó eso, veré más información.
>Suerte waiyado.
Muchas gracias, Wai.
>also
Wai, desde hace unas semanas he pensado en dejar C++ y cambiarme a C, ¿qué libro me recomiendas?, ¿hay mucha diferencia entre C y C++?
>>

No.1999

>>1998
>habías mencionado que argv es un arreglo de arreglos, pero ahí no veo explícitamente un "[][]" para que sea declarado un arreglo bidimensional. ¿Cómo es?
**argv es lo mismo que *argv[], al final son punteros. Y el doble par de corchetes solo es usado para declarar las matrices. Por ejemplo char variable[3][4];
>¿qué libro me recomiendas?, ¿hay mucha diferencia entre C y C++?
De C está el famoso "The C Programming Language" que viene con el estilo de código K&R, que es el que personalmente yo uso, pero honestamente no he leído el libro entero salvo unas cuantas páginas. Aprendí C mayormente por documentación, modificando programas y leyendo las man pages.
>¿hay mucha diferencia entre C y C++?
Si usas OOP muy frecuentemente si vas a notar una diferencia importante porque en C tienes que tener un control sobre la memoria para simular lo que en C++ son las clases y objetos. Más específicamente, tienes que usar structs y aprender funciones como malloc(), calloc() y free(), pero es que C es un lenguaje de bajo nivel, así que para mi hace sentido que tengas que tener un control manual de la memoria. Es muy fácil en realidad. Otra diferencia es que usas printf() en lugar de cout.
>>

No.2001

>>1997
>Los asteriscos en dentro de los argumentos de una función significan "puntero a", en este caso es un puntero a un arreglo de cstrings (y cada uno de esos cstrings son arreglos, por lo que se usa otro puntero)
En verdad, ** quiere decir un puntero que apunta a otro puntero
No nos olvidemos que un array en C es basicamente un puntero que apunta a donde está el siguiente elemento, por tanto **argv sería un array de arrays
>>

No.2671

>>1967
seguramente es bait, pero esta es mi solución:

#include <stdio.h>

int reverse(int n)
{
int r = 0;

while (n > 1) {
r = r * 10 + n % 10;
n /= 10;
}

return r;
}

int main()
{
int max = 0;

for (int i = 100; i < 1000; i++)
for (int j = 100; j < 1000; j++)
if (i * j == reverse(i * j) && i * j > max)
max = i * j;

printf("%d\n", max);
}
>>

No.2673

>>2671
¿No habían dicho ya que solo basta usar strrev()?
>>

No.2675

>>2673
no hay ninguna razón para usar strings cuando se trata de números
>>

No.2677

>>2675
Tu post me hace dudar de que alguna vez hayas hecho un programa importante.
A ver, ¿y si se trata de manipular direcciones IP con el formato host:puerto? ¿Vas a usar arreglos números en lugar de un simple string? lel
Por cierto, el punto de programar es buscar la forma más fácil y eficiente de hacer algo sin ser gimnasta mental, pero si quieres ser extra quisquilloso puedes validar si todos los caracteres del string son numéricos, que también es muy fácil de hacer.
>>

No.2688

>>2677
El problema de project euler consiste en encontrar el mayor número que cumpla una propiedad, no creo que convertir cada número a string y hacer la comparación sea más eficiente que hacer un par de cuentar con el número directamente. Además que las ip con formato host:puerto son una string por naturaleza, aunque si se podría usar un arreglo que guarde a la dirección y a el puerto como dos números separados, pero depende de la finalidad que se le quiera dar.
>>

No.2703

>>2688
Para la capicúa sigue siendo más sencillo revertir un string.
>>

No.2705

>>1967
En mi vida y ya de por si es bastante así que no quiero sobre cargarme más cosas :^)
>>

No.2874

>>2703
compara mi solución con la de op
>>

No.2878

Joder, ¿este hilo sigue vivo?
>>2874
¿Algún problema, hermano?


[Post a Reply]
[ ]
[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]