Imprimir números seguros para rotação

29

fundo

Você está trabalhando para algum fabricante de jogos de tabuleiro e precisa produzir ladrilhos de madeira com os números de 0 a n gravados neles para algum jogo. No entanto, sem mais delongas, alguns ladrilhos se tornariam indistinguíveis, por exemplo, 6e 9. Para evitar isso, você deve equipar números que possam ser confundidos com outros (e somente aqueles) com um ponto não ambíguo; por exemplo, você teria peças como 9.ou 6089..

Infelizmente, é necessário usar um dispositivo de gravação em madeira antigo e programável para isso, cuja interface é tão quebrada que é necessário codificar todos os caracteres do programa manualmente, em um processo indescritivelmente tedioso. Felizmente, o dispositivo entende todas as linguagens de programação existentes. Assim, você está procurando o programa mais curto que imprime esses ladrilhos.

Tarefa real

Escreva o programa mais curto que:

  • Toma um número inteiro positivo n como entrada. Você decide como a entrada é lida.
  • Imprime cada um dos números de 0 a n (0 e n incluso) exatamente uma vez na ordem de sua escolha, separados por um único caractere de espaço em branco (incluindo nova linha). Os números devem ser impressos sem zeros à esquerda.
  • Anexa um ponto (.) A cada número que se transforma em outro número válido após a rotação por π (180 °), mesmo que esse número seja maior que n. O 0 e 8 do seu tipo de letra são simétricos à rotação e o 9 é um 6. girado 6. Os 2 e 5 são distintos após a rotação; o 1 não é simétrico à rotação. Números com zeros à esquerda não são válidos.

Exemplos

Cada um dos seguintes números deve ser impresso exatamente desta maneira:

  • 2
  • 4
  • 5
  • 6.
  • 8
  • 9.
  • 16
  • 60
  • 66.
  • 68.
  • 69
  • 906
  • 909.
  • 8088.
  • 9806.
  • 9886
  • 9889.
Wrzlprmft
fonte
Não deveria 60ser 60.?
red-X
2
@ red-X "Números com zeros à esquerda não são válidos."
SP3000
2
@ racionalisation: Existe uma brecha padrão para isso. (Além disso, isso não faria sentido tematicamente, pois você precisa ensinar essa máquina a esse idioma.) De qualquer forma, adicionei um já existente.
Wrzlprmft
2
@rationalis O que geralmente acontece é que apenas as versões em idiomas existentes antes da publicação do desafio são elegíveis para o programa vencedor. As versões feitas depois ainda podem ser postadas por diversão, mas devem especificar em suas postagens que não estão competindo. Portanto, sim, você pode definir um idioma, mas ele não é elegível e provavelmente não será bem recebido devido a ser uma brecha padrão (como acima).
Sp3000
3
Eu acho que seria útil incluir 8088.em seus exemplos como um número de rotação-inseguro que não tem um 6 ou 9.
El'endia Starman

Respostas:

6

Pitão - 34 38

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

Devo agradecer ao @ Sp3000 por me ajudar a remover 4 bytes. Originalmente, eu tinha uma verificação adicional &@JKque assegurava que houvesse 6 ou 9 no número, mas depois de ler as respostas antes de postar, li a resposta e notei que minha tradução e reversão idênticas já cuidavam disso.

Agradeço também ao @isaacg por apontar que as strings são iteráveis, e você pode usar operações definidas nelas. Também para criar o código atual;)

Explicação:

                                    : (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
fonte
Eu não acho que você precisa usar listas de números inteiros para Ke J- cordas Basta usar em seu lugar. Mudar Kpara <backtick> 69 e J<backtick> N salva alguns caracteres, assim como inlining Kno programa resultante. O menor que eu pude usar nessa técnica foi VhQJ``N+J*\.&nJX_J``69``96&eN!-J"068934 caracteres. (Dois backticks são realmente um.)
isaacg
@isaacg Obrigado pela dica! Eu acho que por alguma razão eu esqueci que fazer uma série de números era realmente muito curto usando `. De qualquer forma, você pode escrever um bloco de código com reticências, escapando-os com \. Por exemplo:hell`o wo`rld
FryAmTheEggman
Na explicação, você parece ter um extra _antes do `96.
Isaacg
@isaacg Obrigado, corrigido
FryAmTheEggman
10

CJam, 46 44 43 42 bytes

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

Eu acho que há espaço para melhorias.

Teste aqui.

Explicação

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
fonte
O que isso retorna quando a entrada é 8? (Colei o código na entrada e, em seguida, cliquei no botão Executar, mas um erro foi chamado.) #
187
@DavidCarraher colocou o código em "Código" e nem Entrada.
Martin Ender
Na entrada 98, seu programa coloca um ponto próximo a 66, o que está incorreto.
Sparr
3
@Sparr Você deve esperar o OP responder sua pergunta antes de dizer que uma resposta é inválida. Sua afirmação: "Cada um dos seguintes números deve ser impresso exatamente dessa maneira" parece contradizer sua interpretação.
FryAmTheEggman
Eu gosto da beleza das explicações do CJam.
nyuszika7h
8

CJam, 46 45 43 42 bytes

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

Eu acho que pode ser jogado um pouco mais.

Toma nde STDIN.

Experimente online aqui

Optimizer
fonte
5

APL 66

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

Explicação:

¨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 

Experimente em tryapl.org

Observe que no intérprete online a função doesn't não funciona, então eu tive que substituí-lo por 2⊃⎕VFI, que faz o mesmo nesse caso, executa e retorna o número, dada uma string.

Moris Zucca
fonte
Parece errado: 60, 69, 90 e 96 não devem ter pontos.
NGN
Obrigado @ngn, eu o corrigi, acho que funciona corretamente agora.
Moris Zucca
2
Bem feito :) Em vez de ⊃,/ou ,/você pode usar um na frente.
NGN
Oh, certo! Normalmente não trabalho no ml1, então esqueço o ∊.
Moris Zucca
4

