In số quay an toàn


29

Lý lịch

Bạn đang làm việc cho một số nhà sản xuất trò chơi bảng và cần sản xuất gạch gỗ với các số từ 0 đến n được khắc trên chúng cho một số trò chơi. Tuy nhiên, không cần phải quảng cáo thêm, một số gạch sẽ trở nên không thể phân biệt được, ví dụ, 69. Để tránh điều này, bạn phải trang bị những con số có thể bị nhầm lẫn với những người khác (và chỉ những số đó) với một dấu chấm rõ ràng, ví dụ: bạn sẽ có các ô như 9.hoặc 6089..

Thật không may, bạn cần phải sử dụng một số thiết bị khắc gỗ cũ nhưng có thể lập trình cho việc này, giao diện bị hỏng đến mức bạn phải mã hóa mọi ký tự của chương trình bằng tay trong một quy trình vô cùng tẻ nhạt. May mắn là thiết bị hiểu mọi ngôn ngữ lập trình hiện có. Vì vậy, bạn đang tìm kiếm chương trình ngắn nhất in các gạch như vậy.

Nhiệm vụ thực tế

Viết chương trình ngắn nhất mà:

  • Lấy một số nguyên dương n làm đầu vào. Làm thế nào đầu vào được đọc là tùy thuộc vào bạn.
  • In từng số từ 0 đến n ( bao gồm 0 và n ) chính xác một lần theo thứ tự bạn chọn, được phân tách bằng một ký tự khoảng trắng duy nhất (bao gồm cả dòng mới). Các số sẽ được in mà không có số không dẫn đầu.
  • Nối một dấu chấm (.) Cho mỗi số biến thành số khác, số hợp lệ khi quay bằng π (180 °), ngay cả khi số đó lớn hơn n. Kiểu chữ 0 và 8 của bạn là đối xứng xoay và số 9 là xoay 6. Số 2 và 5 khác biệt khi xoay; 1 không đối xứng xoay. Các số có số 0 đứng đầu không hợp lệ.

Ví dụ

Mỗi số sau đây phải được in chính xác theo cách này:

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

Nên không phải là 60được 60.?
đỏ-X

2
@ red-X "Các số có số 0 đứng đầu không hợp lệ."
Sp3000

2
@rationalis: Có một kẽ hở tiêu chuẩn cho việc này. (Ngoài ra, điều này sẽ không có ý nghĩa theo chủ đề, vì bạn phải dạy cho cỗ máy đó ngôn ngữ đó.) Dù sao đi nữa, tôi đã thêm một cái hiện có.
Wrzlprmft

2
@rationalis Điều thường xảy ra là chỉ các phiên bản ngôn ngữ hiện có trước khi đăng thử thách mới đủ điều kiện để trở thành chương trình chiến thắng. Các phiên bản được thực hiện sau đó vẫn có thể đăng cho vui, nhưng nên chỉ định trong bài đăng của họ rằng chúng không gây tranh cãi. Vì vậy, có bạn có thể định nghĩa một ngôn ngữ như vậy, nhưng nó không đủ điều kiện và rất có thể không được đón nhận do là một lỗ hổng tiêu chuẩn (như trên).
Sp3000

3
Tôi nghĩ sẽ rất hữu ích nếu đưa 8088.vào các ví dụ của bạn dưới dạng số không an toàn xoay vòng không có số 6 hoặc số 9.
El'endia Starman

Câu trả lời:


6

Bình - 34 38

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

Tôi phải cảm ơn @ Sp3000 vì đã giúp tôi xóa 4 byte. Ban đầu tôi có một kiểm tra bổ sung &@JKđể chắc chắn có số 6 hoặc 9 trong số đó, nhưng sau khi đọc các câu trả lời trước khi đăng, tôi đọc câu trả lời của anh ấy và nhận thấy rằng bản dịch và đảo ngược giống hệt của tôi đã quan tâm đến điều đó.

Cũng cảm ơn @isaacg vì đã chỉ ra rằng các chuỗi là các lần lặp và bạn có thể sử dụng các thao tác thiết lập trên chúng. Cũng để tạo mã hiện tại;)

Giải trình:

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

