Роздрукувати номери, захищені від обертання


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.?
червоний-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

@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в Input.
Мартін Ендер

на введенні 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 substituVFI, що робить те саме в цьому випадку, виконує та повертає номер, задавши рядок.


Виглядає неправильно: у 60, 69, 90 та 96 не повинно бути крапок.
ngn

Дякую @ngn, я виправив це, я думаю, він працює зараз правильно.
Моріс Зукка

2
Молодці :) Замість ⊃,/або ,/ви можете використовувати фронт спереду.
ngn

Авжеж! Я зазвичай не працюю в ml1, тому я забуваю про ∊.
Моріс Зукка


4

Пітон 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:)

Розширено:

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

Дивіться, я думаю, що цього має бути менше, наприклад, ви не винні, що друк належним чином друкується, а не "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? У ній немає 6s або 9s, але при повороті 8088.
El'endia Starman

1
@ El'endiaStarman Дякую велике! Виправляючи подання, я фактично врятував персонажів :)
ProgramFOX

4

М (МУМПС) - 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))- Reverse 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);}}}

Безумовно

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}

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

Створює список Strings від 0до n. Це петлі через них та друкує їх. Він додає крапку, якщо всі умови виконані:

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

2

JavaScript (ES6) 101 104 106 109

Функція з n як аргумент, виведення через console.log
Редагувати за допомогою% 10 для перевірки на провідну реорганізацію 0
Редагування 2 for , мені не потрібно розуміння масиву, після того як усі
Edit 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
Я думаю, ви можете багато заощадити на нових лініях тут.
britishtea

1
@britishtea нові рядки та відступи додаються для читабельності та не враховуються. Це один рядок
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=
}

Тест:

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

1

sed, 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 значення від stdin.

Тест:

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

Недоліковані + кілька приміток:

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

bc, 158

Після того, як зробити це чисто в СЕД , використовуючи всі рядки і регулярні вирази операцій з не рідний арифметики, мені було цікаво подивитися , як це буде виглядати навпаки, тобто все арифметичні і логічні операції , і немає рядка / регулярний вираз:

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, який використовує translate замість заміни, а в історії редагування він також може поєднати ці 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?
КСФТ

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

Я не дуже задоволений регексом, будь-якими ідеями?

Редагувати : Вивчений акуратний трюк з ~і for (... of ...)від @ edc65
Edit2 : Реорганізовані умови
Edit3 : застосовані пропозиції від @ edc65


Поганий учень :) i=n+"";for(c of i)=> for(c of i=n+"")збережіть 2 байти
edc65

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

Ідея про regexp: вам потрібно перевірити на 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

Перл - 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

Стакс , 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.