Распечатайте безопасные числа вращения


29

Задний план

Вы работаете на какого-то производителя настольных игр и вам нужно изготовить деревянные плитки с выгравированными на них числами от 0 до n . Однако без дальнейших церемоний некоторые плитки станут неразличимыми, например, 6и 9. Чтобы избежать этого, вы должны снабдить числа, которые могут быть перепутаны с другими (и только теми), точками с неоднозначными значениями, например, у вас будут плитки типа 9.или 6089..

К сожалению, для этого вам нужно использовать какое-то старое, но программируемое устройство для гравировки на дереве, интерфейс которого настолько сломан, что вам приходится кодировать каждый символ программы вручную в невероятно утомительном процессе. К счастью, устройство понимает все существующие языки программирования. Таким образом, вы ищете самую короткую программу, которая печатает такие плитки.

Актуальное задание

Напишите самую короткую программу, которая:

  • Принимает положительное целое число n в качестве входных данных. Как читать ввод, зависит от вас.
  • Печатает каждое из чисел от 0 до n ( включая 0 и n ) ровно один раз в выбранном вами порядке, разделенных одним пробелом (включая символ новой строки). Числа должны быть напечатаны без начальных нулей.
  • Добавляет точку (.) К каждому числу, которое превращается в другое действительное число при повороте на π (180 °), даже если это число больше n. 0 и 8 вашей гарнитуры симметричны по отношению к вращению, а 9 - повернутые 6. 2 и 5 различаются при вращении; 1 не является вращательно-симметричным. Числа с ведущими нулями не действительны.

Примеры

Каждый из следующих номеров должен быть напечатан именно так:

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

Не должно 60быть 60.?
red-X

2
@ red-X "Числа с ведущими нулями недействительны."
Sp3000

2
@rationalis: для этого есть стандартная лазейка . (Кроме того, это не имеет смысла тематически, поскольку вы должны учить эту машину этому языку.) В любом случае, я добавил существующий.
Wrzlprmft

2
@rationalis Что обычно происходит, так это то, что только языковые версии, существовавшие до подачи заявки, имеют право на участие в программе-победителе. Версии, сделанные после, могут публиковаться для развлечения, но в их сообщении следует указать, что они не борются. Так что да, вы можете определить такой язык, но он будет неприемлемым и, скорее всего, не будет хорошо принят из-за того, что является стандартной лазейкой (как указано выше).
Sp3000

3
Я думаю, что было бы полезно включить 8088.в ваши примеры в качестве числа, небезопасного для поворота, которое не имеет 6 или 9.
El'endia Starman

Ответы:


6

Пиф - 34 38

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

Я должен поблагодарить @ Sp3000 за помощь в удалении 4 байтов. Первоначально у меня была дополнительная проверка, &@JKкоторая проверяла число 6 или 9, но после просмотра ответов перед публикацией я прочитал его ответ и заметил, что мой идентичный перевод и обращение уже позаботились об этом.

Также спасибо @isaacg за указание, что строки являются итеративными, и вы можете использовать над ними операции над множествами. Также для создания текущего кода;)

Объяснение:

                                    : (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"))

Я не думаю , что вам нужно использовать списки целых чисел для Kи J- строки просто используйте вместо этого. Переключение Kна <backtick> 69 и Jна <backtick> N сохраняет несколько символов, как и вставка Kв результирующей программе. Самое короткое, что я мог получить под эту технику, было VhQJ``N+J*\.&nJX_J``69``96&eN!-J"068934 символа. (Два кавычки действительно один.)
isaacg

@isaacg Спасибо за совет! Я думаю, по какой-то причине я забыл, что создание строки чисел было действительно коротким в pyth с использованием `. В любом случае, вы можете написать блок кода с обратными галочками, экранируя их с помощью \. Например:hell`o wo`rld
FryAmTheEggman

В объяснении у вас, кажется, есть лишнее _, перед `96.
Исаак

@isaacg Спасибо, исправлено
FryAmTheEggman

10

CJam, 46 44 43 42 байта

l~),{_A%g1$s_6890s-!\_69s_W%erW%=!&&'.*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.";

Что это возвращает, когда на входе 8? (Я вставил код в Input и затем нажал на кнопку Run, но была вызвана ошибка.)
DavidC

@DavidCarraher поместил код в «Код» и nво Ввод.
Мартин Эндер

На входе 98 ваша программа ставит точку рядом с 66, что неверно.
Спарр

3
@Sparr Вам следует подождать, пока ОП ответит на ваш вопрос, прежде чем сказать, что ответ недействителен. Его утверждение: «Каждое из следующих чисел должно быть напечатано именно таким образом», кажется, противоречит вашей интерпретации.
FryAmTheEggman

Мне нравится красота объяснений CJam.
nyuszika7h


5

APL 66

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

Объяснение:

¨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 

Попробуйте это на tryapl.org

Обратите внимание, что в онлайн-интерпретаторе функция doesn't не работает, поэтому мне пришлось заменить ее на 2⊃⎕VFI, которая делает то же самое в этом случае, выполняет и возвращает число с заданной строкой.


Выглядит неправильно: 60, 69, 90 и 96 не должны иметь точек.
ngn

Спасибо @ngn, я исправил это, я думаю, что теперь он работает правильно.
Морис Зукка,

2
Хорошо сделано :) Вместо ⊃,/или ,/вы можете использовать на передней панели.
ngn