Tôi không nghĩ bạn cần sử dụng danh sách các số nguyên cho KJ- chỉ sử dụng chuỗi thay thế. Chuyển Ksang <backtick> 69 và J<backtick> N sẽ lưu một vài ký tự, cũng như nội tuyến Ktrong chương trình kết quả. Ngắn nhất tôi có thể có được theo kỹ thuật đó là VhQJ``N+J*\.&nJX_J``69``96&eN!-J"068934 ký tự. (Hai backticks thực sự là một.)
isaacg

@isaacg Cảm ơn vì tiền boa! Tôi nghĩ vì một số lý do mà tôi quên rằng việc tạo ra một chuỗi số thực sự rất ngắn bằng cách sử dụng `. Dù sao, bạn có thể viết một khối mã với backticks bằng cách thoát chúng bằng \. Ví dụ:hell`o wo`rld
FryAmTheEggman

Trong phần giải thích, bạn dường như có thêm _, trước `96.
isaacg

@isaacg Cảm ơn, đã sửa
FryAmTheEggman

10

CJam, 46 44 43 42 byte

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

Tôi nghĩ rằng có một số phòng để cải thiện.

Kiểm tra nó ở đây.

Giải trình

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

Điều này trở lại khi đầu vào là 8? (Tôi đã dán mã trong Đầu vào và sau đó nhấp vào nút Chạy, nhưng đã xảy ra lỗi.)
DavidC

@DavidCarraher đặt mã vào "Mã" và ntrong Đầu vào.
Martin Ender

đầu vào 98, chương trình của bạn đặt một dấu chấm bên cạnh 66, không chính xác.
Sparr

3
@Sparr Bạn nên đợi OP trả lời câu hỏi của bạn trước khi nói câu trả lời không hợp lệ. Tuyên bố của ông: "Mỗi số sau đây phải được in chính xác theo cách này" dường như mâu thuẫn với cách giải thích của bạn.
FryAmTheEggman

Tôi thích vẻ đẹp của lời giải thích của CJam.
nyuszika7h


5

APL 66

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

Giải trình:

¨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 

Dùng thử trên tryapl.org

Lưu ý rằng trong trình thông dịch trực tuyến, hàm không hoạt động nên tôi phải thay thế nó bằng 2⊃⎕VFI, điều này cũng tương tự trong trường hợp này, thực thi và trả về số, cho một chuỗi.


Có vẻ sai: 60, 69, 90 và 96 không được có dấu chấm.
ngn

Cảm ơn @ngn, tôi đã sửa nó, tôi nghĩ bây giờ nó hoạt động chính xác.
Moris Zucca

2
Làm tốt lắm :) Thay vì ⊃,/hoặc ,/bạn có thể sử dụng một ở phía trước.
ngn

Ô đung rôi! Tôi thường không làm việc trong ml1 vì vậy tôi quên.
Moris Zucca

4

Perl 5, 53 byte

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

Bản demo trực tuyến.

Sử dụng saytính năng Perl 5.10+ , vì vậy cần phải được chạy với perl -M5.010(hoặc perl -E) để kích hoạt tính năng này. (Xem chủ đề meta này. ) Đọc đầu vào từ stdin, in ra thiết bị xuất chuẩn.


4

Python 2, 130 116 113 byte

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

Xác định hàm fin các số thành STDOUT, theo thứ tự tăng dần.

Lần này tôi nghĩ rằng tôi sẽ lấy một chiếc lá ra khỏi cuốn sách của @ frageum với .translate:)

Mở rộng:

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

Giải pháp trước đây:

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)

Cảm ơn @xnor đã chỉ cho tôi .replacethủ thuật một thời gian trước.


Bạn có thể sử dụng (u''+S[::-1])thay vì unicode(S[::-1]). Ngoài ra, nếu bạn trao đổi printcuộc gọi và đệ quy, các số sẽ xuất hiện theo thứ tự tăng dần.
ngn

@ngn À cảm ơn, tôi không nghĩ u""+sẽ thực sự hoạt động
Sp3000

Xem Tôi nghĩ rằng cái này phải nhỏ hơn, ví dụ như lỗi của bạn là in đúng, không phải là "p", nhưng nếu bạn viết "p = print" và không được tính là byte trong bản "chính thức" của bạn rút ngắn lại!
Alec Teal

4

C #, 343 309 ký tự

Con đường quá dài, nhưng dù sao đi nữa:

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