Perl 5, 53 bytes

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

Demonstração online.

Usa o sayrecurso Perl 5.10+ , portanto, ele deve ser executado com perl -M5.010(ou perl -E) para ativá-lo. (Consulte este meta thread. ) Lê a entrada de stdin, imprime em stdout.

Ilmari Karonen
fonte
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 uma função fque imprime os números em STDOUT, em ordem crescente.

Desta vez, pensei em tirar uma folha do livro de @ feersum com .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

Solução anterior:

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)

Obrigado a @xnor por me mostrar o .replacetruque há algum tempo.

Sp3000
fonte
Você pode usar em (u''+S[::-1])vez de unicode(S[::-1]). Além disso, se você trocar a printchamada e a recursiva, os números serão exibidos em ordem crescente.
NGN
@ngn Ah, obrigado, eu não acho u""+que funcionaria realmente #
Sp3000 30/12/14
Veja, eu acho que isso deve ser menor, por exemplo, não é sua culpa que print é corretamente impressa, não "p", mas se você escrever "p = print" e não tiver contagem como bytes no seu envio "oficial", reduziria isso!
Alec Teal
4

C #, 343 309 caracteres

Muito tempo, mas de qualquer maneira:

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 adicionar um período ao número, ele deve corresponder aos seguintes requisitos:

  • Consiste apenas 0, 8, 6e 9.
  • Não termina com zero.
  • Não é o mesmo número quando você o gira:
    • Se um número tem uma quantidade igual de 6s e 9s, e
    • if c= o número com todos os 6s substitui com 9s,
    • e invertido c== c,
    • então: o número girado é o mesmo que o próprio número.

Os números são separados por um espaço.

Código com recuo:

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
fonte
11
Minha resposta é mais longa;) Pareço estar jogando boliche no campo de golfe.
Digital Trauma
11
E o 8808? Não possui 6 ou 9, mas é 8088 quando girado.
El'endia Starman 31/12/14
11
@ El'endiaStarman Muito obrigado! Enquanto corrigia meu envio, na verdade eu salvei 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) "."

A maioria dos comandos e funções internos do M possui versões abreviadas. Eu usei os nomes completos abaixo.

READ n- Leia uma string do teclado e guarde-a n.

FOR i=0:1:n- Faça um loop de zero a n, incrementando i1 a cada vez. (O restante da linha constitui o corpo do loop.)

WRITE !,i- Imprima uma nova linha seguida pelo valor de i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Inverta i, substitua noves por seis e seis por noves e armazene-o em r.

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

  • :- Denota uma expressão pós-condicional, portanto, o WRITEcomando é executado apenas se for r=+r*r'=i*'$TRANSLATE(i,0689)avaliado como um valor verdadeiro.
  • r=+r- Verifique rse não tem um zero inicial. O +operador unário converte uma string em um número, que remove os zeros à esquerda, se houver algum.
  • *- Operador de multiplicação. M não tem ordem de operações; todos os operadores binários são avaliados na ordem em que aparecem da esquerda para a direita.
  • r'=i- Verifique ise não é o mesmo que a versão invertida r.
  • '$TRANSLATE(i,0689)- Remova todos os zeros, seis, oito e nove de ie verifique se não há mais nada. ( 'é o operador de negação lógica.)
  • "."- Finalmente o argumento para o WRITEcomando (uma string literal).

Edit: Tornou um pouco mais curto abusando do operador de multiplicação. Versão anterior:

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
fonte
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
fonte
3

C # 205 209

