Imprimir números seguros para la rotación

29

Fondo

Estás trabajando para algún fabricante de juegos de mesa y necesitas producir fichas de madera con los números del 0 al n grabados en ellas para algún juego. Sin embargo, sin más preámbulos, algunos azulejos se vuelven indistinguibles, por ejemplo, 6y 9. Para evitar esto, debe equipar números que puedan confundirse con otros (y solo con ellos) con un punto desambiguado, por ejemplo, tendría fichas como 9.o 6089..

Desafortunadamente, necesita usar un dispositivo de grabado en madera antiguo pero programable para esto, cuya interfaz está tan rota que tiene que codificar a mano todos los caracteres del programa en un proceso indescriptiblemente tedioso. Afortunadamente, el dispositivo comprende todos los lenguajes de programación existentes. Por lo tanto, está buscando el programa más corto que imprima dichos mosaicos.

Tarea real

Escribe el programa más corto que:

  • Toma un entero positivo n como entrada. Cómo se lee la entrada depende de usted.
  • Imprime cada uno de los números del 0 al n (0 yn incluidos) exactamente una vez en el orden que elija, separados por un solo espacio en blanco (incluida la nueva línea). Los números deben imprimirse sin ceros a la izquierda.
  • Agrega un punto (.) A cada número que se convierte en otro número válido después de la rotación por π (180 °), incluso si ese número es mayor que n. Su tipo de letra 0 y 8 son simétricos a la rotación y el 9 es un 6. girado. Los 2 y 5 son distintos al girar; el 1 no es simétrico a la rotación. Los números con ceros a la izquierda no son válidos.

Ejemplos

Cada uno de los siguientes números debe imprimirse exactamente de esta manera:

  • 2
  • 4
  • 5
  • 6.
  • 8
  • 9.
  • 16
  • 60
  • 66.
  • 68.
  • 69
  • 906
  • 909.
  • 8088.
  • 9806.
  • 9886
  • 9889.
Wrzlprmft
fuente
¿No debería 60ser 60.?
red-X
2
@ red-X "Los números con ceros a la izquierda no son válidos".
Sp3000
2
@rationalis: Hay una escapatoria estándar para esto. (Además, esto no tendría sentido temáticamente, ya que tienes que enseñarle a esa máquina ese idioma). De cualquier manera, agregué uno existente.
Wrzlprmft
2
@rationalis Lo que generalmente sucede es que solo las versiones de idiomas existentes antes de la publicación del desafío son elegibles para ser el programa ganador. Las versiones realizadas después aún pueden publicarse por diversión, pero deben especificar en su publicación que no están compitiendo. Entonces, sí, puede definir dicho lenguaje, pero sería inelegible y probablemente no sea bien recibido debido a que es un vacío estándar (como se indicó anteriormente).
Sp3000
3
Creo que sería útil incluir 8088.en sus ejemplos un número inseguro de rotación que no tenga un 6 o un 9.
El'endia Starman

Respuestas:

6

Pyth - 34 38

VhQJ`N+J*\.&nJX_J`69`96&eN!-J"0689

Debo agradecer a @ Sp3000 por ayudarme a eliminar 4 bytes. Originalmente tenía un cheque adicional &@JKque se aseguraba de que hubiera un 6 o 9 en el número, pero después de leer las respuestas antes de publicar, leí su respuesta y noté que mi traducción e inversión idénticas ya se habían ocupado de eso.

También gracias a @isaacg por señalar que las cadenas son iterables, y puede usar operaciones de configuración en ellas. También para hacer el código actual;)

Explicación:

                                    : (implicit) Q=eval(input())
VhQ                                 : for N in range(Q+1):
   J`N                              : J=str(N)
      +J*\.                         : J + "." * ...
           &nJX_J`69`96             : J!=translate(reversed(J),"69","96") and...
                       &eN          : N%10 and...
                          !-J"0689  : not(setwise_difference(J, "0689"))