О верно! Я обычно не работаю в мл1, поэтому я забываю о ∊.
Морис Цукка


4

Python 2, 130 116 113 байтов

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

Определяет функцию, fкоторая печатает числа в STDOUT в порядке возрастания.

На этот раз я решил взять листок из книги @ feersum с .translate:)

Expanded:

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

Предыдущее решение:

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)

Спасибо @xnor за то, что показали мне .replaceтрюк некоторое время назад.


Вы можете использовать (u''+S[::-1])вместо unicode(S[::-1]). Кроме того, если вы поменяете местами printрекурсивный вызов, номера будут появляться в порядке возрастания.
ngn

@ngn Ах, спасибо, я не думал, что u""+это действительно сработает
Sp3000

Понимаете, я думаю, что это должно быть меньше, например, вы не виноваты в том, что print по праву печатает, а не в «p», скажем, но если вы должны были написать «p = print» и не иметь количество байтов в вашем «официальном» представлении сократил бы это!
Алек Тил

4

C #, 343 309 символов

Путь слишком долго, но в любом случае:

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)?". ":" "));}}}}

Как это работает? Чтобы добавить точку к номеру, он должен соответствовать следующим требованиям:

  • Состоит только из 0, 8, 6и 9.
  • Не заканчивается на ноль.
  • Не тот же номер, когда вы вращаете его:
    • Если число имеет одинаковое количество 6s и 9s, и
    • if c= число со всеми 6s заменяется на 9s,
    • и наоборот c== c,
    • затем: повернутое число совпадает с самим числом.

Числа разделены пробелом.

Код с отступом:

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) ? ". " : " "));
            }
        }
    }
}

1
Мой ответ длиннее;) Я, кажется, боулинг на поле для гольфа.
Цифровая травма

1
Как насчет 8808? У него нет 6 или 9, но 8088 при вращении.
El'endia Starman

1
@ El'endiaStarman Большое спасибо! Исправляя свое представление, я на самом деле сохранил символы :)
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) "."

Большинство встроенных команд и функций в M имеют сокращенные версии. Я использовал полные имена ниже.

READ n- Считайте строку с клавиатуры и сохраните ее n.

FOR i=0:1:n- Цикл от нуля до n, увеличиваясь iна 1 каждый раз. (Остальная часть строки составляет тело цикла.)

WRITE !,i- Распечатайте новую строку с последующим значением i.

SET r=$TRANSLATE($REVERSE(i),69,96))- В обратном порядке iзамените девятки на шестерки, а шестерки на девятки и сохраните их в r.

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

  • :- Обозначает постусловное выражение, поэтому WRITEкоманда выполняется только в том случае, если r=+r*r'=i*'$TRANSLATE(i,0689)значение равно истинному.
  • r=+r- Проверьте, что rнет начального нуля. Унарный +оператор преобразует строку в число, которое удаляет начальные нули, если они есть.
  • *- Оператор умножения. М не имеет порядка операций; все бинарные операторы оцениваются в порядке их появления слева направо.
  • r'=i- Проверьте, что iэто не то же самое, что перевернутая версия r.
  • '$TRANSLATE(i,0689)- Уберите все нули, шестерки, восьмерки и девятки iи убедитесь, что ничего не осталось. ( 'является оператором логического отрицания.)
  • "."- Наконец, аргумент WRITEкоманды (буквальная строка).

Изменить: Сделано это немного короче, злоупотребляя оператором умножения. Предыдущая версия:

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

3

APL, 53 символа

∊{⍵,'. '↓⍨∨/(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

3

C # 205 209

C # не должен быть таким длинным ...
более или менее, порт моего ответа 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);
        }
    }
}

2

Руби, 81

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

Ввод берется из командной строки.