C # não precisa ser tão longo ...
mais ou menos, uma porta da minha resposta 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);}}}

Ungolfed

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
fonte
2

Ruby, 81

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

A entrada é retirada da linha de comando.

Gera uma lista de Strings de 0para n. Ele passa por eles e os imprime. Acrescenta um ponto se todas as condições forem atendidas:

  • inverter o número e substituir 6s por 9s não produz o original
  • o número consiste apenas dos dígitos 0, 6, 8e9
  • o número não termina com 0
britishtea
fonte
2

JavaScript (ES6) 101 104 106 109

Uma função com n como argumento, saída via console.log
Edite usando% 10 para testar a reorganização inicial 0
Edit 2 for , não preciso da compreensão do array, afinal o
Edit 3 modificou (novamente) a verificação da entrada 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
}

Ungolfed e mais fácil de testar

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)

Saída

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
fonte
Existe um nome para a construção com o loop for entre colchetes []? Estou procurando uma documentação, porque só sabia disso em python até agora.
flawr
11
Eu acho que você pode economizar muito em novas linhas aqui.
britishtea
11
As novas linhas e o recuo do @britishtea foram adicionados para facilitar a leitura e não contar. É uma linha única
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=
}

Teste:

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

sed, 467

Mais longo que C # ...

Eu praticamente concluí isso quando @ edc65 apontou que as respostas precisam processar os números 0-n e não apenas n. A adição do código sed ao incremento de 0-n adiciona muito mais código, pois essa tarefa não é adequada para sed aritmético e menos.

: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

De acordo com o OP, o pedido não importa, então trabalhamos para baixo de n a 0.

Saída:

$ sed -rnf rotproof.sed <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Trauma Digital
fonte
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"."}}

Leia o valor n de stdin.

Teste:

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

LeFauve
fonte
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 + algumas anotações:

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
fonte
1

bc, 158

Depois de fazer isso puramente no sed usando todas as operações de string e regex sem aritmética nativa, fiquei curioso para ver como isso seria o contrário, ou seja, todas as operações aritméticas e lógicas e sem string / regex:

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"}

A saída é classificada em ordem decrescente.

Saída:

$ bc rotproof.bc <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Trauma Digital
fonte
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
fonte
+1. Com boa aparência ... Se você quiser aprender alguns truques para reduzi-lo, há outra resposta no python 2, que usa a conversão em vez de substituir, e no histórico de edição, ele também tem uma maneira de combinar essas três substituições em uma que pode vir útil para futuras perguntas ...
trichoplax
2
Bom progresso! Além do acima aqui está mais alguns campos de golfe: "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(que é realmente apenas eval(raw_input()))
SP3000
Alguns campos de golfe: (1) No Python 2, você pode substituir str(i)por `i`. (2) Você usa aapenas uma vez; portanto, por que atribuí-lo a uma variável.
precisa saber é o seguinte
Vou usar sua segunda sugestão, mas uso str(i)várias vezes. Qual deles posso substituir i?
KSFT
11
Não i, mas icom backticks, que é sinônimo de repr(i). Você pode usá-lo em vez de em str(i)qualquer lugar, embora se você tiver str(i)muitas vezes, pode ser mais curto atribuí-lo a uma variável e usá-lo, além de usar backticks. (ie x=`i`; (do stuff with x))
Sp3000 01/01
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.

Ou versão legível:

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
    )}}

Eu não estou muito feliz com o regex, alguma idéia?

Edit : Aprendeu truque com ~e for (... of ...)com @ edc65
Edit2 : Condições reorganizadas
Edit3 : sugestões aplicadas por @ edc65

zabalajka
fonte
Má pupila :) i=n+"";for(c of i)=> for(c of i=n+"")salvar 2 bytes #
edc65
... e c==6?A:B=> c!=6=>B:A=>c-6?B:A
edc65
Além disso, geralmente Regexp.test (String) pode ser usado em vez de String.match (Regexp), 1 byte menor.
edc65
6 bytes é total, obrigado :) for(c of i=n+"")é bastante lógico quando o vejo, mas eu não pensaria nisso. c-6?B:ADeus me livre que eu já colocar isso em código de produção
zabalajka
Ideia sobre o regexp: você precisa verificar se há 1 caractere inválido, e não 1 ou mais, para que '+' não seja necessário. Se você mexer com a expressão console.log, poderá salvar 8 bytes ... seria muito curto
edc65
1

05AB1E , 38 37 30 29 bytes

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

Experimente online.

Explicação:

Ý                # 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)

Explicação adicional para algumas 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
fonte
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
fonte
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 teste 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"
}

Saída:

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.
confuso
fonte
0

Stax , 27 bytes

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

Execute e depure

Descompactado, não destruído e comentado, parece com isso.

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)
  ".

Execute este

recursivo
fonte