¡Saludos a todos los lectores de Habr! Mi nombre es Yuri, he enseñado altas tecnologías, Oracle, Microsoft y otros durante más de 20 años, así como también he creado, desarrollado y soportado sistemas de información cargados para varios clientes comerciales. Hoy me gustaría contarles sobre la dirección actual: entrevistas sobre tecnologías de procesamiento de datos.
En las entrevistas de dicho plan, es inútil que el empleador le pregunte al solicitante sobre tecnologías relacionadas con la programación tradicional. Por lo tanto, popularmente le diré cómo prepararse para una entrevista en un área estrecha relacionada con los lenguajes de procesamiento de información, a saber,
procesar enteros largos (aritmética larga) e identificar propiedades de información de objetos del mundo real que se describen en enteros largos.
1. Las entrevistas con preguntas sobre tecnologías de procesamiento de datos generalmente se realizan con un conjunto de equipos de analistas y desarrolladores que previamente tenían experiencia en el desarrollo de lenguajes declarativos, imperativos, orientados a objetos y funcionales.
Desafío Definir un lenguaje de programación por una pieza de programa.

Por lo tanto, primero debe prepararse para la pregunta: ¿qué es bueno en el idioma elegido, qué podría interesar a un posible empleador? Por cierto, la lista puede variar de una versión a otra, de una biblioteca a otra, de una implementación a otra.
Desafío ¿Qué idiomas admiten aritmética con enteros largos?
Has pensado? Lista de muestra:- C, C ++ - biblioteca libgmp
- Lisp común: no limita la longitud de los enteros
- Erlang - tipo numérico incorporado (entero ())
- Ir: escribe Int y Rat de la gran biblioteca.
- Haskell - Tipo entero entero
- Java - clase java.math.BigInteger (febrero de 1997)
- OCaml - biblioteca num
- Pascal / Delphi - biblioteca MPArith
- Perl - módulos bignum y bigrat
- PHP - Módulo BCMath
- Python: tipo largo incorporado (desde que se creó el lenguaje, febrero de 1991)
- Ruby - tipo Bignum
- Scala - clase BigInt
- Esquema - con R6RS
- Lenguajes .NET - clase System.Numerics.BigInteger (apareció en .NET Framework 4.0, hace casi 10 años)
2. Si el empleador ha compilado una lista por adelantado, entonces es necesario aislar las partes comunes de los idiomas que se discutirán en la entrevista.
Desafío ¿Cuáles, en su opinión, son los idiomas más populares desde el punto de vista del empleador?
Aquí puede ver la respuesta basada en estadísticas.
En los sistemas de información grandes y extragrandes, se realizan con mayor frecuencia una serie de operaciones completamente rutinarias: varias clasificaciones, búsqueda por ciertos criterios, algoritmos en gráficos, problemas de optimización en conjuntos de diferente naturaleza, tareas para construir objetos con propiedades indefinidas. Pero, debido a la escala de la tarea, la clasificación más simple puede llevar un mes y la búsqueda puede llevar una semana. Una tarea aproximada de comprensión.
Desafío Fuera de la ventana hay un abedul. En él, como sus colegas han calculado, 100,000 hojas, el diámetro del tronco en la raíz es de 60 centímetros. Registre los parámetros especificados en cualquier notación matemática. Y demuestre su idoneidad: para la correspondencia con un colega, porque quieren cortar el árbol. O para el procesamiento informático de su imagen.
3. Algunas palabras sobre la parte matemática. En la vida, rara vez vamos más allá de los límites de la aritmética ordinaria. Las unidades de nosotros usan los logros de álgebra y análisis matemático. Deje que las siguientes declaraciones lo ayuden a recordar, aunque no superficialmente, dónde se usa prácticamente el conocimiento olvidado.
Desafío ¿Por qué los números de teléfono han tenido cinco o seis dígitos durante tanto tiempo? Dada una serie de números, ¿cuál no es un cuadrado completo? ¿Cuántos autobuses en tu ciudad tienen números cuadrados completos? ¿Cuántos números primos hasta 100 sabes? ¿Cuánto es un porcentaje de todos los números del 1 al 100? Sea 2, 3, 5, 7 primos, encuentre el número de primos hasta 100. ¿Cuántas operaciones aritméticas tuvo que hacer? Resuelva el mismo problema en MS Excel para la autoevaluación de dos maneras.
Desafío ¿Cómo se usan las protuberancias y las concavidades en la práctica? Dé 2-3 ejemplos del uso de convexidad-concavidad.
4. A veces es necesario revisar la documentación del sistema / idioma / conjunto de bibliotecas, ejemplos de descripciones técnicas detalladas y extensas del propio autor / fabricante. Esto es especialmente necesario si tiene la intención de llamar a bibliotecas no estándar.
Desafío Escriba el algoritmo euclidiano extendido en uno de los lenguajes de programación indicados anteriormente, en el párrafo 1. ¿En qué idioma no es necesario hacer esto? Por qué
5. Es aconsejable comprender la dirección de la entrevista: ¿escribirá los algoritmos usted mismo o tendrá que mantener un conjunto de algoritmos de terceros, que eventualmente tendrán que ponerse en orden?
Desafío Según el conjunto de registros del médico jefe, realizado con un bolígrafo en el cuaderno del alumno, es necesario identificar de manera computarizada qué paciente fue asignado. ¿Qué puedo aconsejarle al interno?
6. Si la elección del lenguaje de la entrevista está implícita, es mejor tomar uno más estandarizado para que el entrevistador no desee cambiar las condiciones de las tareas durante la conversación.
Desafío ¿Cuántas versiones del lenguaje Pascal han aparecido en los últimos 25 años? Indique las fortalezas y debilidades de cada versión.
7. Es aconsejable asistir al menos a un seminario sobre algoritmos y su implementación en soluciones de información preparadas en un área temática determinada.
Desafío El poeta le hizo una pregunta: ¿puede escribir un poema "Eugene Onegin" teniendo en cuenta el tesauro poético de este autor. Da dos soluciones a este problema.
8. El
recurso para programadores tiene tareas para capacitar la capacidad de procesar información científica y programar algoritmos complejos. A continuación presentamos la solución "de frente", pero no es óptima y es solo una declaración de la condición desde el punto de vista de un lenguaje de programación de alto nivel. Debido a la redacción insuficientemente precisa del texto de la tarea en sí, sus respuestas pueden no coincidir con las respuestas proporcionadas por los autores de esta tarea.
Dejar
Es el entero no negativo más pequeño
para que
Tiene el mayor valor posible.
Por ejemplo
desde
alcanza el valor máximo
a las
y tiene valores más pequeños en
. Dejar
para
,
.
Se sabe que
y
. Encontrar
.
Desafío Afortunadamente, esta es una tarea muy raramente resuelta en el Proyecto Euler. De acuerdo con el texto del programa dado, encuentre las fortalezas y debilidades del algoritmo y especifíquelas. ¿Puede este programa resolver este problema en un día laboral? ¿Cómo se puede acelerar? Indique errores en la tarea, si los hay. Encuentra la
opción "
muy grande ". ¿Cómo es limitado?
Unas pocas palabras más si no puedes resolverlo.Si estuviéramos hablando de máximos locales, entonces las respuestas deberían ser menores, pero después de los cálculos, de repente resulta que estamos hablando de máximos globales, sobre los cuales no hay una palabra en el texto del problema.
Y sin embargo, existe la sospecha de que para cualquier . Cual se adaptará a los autores del problema?
Código para una solución de ejemplopublic class Start { static BigInteger[] GcdExtended(BigInteger a, BigInteger b) { BigInteger res[] = new BigInteger[3]; if (b == BigInteger.valueOf(0)) { res[0] = a; res[1] = BigInteger.valueOf(1); res[2] = BigInteger.valueOf(0); return res; } res = GcdExtended(b,a.divideAndRemainder(b)[1]); BigInteger s = res[2]; res[2] = res[1].subtract((a.divideAndRemainder(b)[0]).multiply(res[2])); res[1] = s; return res; } public static void main(String[]args) throws IOException { BigInteger i; BigInteger j; int n,n1; BigInteger temp; BigInteger temp1; BigInteger count; FileWriter fileWriter = new FileWriter("c:/temp/terribleanswer.txt"); n1=1; count=BigInteger.ZERO; i=BigInteger.ZERO; j=BigInteger.ZERO; temp1=BigInteger.ZERO; temp=BigInteger.ZERO; for (int a=1;a<19;a++) { for (int b=1;b<1901;b++) { for(n=1;n<;n++) { j=((BigInteger.valueOf(n)).pow(3)); j=j.add(BigInteger.valueOf(b)); i=(((BigInteger.valueOf(n)).add(BigInteger.valueOf(a))).pow(3)); i=i.add(BigInteger.valueOf(b)); int comparevalue = j.compareTo(i); if (comparevalue==0) { temp=GcdExtended(i,j); } else if (comparevalue == 1) { temp=GcdExtended(j,i); } else { temp=GcdExtended(i,j); } int compareTemp = temp.compareTo(temp1); if (compareTemp == 1) { temp1=temp; n1=n; continue; } } String fileContent = a + ";" + b +";"+ temp1 +";"+ n1 + "\n"; temp1=BigInteger.ZERO; count=count.add(BigInteger.valueOf(n1)); n1=1; try { fileWriter.append(fileContent); } catch (IOException e) { } } } String fileContent = count + "\n"; try { fileWriter.append(fileContent); } catch (IOException e) { } fileWriter.close(); } }
9. ¡Deseo que tengas una entrevista a buen nivel!
UPD Antes de publicar la
versión en inglés del artículo , damos algunas no triviales
relaciones encontradas después de una profunda modernización de la solución anterior. Al calcular hasta
.
;
;
;
.