De todas las matemáticas, siempre habrá algunos teoremas que van más allá del sentido común. Uno de estos es el hecho de que hay diferentes tamaños de infinito. Otro hecho interesante es la idea de que muchos infinitos que parecen ser de diferente tamaño son en realidad del mismo tamaño. Hay tantos números pares como enteros, ya que hay números racionales.
El concepto general de esta pregunta es confrontar la extraña realidad del infinito. En este desafío, su programa generará una lista que:
- En cualquier momento específico, siempre tenga un número entero de entradas
- Eventualmente contenga (si se deja que se ejecute lo suficiente) cualquier número racional específico (que no sea cero) precisamente una vez en toda la lista
- Contiene un número ilimitado de ranuras vacías (entradas en la lista que se establecen innecesariamente en 0)
- Tener una proporción de espacios vacíos que se acerque a un límite del 100%
- Por cada entero positivo N, tenga un número infinito de lugares con N ranuras vacías consecutivas
El reto
Su desafío es escribir el programa más corto posible que generará una lista especial con las siguientes reglas:
- Todas las entradas con un índice que no sea un número cuadrado deben establecerse en cero. Entonces, la primera entrada será distinta de cero, la segunda y la tercera serán cero, la cuarta será distinta de cero, etc.
- Todos los números racionales tendrán la forma de una fracción impropia (como 4/5 o 144/13) que se ha simplificado. La excepción son los ceros, que serán simplemente
0
. - Todos los números racionales (positivos y negativos) deberían aparecer eventualmente en la lista si su programa se ejecuta durante el tiempo suficiente y con suficiente memoria. Para cualquier número racional particular, el tiempo requerido puede ser una cantidad arbitrariamente grande, pero siempre finita.
- Si se ejecuta durante una cantidad de tiempo infinita, ningún número racional distinto de cero debería aparecer dos veces.
La regla 3 permite alguna variación, ya que hay un número infinito de diferentes resultados legales posibles.
La salida será un flujo de líneas. Cada línea tendrá la forma general de 5: 2/3
donde el primer número es el número de entrada, seguido del número racional. Tenga en cuenta que 1: 0
siempre será la primera línea de salida.
Fragmento de ejemplo de salida:
1: 1/1
2: 0
3: 0
4: 2/1
5: 0
6: 0
7: 0
8: 0
9: -2/1
10: 0
etc...
Reglas, Regulaciones y Notas
Este es el código de golf. Se aplican las reglas estándar del código de golf. Además, debido a la variación permitida en la salida, debe mostrar al menos por qué cree que su lista contendrá todos los números racionales posibles exactamente una vez, y que su solución es correcta.
EDITAR: Dado que los números primos distrajeron del desafío, lo estoy cambiando a números cuadrados. Esto cumple el mismo propósito y también acorta las soluciones.
fuente
1: 0
siempre será la primera línea de salida. - Esto contradice tu ejemplo y tampoco tiene sentido para mí.Respuestas:
Haskell, 184 caracteres
Esto atraviesa por primera vez el árbol Calkin-Wilf , produciendo todos los números racionales positivos en forma reducida exactamente una vez. Luego alterna entre positivo y negativo para cubrir todos los números racionales distintos de cero y los pads con ceros entre las entradas cuadradas.
Salida (excluyendo líneas cero por brevedad):
fuente
Sage, 103
113128¡Sage puede enumerar los racionales con facilidad! Formatear para ajustarse a los requisitos del programa, como siempre, arruina todo.
Sage enumera
QQ
según su altura : el valor absoluto máximo del numerador y denominador después de la reducción de GCD.fuente
x.next()
y utilizarprint
sólo una vez, de la siguiente manera, con lo que la puntuación hasta 124:x=enumerate(QQ) for i,q in x: for j in[(i-1)^2+1..i*i]: print'%d: '%j,'%d/%d'%(q.numer(),q.denom())if j.is_square()else 0
. Esto no se muestra correctamente en un comentario, pero creo que puedes ver lo que quiero decir.Python, 162
Esto utiliza la recursividad dada en Recuento de los racionales por Calkin y Wilf.
fuente
Haskell, 55 bytes
salidas
1% 1 es la raíz del árbol Calkin-Wilf; la iteración agrega ambos hijos de cada nodo; la unión contrae los niveles en una sola lista.
120 caracteres si agrega importaciones adecuadas, 0 y negativos:
salidas
salida de ranuras vacías? eso es de mal gusto :( me tenías en "lista de todos los racionales positivos"
fuente
mapM_ print$fix((1%1:).(>>= \x->[x+1,1/(x+1)]))
es de 47 caracteres. de haskellwiki . Funciona como está, sin ningún tipo de importaciones, en haskell.org 's "intentarlo" REPL (así, sin lamapM_ print
parte ...)PHP 105 bytes
Nota: Este código debe guardarse como iso-8859-1 (ansi) para que se ejecute correctamente. Los intérpretes en línea que codifican todas las entradas a utf8 de forma predeterminada (como ideone) generarán una salida incorrecta.
Usando la enumeración de Georg Cantor (ligeramente modificado para valores +/-).
Si tiene problemas para ejecutar el código anterior (probablemente debido a una cantidad excesiva de mensajes de AVISO), use esto en su lugar (107 bytes):
fuente
Octava, 168 bytes
La solución no es muy sofisticada, es solo un simple recorrido diagonal de la "alfombra" de números racionales, descartando todas las fracciones que se pueden simplificar. Después de un número positivo
a/b
, su opuesto-a/b
siempre se imprime antes de que pase el siguiente de la secuencia.Dado que se imprimirán todas las fracciones simples positivas y se imprimirán las fracciones con signo opuestas a esas, y nunca es posible que dos fracciones simples diferentes tengan el mismo valor, cada número racional distinto de cero se imprimirá exactamente una vez.
Degolfed:
fuente