Создает список Stringс от 0до n. Он проходит через них и печатает их. Он добавляет точку, если выполнены все условия:

  • перестановка числа и замена 6s на 9s не дает оригинала
  • номер состоит только из цифр 0, 6, 8и9
  • число не заканчивается 0

2

JavaScript (ES6) 101 104 106 109

Функция с n в качестве аргумента, вывод через console.log
Редактирование с использованием% 10 для проверки на лидерство 0
Редактирование 2 for реорганизация, мне не нужно понимание массива после того, как все
Редактирование 3 изменило (снова) проверку на лидерство 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
}

Разряженный и легче тестировать

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)

Выход

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

Есть ли название для конструкции с циклом for в скобках []? Я ищу документацию, потому что я знал об этом только по Python.
flawr

1
Я думаю, что вы можете сэкономить много на новых строках здесь.
Британцы

1
@britishtea Новые строки и отступы добавлены для удобства чтения и не учитываются. Это одна строка
edc65


1

Баш + coreutils, 105

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

Тест:

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

1

Сед, 467

Дольше чем C # ...

Я почти закончил это, когда @ edc65 указал, что ответы должны обрабатывать числа 0-n, а не только n. Добавление кода sed к приращению 0-n добавляет намного больше кода, поскольку эта задача плохо подходит для sed без арифметики.

: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

В соответствии с ОП, порядок не имеет значения, поэтому мы работаем в направлении вниз от n до 0.

Выход:

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

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

Прочитайте значение n из стандартного ввода.

Тест:

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


1

Реболь - 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 + некоторые аннотации:

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 {}
    ]
]

1

до н.э., 158

После того, как я сделал это чисто в sed, используя все операции с строками и регулярными выражениями без собственной арифметики, мне было любопытно посмотреть, как это будет выглядеть наоборот, то есть все арифметические и логические операции и отсутствие строки / регулярного выражения:

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

Вывод сортируется в порядке убывания.

Выход:

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

1

Питон - 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])

+1. Выглядит хорошо ... Если вы хотите научиться некоторым трюкам, чтобы сделать его короче, в python 2 есть другой ответ, который использует перевод вместо замены, а в истории редактирования также есть способ объединения этих 3 замен в 1, что может произойти пригодится для будущих вопросов ...
trichoplax

2
Хороший прогресс! В дополнение к вышесказанному , вот еще несколько гольфы: "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(что на самом деле просто eval(raw_input()))
Sp3000

Некоторые гольфы: (1) В Python 2 вы можете заменить str(i)на `i`. (2) Вы используете aтолько один раз, так зачем назначать его переменной.
Wrzlprmft

Я буду использовать ваше второе предложение, но я использую str(i)несколько раз. Какой я могу заменить i?
KSFT

1
Нет i, но iс кавычками, что является синонимом repr(i). Вы можете использовать его вместо str(i)повсеместного использования, хотя, если у вас есть str(i)такое количество раз, может быть короче присвоить его переменной и использовать его в дополнение к обратным галочкам. (т.е. 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.

Или читаемая версия:

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

Я не очень доволен регулярным выражением, какие-нибудь идеи?

Edit : Узнал ловкий трюк с ~и for (... of ...)от @ edc65
Edit2 : Реорганизованные условия
Edit3 : прикладные предложения по @ edc65


Плохой ученик :) i=n+"";for(c of i)=> for(c of i=n+"")сохранить 2 байта
edc65

... and c==6?A:B=> c!=6=>B:A=>c-6?B:A
edc65

кроме того, обычно Regexp.test (String) может использоваться вместо String.match (Regexp), на 1 байт короче.
edc65

Всего 6 байт, спасибо :) for(c of i=n+""), когда я это вижу, это вполне логично, но я бы об этом не подумал. c-6?B:AНе дай бог, я когда-нибудь поместил это в производственный код
zabalajka

Идея о регулярном выражении: вам нужно проверить 1 недопустимый символ, а не 1 или более, поэтому «+» не требуется. Если вы возитесь с выражением console.log, вы можете сэкономить 8 байт ... но тогда я думаю, что ваш ответ было бы слишком коротко
edc65

1

05AB1E , 38 37 30 29 байт

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

Попробуйте онлайн.

Объяснение:

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

Дополнительное объяснение для некоторых частей:

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)

0

Perl - 84

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

0

Powershell, 111 102 байта

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

Пояснил тестовый скрипт:

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

Выход:

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.

0

Stax , 27 байт

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

Запустите и отладьте его

Распакованный, размазанный и прокомментированный, это выглядит так.

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

Запустите этот

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.