FryAmTheEggman
fuente
No creo que necesite usar listas de enteros para Ky J, solo use cadenas en su lugar. El cambio Ka <backtick> 69 y Ja <backtick> N guarda algunos caracteres, al igual que la alineación Ken el programa resultante. Lo más corto que pude obtener con esa técnica fue VhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689, 34 caracteres. (Dos backticks son realmente uno.)
isaacg
@isaacg Gracias por el consejo! Creo que por alguna razón olvidé que hacer una cadena de números era realmente corto en pyth usando `. De todos modos, puedes escribir un bloque de código con backticks escapándolos con \. Por ejemplo:hell`o wo`rld
FryAmTheEggman
En la explicación, pareces tener un extra _, antes del `96.
isaacg
@isaacg Gracias, arreglado
FryAmTheEggman
10

CJam, 46 44 43 42 bytes

l~),{_A%g1$s_6890s-!\_69s_W%erW%=!&&'.*N}/

Creo que hay margen de mejora.

Pruébalo aquí.

Explicación

l~),{_A%g1$s_6890s-!\_69s_W%erW%=!&&'.*N}/
l~                                         "Read an eval input.";
  ),                                       "Get range from 0 to n.";
    {                                   }/ "For each...";
     _                                     "Get a copy of the integer.";
      A%g                                  "Ends with digit other than 0?";
         1$s_                              "Get another copy, convert to string, get a copy.";
             0689s-!                       "Contains rotation-safe digits?";
                    \                      "Swap with other copy.";
                     _                     "Get another copy.";
                      69s_W%er             "Swap 6 and 9.";
                              W%           "Reverse.";
                                =!         "Is different from original?";
                                  &&       "AND all three conditions.";
                                    '.*    "If true, push a period (else, an empty string).";
                                       N   "Push a newline.";
Martin Ender
fuente
¿Qué devuelve esto cuando la entrada es 8? (Pegué el código en Input y luego hice clic en el botón Ejecutar, pero se llamó a un error).
DavidC
@DavidCarraher puso el código en "Código" y nen Entrada.
Martin Ender
ingresando 98, su programa pone un punto al lado de 66, lo cual es incorrecto.
Sparr
3
@Sparr Debe esperar a que el OP responda su pregunta antes de decir que una respuesta no es válida. Su afirmación: "Cada uno de los siguientes números debe imprimirse exactamente de esta manera" parece contradecir su interpretación.
FryAmTheEggman
Me gusta la belleza de las explicaciones de CJam.
nyuszika7h
8

CJam, 46 45 43 42 bytes

