打印旋转安全数字


29

背景

您正在为某些棋盘游戏制造商工作,需要为某些游戏生产刻有从0到n的数字的木砖。但是,事不宜迟,某些图块将变得难以区分,例如69。为避免这种情况,您必须为可能与其他人(并且只有那些人)混淆的数字配备一个明确的点,例如,您将拥有像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 2014年

3
我认为这将是有益的,包括8088.在你的例子作为旋转不安全的数字,没有一个6或9
El'endia接龙

Answers:


6

-34 38

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

我必须感谢@ Sp3000帮助我删除了4个字节。我最初有一张额外的支票&@JK,以确保数字为6或9,但是在张贴之前仔细阅读答案之后,我阅读了他的答案,并注意到我相同的译文和译文已经解决了这个问题。

也感谢@isaacg指出字符串是可迭代的,您可以对它们使用set操作。也用于制作当前代码;)

说明:

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

我认为您不需要为KJ使用整数列表-只需使用字符串即可。切换K到<backtick> 69和J<backtick> N可以节省一些字符,内联K到结果程序中也是如此。使用该技术VhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689,我能得到的最短结果是34个字符。(两个反引号实际上是一个。)
isaacg 2014年

@isaacg谢谢小费!我认为出于某种原因,我忘记了使用`来构成一串数字的确很短。无论如何,您可以通过使用\转义来编写带有反引号的代码块。例如:hell`o wo`rld
FryAmTheEggman 2014年

在说明中,您似乎在_之前有一个多余的部分`96
isaacg 2014年

@isaacg谢谢您,修正了
FryAmTheEggman 2014年

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 2014年

@DavidCarraher将代码放在“代码”和n“输入” 中。
Martin Ender 2014年

输入98,您的程序在66旁边放置一个点,这是不正确的。
Sparr 2014年

3
@Sparr您应该等待OP回答您的问题,然后说答案无效。他的说法:“以下数字中的每个数字都必须以这种方式打印”似乎与您的解释相矛盾。
FryAmTheEggman 2014年

我喜欢CJam解释的美妙之处。
nyuszika7h 2014年


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尝试

请注意,在在线解释器中,⍎函数不起作用,因此我不得不用2⊃⎕VFI代替它,在这种情况下,它执行相同的操作,执行并返回数字(给定字符串)。


看起来不对:60、69、90和96不能有点。
ngn 2014年

感谢@ngn,我更正了它,我认为它现在可以正常工作。
莫里斯·祖卡

2
做得好:)代替⊃,/,/您可以在前面使用。
ngn 2014年

啊对!我通常不在ml1中工作,所以我忘了∊。
莫里斯·祖卡


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

展开:

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#,343309个字符

太漫长,但无论如何:

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

它是如何工作的?要在数字上添加句点,它必须符合以下要求:

  • 只包括0869
  • 不以零结尾。
  • 旋转数字时不相同:
    • 如果一个数字的6s和9s 相等,并且
    • 如果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
我的回答是更长的时间;)我似乎在打高尔夫球。
Digital Trauma 2014年

1
8808呢?它没有任何6s或9s,但旋转时为8088。
El'endia Starman 2014年

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-从零到循环ni每次增加1。(该行的其余部分构成了循环的主体。)

WRITE !,i-打印换行符,后跟的值i

SET r=$TRANSLATE($REVERSE(i),69,96))-反转i,将9换成6,将6换成9,然后将其存储在中r

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

  • :-表示后置条件表达式,因此WRITE仅在r=+r*r'=i*'$TRANSLATE(i,0689)评估为真值时才执行命令。
  • r=+r-检查r是否没有前导零。一元运算+符将字符串转换为数字,如果有的话,该数字会去除前导零。
  • *-乘法运算符。M没有操作顺序;将按从左到右的顺序评估所有二进制运算符。
  • 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#205209

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}

输入来自命令行。

生成的列表,String从s 0n。它循环通过它们并打印它们。如果满足所有条件,它将附加一个点:

  • 反转数字并将6s 替换为s 9不会产生原始
  • 数只由数字0689
  • 这个数字不以 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知道这一点。
瑕疵的

1
我认为您可以在这里节省很多换行符。
britishtea 2014年

1
@britishtea换行符和缩进增加了可读性,不计在内。这是一条单行
edc65 2014年


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

根据OP,排序无关紧要,因此我们从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

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

取消高尔夫+一些注释:

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 2014年

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 2015年

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

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

同样,通常可以使用Regexp.test(String)代替String.match(Regexp)(短1个字节)。
edc65 2014年

总共有6个字节,谢谢:) for(c of i=n+"")当我看到它的时候是很合逻辑的,但是我没有想到。 c-6?B:A上帝保佑我曾经把这个投入生产代码
zabalajka

关于正则表达式的想法:您需要检查1个无效字符,而不是1个或更多矿石,因此不需要'+'。如果您在console.log表达式中摆弄可以节省8个字节...但是我想您的答案会太短
edc65

1

05AB1E38 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,111102字节

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

运行这个

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.