Làm thế nào nó hoạt động? Để thêm một khoảng thời gian cho số, nó phải phù hợp với các yêu cầu sau:

  • Bao gồm duy nhất của 0, 8, 69.
  • Không kết thúc bằng số không.
  • Không phải là cùng một số khi bạn xoay nó:
    • Nếu một số có số 6s và 9s bằng nhau , và
    • if c= số có tất cả 6s thay thế bằng 9s,
    • và đảo ngược c== c,
    • sau đó: số xoay giống như chính số đó.

Các số được phân tách bằng một khoảng trắng.

Mã có thụt lề:

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
Câu trả lời của tôi dài hơn;) Tôi dường như chơi bowling trên sân golf.
Chấn thương kỹ thuật số

1
Thế còn 8808? Nó không có bất kỳ 6s hay 9 nào, nhưng là 8088 khi xoay.
El'endia Starman

1
@ El'endiaStarman Cảm ơn rất nhiều! Trong khi sửa lỗi gửi của tôi, tôi thực sự đã lưu các ký tự :)
Chương trìnhFOX

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

Hầu hết các lệnh và hàm tích hợp trong M đều có phiên bản rút gọn. Tôi đã sử dụng tên đầy đủ dưới đây.

READ n- Đọc một chuỗi từ bàn phím và lưu trữ nó trong n.

FOR i=0:1:n- Lặp lại từ 0 đến 0 n, tăng i1 lần mỗi lần. (Phần còn lại của dòng tạo thành phần thân của vòng lặp.)

WRITE !,i- In một dòng mới theo sau là giá trị của i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Đảo ngược i, thay thế số thập phân bằng số sáu và số sáu bằng số tiền và lưu trữ trong đó r.

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

  • :- Biểu thị một biểu thức hậu điều kiện, vì vậy WRITElệnh chỉ được thực thi nếu r=+r*r'=i*'$TRANSLATE(i,0689)ước tính thành giá trị trung thực.
  • r=+r- Kiểm tra rxem không có số 0 đứng đầu. +Toán tử đơn nguyên chuyển đổi một chuỗi thành một số, loại bỏ các số 0 đứng đầu nếu có.
  • *- Toán tử nhân. M không có thứ tự hoạt động; tất cả các toán tử nhị phân được đánh giá theo thứ tự chúng xuất hiện từ trái sang phải.
  • r'=i- Kiểm tra xem inó không giống với phiên bản lật của nó r.
  • '$TRANSLATE(i,0689)- Loại bỏ tất cả số không, số sáu, số cao và số tiền ivà kiểm tra xem có còn lại gì không. ( 'là toán tử phủ định logic.)
  • "."- Cuối cùng là đối số cho WRITElệnh (một chuỗi ký tự).

Chỉnh sửa: Làm cho nó ngắn hơn một chút bằng cách lạm dụng toán tử nhân. Phiên bản trước:

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 ký tự

∊{⍵,'. '↓⍨∨/(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 # không cần phải quá lâu ...
ít nhiều, một cổng câu trả lời JavaScript của tôi

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

Bị đánh cắp

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

Ruby, 81

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

Đầu vào được lấy từ dòng lệnh.

Tạo một danh sách Strings từ 0đến n. Nó vòng qua máng chúng và in chúng. Nó sẽ thêm một dấu chấm nếu tất cả các điều kiện được thỏa mãn:

  • đảo ngược số lượng và thay thế 6s bằng 9s không mang lại kết quả ban đầu
  • số chỉ bao gồm các chữ số 0, 6, 89
  • con số không kết thúc bằng 0

2

JavaScript (ES6) 101 104 106 109

Một hàm có n là đối số, xuất ra thông qua console.log
Chỉnh sửa bằng cách sử dụng% 10 để kiểm tra sắp xếp lại 0
Chỉnh sửa 2 for , tôi không cần hiểu mảng sau khi tất cả
Chỉnh sửa 3 được sửa đổi (một lần nữa) kiểm tra dẫn 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 và dễ dàng hơn để kiểm tra

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)

Đầu ra

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

Có một tên cho việc xây dựng với vòng lặp for trong ngoặc []không? Tôi đang tìm kiếm một tài liệu, bởi vì tôi chỉ biết điều này từ python cho đến nay.
flawr

1
Tôi nghĩ rằng bạn có thể tiết kiệm rất nhiều trên các dòng mới ở đây.
Anh

1
@britishtea dòng mới và thụt lề được thêm vào để dễ đọc và không được tính. Đó là một dòng duy nhất
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=
}