ri){Is___69`96`erW%=!\6809`-!&IA%g&'.*N}fI

Creo que se puede jugar un poco más al golf.

Toma nde STDIN.

Pruébalo en línea aquí

Optimizador
fuente
5

APL 66

∊' ',¨{a←⌽'0.....9.86'[⎕D⍳b←⍕⍵]⋄'.'∊a:b⋄('0'=⊃a)∨⍵=⍎a:b⋄b,'.'}¨0,⍳

Explicación:

¨0,⍳           applies the function to each number 0-n
a←⌽'0.....9.86'[⎕D⍳b←⍕⍵] inverts 6s and 9s, leaving 8s and 0s, and replacing other numbers with dots. Reverses vector after substitution.
'.'∊a          if there is a dot in the number....
('0'=⊃a)       .. or if the number starts with 0...
⍵=⍎a           or if the (inverted) number is the same as original
:b             then print the original number
b,'.'          else print a dot in the end
∊' ',¨        Finally to give the result in the asked format i add a single space after each result and join them all 

Pruébalo en tryapl.org

Tenga en cuenta que en el intérprete en línea la función ⍎ no funciona, así que tuve que sustituirla por 2⊃⎕VFI, que hace lo mismo en este caso, ejecuta y devuelve el número, dada una cadena.

Moris Zucca
fuente
Parece incorrecto: 60, 69, 90 y 96 no deben tener puntos.
ngn
Gracias @ngn, lo corregí, creo que ahora funciona correctamente.
Moris Zucca
2
Bien hecho :) En lugar de ⊃,/o ,/puedes usar uno en el frente.
ngn
¡Correcto! Normalmente no trabajo en ml1, así que me olvido de ∊.
Moris Zucca
4

Perl 5, 53 bytes

say$_,"."x(!/[1-57]|0$/&&reverse!=y/96/69/r)for 0..<>

Demo en línea.

Utiliza la función Perl 5.10+ say, por lo que debe ejecutarse con perl -M5.010(o perl -E) para habilitarla. (Consulte este metaproceso ) . Lee la entrada de stdin, imprime en stdout.

Ilmari Karonen
fuente
4

Python 2, 130 116 113 bytes

def f(n):S=`n`;n and f(n-1);print S+"."*all([n%10,set(S)<=set("0689"),(u""+S[::-1]).translate({54:57,57:54})!=S])

Define una función fque imprime los números en STDOUT, en orden ascendente.

Esta vez pensé en sacar una hoja del libro de @ feersum con .translate:)

Expandido:

def f(n):
 S=`n`        
 n and f(n-1)                                      # Recurse if not 0                                     
 print S+"."*all([n%10,                            # Not divisible by 10
                  set(S)<=set("0689"),             # Consists of 0689
                  (u""+S[::-1]).translate
                  ({54:57,57:54})!=S])             # When rotated is not itself

Solución previa:

def f(n):S=`n`;print S+"."*all([n%10,set(S)<=set("0689"),eval("S[::-1]"+".replace('%s','%s')"*3%tuple("6a96a9"))!=S]);n and f(n-1)

Gracias a @xnor por mostrarme el .replacetruco hace algún tiempo.

Sp3000
fuente
Puedes usar en (u''+S[::-1])lugar de unicode(S[::-1]). Además, si intercambia la printllamada y la llamada recursiva, los números saldrán en orden creciente.
ngn
@ngn Ah, gracias, no pensé u""+que realmente funcionaría
Sp3000
Mira, creo que esto debería ser más pequeño, por ejemplo, no es tu culpa que la impresión sea legítimamente impresa, no "p", pero si tuvieras que escribir "p = print" y no contar como bytes en tu envío "oficial" ¡Lo acortaría!
Alec Teal
4

C #, 343309 caracteres

Manera demasiado largo, pero de todos modos:

namespace System.Linq{class C{static void Main(){int n=int.Parse(Console.ReadLine());for(int i=0;i<=n;i++){var b=i+"";var c=b.Replace("6","9");Console.Write(b+(b.All(x=>x=='0'|x=='8'|x=='6'|x=='9')&!b.EndsWith("0")&!(b.Count(x=>x=='6')==b.Count(x=>x=='9')&new String(c.Reverse().ToArray())==c)?". ":" "));}}}}

¿Como funciona? Para agregar un punto al número, debe coincidir con los siguientes requisitos:

  • Consiste solamente en 0, 8, 6y 9.
  • No termina con un cero.
  • No es el mismo número cuando lo gira:
    • Si un número tiene la misma cantidad de 6sy 9s, y
    • if c= el número con todo 6s reemplaza con 9s,
    • y revertido c== c,
    • entonces: el número girado es el mismo que el número mismo.

Los números están separados por un espacio.

Código con sangría:

namespace System.Linq
{
    class C
    {
        static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i <= n; i++)
            {
                var b = i + "";
                var c = b.Replace("6", "9");
                Console.Write(b +
                    (b.All(x => x == '0' | x == '8' | x == '6' | x == '9') &
                    !b.EndsWith("0") &
                    !(b.Count(x => x == '6') == b.Count(x => x == '9') &
                    new String(c.Reverse().ToArray()) == c) ? ". " : " "));
            }
        }
    }
}
ProgramFOX
fuente
1
Mi respuesta es más larga;) Parece que estoy jugando bolos en el campo de golf.
Trauma digital
1
¿Qué hay de 8808? No tiene 6 ni 9, pero es 8088 cuando se gira.
El'endia Starman
1
@ El'endiaStarman ¡Muchas gracias! Mientras arreglaba mi presentación, en realidad guardé caracteres :)
ProgramFOX
4

M (MUMPS) - 72 70

R n F i=0:1:n W !,i S r=$TR($RE(i),69,96) W:r=+r*r'=i*'$TR(i,0689) "."

La mayoría de los comandos y funciones incorporados en M tienen versiones abreviadas. He usado los nombres completos a continuación.

READ n- Lea una cadena del teclado y guárdela n.

FOR i=0:1:n- Bucle de cero a n, incrementándose ien 1 cada vez. (El resto de la línea constituye el cuerpo del bucle).

WRITE !,i- Imprima una nueva línea seguida del valor de i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Invierta i, reemplace nueves con seis y seis con nueves, y guárdelo en r.

WRITE:r=+r*r'=i*'$TRANSLATE(i,0689) "."

  • :- Denota una expresión postcondicional, por lo que el WRITEcomando solo se ejecuta si se r=+r*r'=i*'$TRANSLATE(i,0689)evalúa como un valor verdadero.
  • r=+r- Compruebe que rno tiene un cero a la izquierda. El +operador unario convierte una cadena en un número, que elimina los ceros a la izquierda si los hay.
  • *- Operador de multiplicación. M no tiene orden de operaciones; Todos los operadores binarios se evalúan en el orden en que aparecen de izquierda a derecha.
  • r'=i- Compruebe que ino es lo mismo que su versión invertida r.
  • '$TRANSLATE(i,0689)- Elimine todos los ceros, seises, ochos y nueves i, y verifique que no quede nada. ( 'es el operador de negación lógica).
  • "."- Finalmente el argumento del WRITEcomando (una cadena literal).

Editar: lo hizo un poco más corto al abusar del operador de multiplicación. Versión previa:

R n F i=0:1:n W !,i S r=$TR($RE(i),69,96) I '$TR(i,0689),i'=r,r=+r W "."
temporicida
fuente
3

APL, 53 caracteres

∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳

0,⍳N        numbers 0..N
{...}∘⍕¨    format each number as a string and do the thing in curly braces
                inside the braces ⍵ is the current string
'6908'⍳⍵    encode '6' as 1, '9' as 2, '0' as 3, '8' as 4, and all others as 5
⌽           reverse
'9608x'[A]  use each element of A as an index in '9608x':
                effectively: swap '9'←→'6', preserve '08', mask other digits
⍵≡          does it match the original string?
                this is the first boolean condition, two more to come
5∊i         did we have a digit other than '0689'?
3≡⊃i        is the first of i (that is, the last of ⍵) a '0' (encoded as 3)?
∨/          disjunction ("or") over the three conditions, returns 0 or 1
'. '↓⍨      drop 0 or 1 elements from the beginning of the string '. '
⍵,          prepend ⍵
∊           flatten the results to obtain a single output string
ngn
fuente
3

C # 205 209

C # no tiene que ser tan largo ...
más o menos, un puerto de mi respuesta de JavaScript

class P{static void Main(string[]a){for(int n=int.Parse(a[0]);n>=0;--n){string p="",u=n+p;int e=n%10;foreach(var d in u)p=(d<56?d!=54?d>48?e=0:0:9:120-d-d)+p;System.Console.WriteLine(e!=0&p!=u?u+".":u);}}}

Sin golf

class P 
{
    static void Main(string[] a)
    {
        for (int n = int.Parse(a[0]); n >= 0; --n)
        {
            string p = "", u = n + p;
            int e = n % 10;
            foreach (var d in u) p = (d < 56 ? d != 54 ? d > 48 ? e = 0 : 0 : 9 : 120 - d - d) + p;
            System.Console.WriteLine(e != 0 & p != u ? u + "." : u);
        }
    }
}
edc65
fuente
2

Rubí, 81

?0.upto(*$*){|x|puts x.reverse.tr('69','96')!=x&&x=~/^[0689]+$/&&/0$/!~x ?x+?.:x}

La entrada se toma de la línea de comando.

Genera una lista de Strings desde 0hasta n. Se enrolla a través de ellos y los imprime. Agrega un punto si se cumplen todas las condiciones:

  • invertir el número y reemplazar la 6s con 9s no produce el original
  • el número sólo se compone de los dígitos 0, 6, 8y9
  • el número no termina con 0
britishtea
fuente
2

JavaScript (ES6) 101 104 106 109

Una función con n como argumento, salida a través de console.log
Edite usando% 10 para probar la reorganización de la
Edición 0 inicialfor , no necesito la comprensión de la matriz después de que toda la
Edición 3 modificó (nuevamente) la verificación de la inicial 0

F=n=>{
   for(;e=~n;console.log(e*l&&p-n?n+'.':n),--n)
     for(d of(p='')+n)p=(l=d<8?d-6?-d?e=0:0:9:24-d-d)+p
}

Sin golf y más fácil de probar

F=n=>
{
  o = '';
  for( ; ~n; --n) // loop on n decreasing to 0 (~n is 0 when n==-1)
  {
    e = ~n; // init to a nonzero value, zero will mark 'invalid digit'
    p = ''; // build rotated number in p
    for(d of '' + n)
    {
      // l is the current digit, on exit will be the first digit of p
      l = d < 8 ?
            d != 6 ?
              d != 0 ?
                e = 0 // invalid char found, no matter what
                : 0 
              : 9 // 6 become 9
            : 24 - d - d; // calc 8 => 8, 9 => 6
      p = l + p;
    }       
    // e==0 if invalid char, l==0 if leading 0
    o += ' ' + ( e * l && p-n ? n+'.' : n);
  }
  console.log(o);
}

F(100)

Salida

100 99. 98. 97 96 95 94 93 92 91 90 89. 88 87 86. 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68. 67 66. 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9. 8 7 6. 5 4 3 2 1 0
edc65
fuente
¿Hay un nombre para la construcción con el bucle for entre paréntesis []? Estoy buscando una documentación, porque hasta ahora solo sabía esto de Python.
defecto
1
Creo que puedes ahorrar mucho en nuevas líneas aquí.
britishtea
1
@britishtea nuevas líneas y sangría añadidas para facilitar la lectura y sin contar. Es una sola línea
edc65
1

Bash + coreutils, 105

for((i=0;i<=$1;i++));{
[ ${i//[0689]/} ]||[ $i = `rev<<<$i|tr 69 96` ]||((!${i: -1}))||d=.
echo $i$d
d=
}

Prueba:

$ ./rotproof.sh 100 | grep "\."
6.
9.
66.
68.
86.
89.
98.
99.
$ 
Trauma digital
fuente
1

sed, 467

Más largo que C # ...

Casi completé esto cuando @ edc65 señaló que las respuestas necesitan procesar los números 0-ny no solo n. Agregar el código sed para incrementar 0-n agrega MUCHO más código, ya que esta tarea no es adecuada para sed sin aritmética.

:l
/^[0689]*$/{
h
s/$/:/
:x
s/([0-9]):(.*)/:\2\1/
tx
s/://
y/69/96/
G
/^([0-9]+)\n\1/be
s/^[^0].*/&./
:e
s/.*\n//
}
p
s/\.//
s/[0-9]/<&/g
s/0//g;s/1/_/g;s/2/__/g;s/3/___/g;s/4/____/g;s/5/_____/g
s/6/______/g;s/7/_______/g;s/8/________/g;s/9/_________/g
:t
s/_</<__________/
tt
s/<//g
s/_//
:b
s/__________/</g
s/<([0-9]*)$/<0\1/
s/_________/9/;s/________/8/;s/_______/7/;s/______/6/
s/_____/5/;s/____/4/;s/___/3/;s/__/2/;s/_/1/
s/</_/g
tb
s/^$/0/
/^0$/by
bl
:y
c\
0
p

Según el OP, el orden no importa, por lo que trabajamos hacia abajo de n a 0.

Salida:

$ sed -rnf rotproof.sed <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Trauma digital
fuente
1

AWK: 120

{a[a[6]=9]=6;a[8]=8;for(j=a[0]=0;j<=$0;++j){r="";for(i=j;i;i=int(i/10))r=r a[i%10];print(j~/[^0689]|0$/||j==r)?j:j"."}}

Lea el valor n de stdin.

Prueba:

C: \ AWK> gawk -f revnum.awk | grep \.
100
^ Z
6.
9.
66.
68.
86.
89.
98.
99.

LeFauve
fuente
1

Rebol - 195

for n 0 do input 1[b: copy a: form n d: c: 0 parse reverse a[any[m:"6"(change m"9"++ c)|"9"(change m"6"++ c)|"0"|"8"| skip(++ d)]]print rejoin [b either all[d = 0 c > 0 a != b a/1 != #"0"]"."{}]]

Ungolfed + algunas anotaciones:

for n 0 do input 1 [
    b: copy a: form n
    d: c: 0

    ; reverse number and rotate "6" & "9"
    ; and do some counts (c when "6" or "9" and d when != "0689")
    parse reverse a [
        any [
            m:
              "6" (change m "9" ++ c)
            | "9" (change m "6" ++ c)
            | "0"
            | "8"
            | skip (++ d)
        ]
    ]

    print rejoin [
        b either all [
            d = 0               ; only has 0689 digits
            c > 0               ; must have at least one "6" or "9"
            a != b              ; not same when reversed
            a/1 != #"0"         ; does not "end" with zero
        ]
        "." {}                  ; if ALL then print "." else blank {}
    ]
]
draegtun
fuente
1

aC, 158

Después de hacer esto puramente en sed usando todas las operaciones de cadena y expresión regular sin aritmética nativa, tenía curiosidad por ver cómo se vería al revés, es decir, todas las operaciones aritméticas y lógicas y sin cadena / expresión regular:

for(i=read();i+1;r=0){p=1
for(x=i;x;x/=A){d=x%A
if(x==i&&!d)p=0
if(d==6||d==9)d=F-d else if(d%8)p=0
r=r*A+d}
if(r==i)p=0
print i--
if(p)print "."
print "\n"}

La salida se ordena en orden descendente.

Salida:

$ bc rotproof.bc <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Trauma digital
fuente
1

Python - 152

for i in range(input()+1):print`i`+("."*all([j in"0689"for j in`i`])and`i`[-1]!="0"and`i`!=`i`.replace("9","x").replace("6","9").replace("x","6")[::-1])
KSFT
fuente
+1. Verse bien ... Si quieres aprender algunos trucos para acortarlo, hay otra respuesta en python 2 que usa traducir en lugar de reemplazar, y en el historial de edición también tiene una forma de combinar esos 3 reemplazos en 1 que podrían venir útil para futuras preguntas ...
trichoplax
2
Buen progreso! Además de lo anterior Aquí hay más campos de golf: "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(que es en realidad eval(raw_input()))
SP3000
Algunos campos de golf: (1) En Python 2, puede reemplazar str(i)con `i`. (2) Se usa asolo una vez, entonces, ¿por qué asignarlo a una variable?
Wrzlprmft
Usaré tu segunda sugerencia, pero la uso str(i)varias veces. ¿Con cuál puedo reemplazar i?
KSFT
1
No i, pero icon backticks, lo cual es sinónimo de repr(i). Puede usarlo en lugar de en str(i)todas partes, aunque si tiene str(i)tantas veces, podría ser más corto asignarlo a una variable y usarlo además de usar backticks. (es decir x=`i`; (do stuff with x))
Sp3000
1

JavaScript - 168 129 119 113 111 108

F=n=>{for(;~n;n--){r='';for(c of""+n)r=(c-6?c-9?c:6:9)+r;console.log(r-n&&!/[1-57]/.test(r)&&n%10?n+".":n)}}

4 5 6. 8 9. 16 60 66. 68. 69 906 909. 6090 9806. 9886 9889.

O versión legible:

F=n=>{for(;~n;n--){
    r='';for(c of ""+n)r=(c-6?c-9?c:6:9)+r; // rotate
    console.log( // output, new-line is added
        // original number, and
        // append dot only if number is different than its rotated version and no un-rotatable digit is present and there is no zero at the end
        r-n && !/[1-57]/.test(r) && n%10
           ?n+".":n
    )}}

No estoy muy contento con la expresión regular, ¿alguna idea?

Edición : truco ordenado aprendido con ~y for (... of ...)de @ edc65
Edición2 : condiciones reorganizadas
Edición3 : sugerencias aplicadas por @ edc65

zabalajka
fuente
Mala pupila :) i=n+"";for(c of i)=> for(c of i=n+"")guardar 2 bytes
edc65
... y c==6?A:B=> c!=6=>B:A=>c-6?B:A
edc65
Además, generalmente se puede utilizar Regexp.test (String) en lugar de String.match (Regexp), 1 byte más corto.
edc65
6 bytes es total, gracias :) for(c of i=n+"")es bastante lógico cuando lo veo, pero no pensaría en ello. c-6?B:ADios no lo quiera, nunca puse esto en el código de producción
zabalajka
Idea sobre la expresión regular: debe verificar 1 carácter inválido, no 1 o más, por lo que no es necesario '+'. Si juega con su expresión console.log, puede guardar 8 bytes ... pero creo que su respuesta sería demasiado corto
edc65
1

05AB1E , 38 37 30 29 bytes

ÝεÐSUT%ĀiŽR!XåPiÐ69‡RÊi'.«]»

Pruébalo en línea.

Explicación:

Ý                # Inclusive 0-based range: [0, (implicit) input]
 ε               # Map each integer to:
  Ð              #  Triplicate the current integer
  SU             #  Convert it to a list of digits, and pop and store it in variable `X`
    Ti         #  If the current integer contains no trailing zeros
    ŽR!XåPi      #  And if the current integer only consists of the digits [0689]
    Ð69‡RÊi     #  And if the current integer is not the same when its 6s and 9s
                 #  are swapped and then the total is reversed
             '.« #   Concat a '.'
                 #  Implicit else: use the top of the stack (the duplicate current integer)
]                # Close all three ifs and the map
 »               # Join the resulting list by newlines (and output implicitly)

Explicación adicional para algunas partes:

Ti       # Check if the integer contains no trailing zeros:
T          #  Push 10 (T is a builtin for 10)
 %         #  Modulo
  Ā        #  Trutified: 0 remains 0 (falsey), everything else becomes 1 (truthy)
           #   i.e. 12 % 10 → 2 → 1 (truthy)
           #   i.e. 68 % 10 → 8 → 1 (truthy)
           #   i.e. 70 % 10 → 0 → 0 (falsey) (70 remains as is)
           #   i.e. 609 % 10 → 9 → 1 (truthy)
           #   i.e. 808 % 10 → 8 → 1 (truthy)

ŽR!XåPi    # Check if the integer only consists of the digits 0, 6, 8 and/or 9:
ŽR!        #  Push 6890 (Ž is a builtin for 2-char compressed integers, where R! is 6890)
   X       #  Push variable `X` (the list of digits)
    å      #  Check for each of these digits if they're in "6890"
     P     #  Take the product of that list
           #   i.e. [1,2] → [0,0] → 0 (falsey) (12 remains as is)
           #   i.e. [6,8] → [1,1] → 1 (truthy)
           #   i.e. [6,0,9] → [1,1,1] → 1 (truthy)
           #   i.e. [8,0,8] → [1,1,1] → 1 (truthy)

Ð69‡RÊi   # Check if the integer with 6s and 9s swapped and then reversed isn't unchanged:
Ð          #  Triplicate the integer
 69        #  Push 69
   Â       #  Bifurcate (short for Duplicate & Reverse)
          #  Transliterate (in `a` replace all characters `b` with characters `c`)
     R     #  Reverse
      Ê    #  Check for inequality
           #   i.e. 68 → "68" → "98" → "89" → 68 != "89" → 1 (truthy) (68 becomes "68.")
           #   i.e. 609 → "609" → "906" → "609" → 609 != "609" → 0 (falsey) (609 remains as is)
           #   i.e. 808 → "808" → "808" → "808" → 808 != "808" → 0 (falsey) (808 remains as is)
Kevin Cruijssen
fuente
0

Perl - 84

for(0..$ARGV[0]){s/6/x/g;s/9/6/g;s/x/9/g;printf"$_%s\n",$_=~/^[0689]+[689]$/?".":""}
KSFT
fuente
0

Powershell, 111 102 bytes

param($s)$s+'.'*!($s-match'[1-57]|0$|'+-join$(switch -r($s[($s.Length-1)..0]){'0|8'{$_}'6'{9}'9'{6}}))

Script de prueba explicado:

$f = {

param($s)           # input string
$l=$s.Length        # length of the string
$c=$s[($l-1)..0]    # chars of the string in the reversed order
$d=switch -r($c){   # do switch with regex cases for each char
    '0|8'{$_}       # returns the current char if it equal to 8 or 0
    '6'{9}          # returns 9 if the current char is 6
    '9'{6}          # returns 6 if the current char is 9
}                   # returns array of new chars (contains 0,6,8,9 only)
$s+'.'*!(            # returns s. Add '.' if not...
    $s-match'[1-57]|0$|'+-join$d
                    # $s contains chars 1,2,3,4,5,7 or
                    # ends with 0 or
                    # equal to string of $d
)

}

@(
    ,('2'    ,'2'   )
    ,('4'    ,'4'   )
    ,('5'    ,'5'   )
    ,('6.'   ,'6'   )
    ,('7'    ,'7'   )
    ,('9.'   ,'9'   )
    ,('16'   ,'16'  )
    ,('60'   ,'60'  )
    ,('66.'  ,'66'  )
    ,('68.'  ,'68'  )
    ,('69'   ,'69'  )
    ,('906'  ,'906' )
    ,('909.' ,'909' )
    ,('8088.','8088')
    ,('9806.','9806')
    ,('9886' ,'9886')
    ,('9889.','9889')
) | % {
    $e,$s = $_
    $r = &$f $s
    "$($r-in$e): $r"
}

Salida:

True: 2
True: 4
True: 5
True: 6.
True: 7
True: 9.
True: 16
True: 60
True: 66.
True: 68.
True: 69
True: 906
True: 909.
True: 8088.
True: 9806.
True: 9886
True: 9889.
mazzy
fuente
0

Stax , 27 bytes

Ç▒≈♣▌╬"÷╜─B↓«âpø←╚S☼ì>♫è;&╛

Ejecutar y depurarlo

Desempaquetado, sin golf y comentado, se ve así.

0p      print 0 with no line break
F       for each [1 .. n] execute the rest of the program, where n is the input
  zP    print a newline
  q     peek and print the iterating variable without newline
  A%!C  modulo 10, and cancel iteration if zero (this cancels for multiples of 10)
  _$cc  convert iterating value to string and duplicate it twice on the stack
  7R6-$ construct the string "123457"
  |&C   if the character intersection is truthy, cancel the iteration
  r     reverse string
  69$:t map 6 and 9 characters to each other
  =C    if this rotated string is equal to the original, cancel iteration
        print "." with no newline 
        (this comment precedes the instruction because it's an unterminated literal)
  ".

Ejecute este

recursivo
fuente