Kiểm tra:

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

1

sed, 469

Dài hơn C # ...

Tôi đã hoàn thành khá nhiều việc này khi @ edc65 chỉ ra rằng các câu trả lời cần xử lý các số 0-n chứ không chỉ n. Thêm mã sed để tăng 0-n sẽ thêm RẤT NHIỀU mã, vì tác vụ này không phù hợp với sed không có số học.

: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

Theo OP, việc đặt hàng không thành vấn đề, vì vậy chúng tôi làm việc từ n xuống 0.

Đầu ra:

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

1

GIẢI THƯỞNG: 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"."}}

Đọc giá trị n từ stdin.

Kiểm tra:

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


1

Nổi loạn - 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 + một số chú thích:

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

Sau khi thực hiện điều này hoàn toàn trong sed bằng cách sử dụng tất cả các hoạt động chuỗi và regex không có số học riêng, tôi tò mò muốn xem cách này sẽ diễn ra theo cách khác, tức là tất cả các hoạt động số học và logic và không có chuỗi / 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"}

Đầu ra được sắp xếp theo thứ tự giảm dần.

Đầu ra:

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

1

Con trăn - 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. Nhìn tốt ... Nếu bạn muốn tìm hiểu một số thủ thuật để rút ngắn nó, có một câu trả lời khác trong python 2 sử dụng dịch thay vì thay thế, và trong lịch sử chỉnh sửa, nó cũng có cách kết hợp 3 thay thế thành 1 có thể đến có ích cho các câu hỏi trong tương lai ...
trichoplax

2
Tiến triển tốt đẹp! Ngoài những điều trên đây, một số sân golf khác : "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(thực sự chỉ là vậy eval(raw_input()))
Sp3000

Một số golf: (1) Trong Python 2, bạn có thể thay thế str(i)bằng `i`. (2) Bạn achỉ sử dụng một lần, vậy tại sao lại gán nó cho một biến.
Wrzlprmft

Tôi sẽ sử dụng đề xuất thứ hai của bạn, nhưng tôi sử dụng str(i)nhiều lần. Tôi có thể thay thế icái nào?
KSFT

1
Không i, nhưng ivới backticks, đồng nghĩa với repr(i). Bạn có thể sử dụng nó thay vì str(i)ở mọi nơi, mặc dù nếu bạn có str(i)khoảng thời gian đó thì có thể ngắn hơn để gán nó cho một biến và sử dụng nó ngoài việc sử dụng backticks. (tức là 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.

Hoặc phiên bản có thể đọc được:

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

Tôi không hài lòng lắm với regex, có ý kiến ​​gì không?

Chỉnh sửa : học kinh nghiệm lừa gọn gàng với ~for (... of ...)từ @ edc65
Edit2 : Điều kiện Tổ chức lại
Edit3 : áp dụng gợi ý bởi @ edc65


Học sinh xấu :) i=n+"";for(c of i)=> for(c of i=n+"")lưu 2 byte
edc65

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

ngoài ra, thông thường có thể sử dụng Regapi.test (String) thay vì String.match (Regapi), ngắn hơn 1 byte.
edc65

6 byte là tổng cộng, cảm ơn :) for(c of i=n+"")khá logic khi tôi nhìn thấy nó, nhưng tôi sẽ không nghĩ về nó. c-6?B:AChúa cấm tôi từng đưa mã này vào mã sản xuất
zabalajka

Ý tưởng về biểu thức chính quy: bạn cần kiểm tra 1 char không hợp lệ, không cần thêm 1 quặng, vì vậy '+' là không cần thiết. Nếu bạn sử dụng biểu thức console.log, bạn có thể lưu 8 byte ... nhưng sau đó tôi nghĩ câu trả lời của bạn sẽ quá ngắn
edc65

1

05AB1E , 38 37 30 29 byte

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

Hãy thử trực tuyến.

Giải trình:

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

Giải thích thêm cho một số phần:

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 byte

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

Kịch bản kiểm tra giải thích:

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

Đầu ra:

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 byte

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

Chạy và gỡ lỗi nó

Giải nén, không được chỉnh sửa, và nhận xét, nó trông như thế này.

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

Chạy cái này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.