Cetak angka yang aman rotasi

29

Latar Belakang

Anda bekerja untuk beberapa produsen papan permainan dan perlu membuat ubin kayu dengan angka dari 0 hingga n terukir pada mereka untuk beberapa permainan. Namun, tanpa basa-basi lagi, beberapa ubin akan menjadi tidak bisa dibedakan, misalnya, 6dan 9. Untuk menghindari ini, Anda harus melengkapi angka yang dapat dikacaukan dengan orang lain (dan hanya mereka) dengan titik disambiguasi, misalnya, Anda akan memiliki ubin seperti 9.atau 6089..

Sayangnya, Anda perlu menggunakan beberapa perangkat ukiran kayu tua, namun dapat diprogram untuk ini, yang antarmuka sangat rusak sehingga Anda harus menyandikan setiap karakter program dengan tangan dalam proses yang sangat melelahkan. Untungnya perangkat memahami setiap bahasa pemrograman yang ada. Jadi Anda mencari program terpendek yang mencetak ubin seperti itu.

Tugas aktual

Tulis program terpendek yang:

  • Mengambil bilangan bulat positif n sebagai input. Bagaimana input dibaca terserah Anda.
  • Mencetak setiap angka dari 0 hingga n ( termasuk 0 dan n ) tepat sekali dalam urutan pilihan Anda, dipisahkan oleh karakter spasi tunggal (termasuk baris baru). Angka-angka harus dicetak tanpa angka nol di depan.
  • Menambahkan titik (.) Ke setiap angka yang berubah menjadi angka lain yang valid setelah dirotasi oleh π (180 °), bahkan jika angka itu lebih besar dari n. Tipe huruf 0 dan 8 Anda adalah rotasi-simetris dan angka 9 berotasi 6. Angka 2 dan 5 berbeda pada rotasi; 1 bukan rotasi-simetris. Angka dengan nol di depan tidak valid.

Contohnya

Masing-masing angka berikut harus dicetak persis seperti ini:

  • 2
  • 4
  • 5
  • 6.
  • 8
  • 9.
  • 16
  • 60
  • 66.
  • 68.
  • 69
  • 906
  • 909.
  • 8088.
  • 9806.
  • 9886
  • 9889.
Wrzlprmft
sumber
Bukankah 60seharusnya begitu 60.?
red-X
2
@ red-X "Angka dengan nol di depan tidak valid."
Sp3000
2
@ rasionalis: Ada celah standar untuk ini. (Juga, ini tidak masuk akal secara tematis, karena Anda harus mengajarkan mesin itu bahasa itu.) Bagaimanapun, saya menambahkan yang sudah ada.
Wrzlprmft
2
@rasionalis Yang umumnya terjadi adalah bahwa hanya versi bahasa yang ada sebelum memposting tantangan yang memenuhi syarat untuk menjadi program pemenang. Versi yang dibuat setelah itu masih dapat dikirim untuk bersenang-senang, tetapi harus menentukan dalam posting mereka bahwa mereka tidak bersaing. Jadi ya Anda dapat mendefinisikan bahasa seperti itu, tetapi itu tidak akan memenuhi syarat dan kemungkinan besar tidak diterima dengan baik karena menjadi celah standar (seperti di atas).
Sp3000
3
Saya pikir akan sangat membantu untuk memasukkan 8088.dalam contoh Anda sebagai angka rotasi-tidak aman yang tidak memiliki angka 6 atau 9.
El'endia Starman

Jawaban:

6

Pyth - 34 38

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

Saya harus berterima kasih kepada @ Sp3000 karena membantu saya menghapus 4 byte. Saya awalnya memiliki cek tambahan &@JKyang memastikan ada 6 atau 9 dalam jumlah, tetapi setelah membaca jawaban sebelum memposting, saya membaca jawabannya dan memperhatikan bahwa terjemahan dan pembalikan identik saya sudah mengurusnya.

Terima kasih juga kepada @isaacg untuk menunjukkan bahwa string adalah iterables, dan Anda dapat menggunakan operasi yang ditetapkan pada mereka. Juga untuk membuat kode saat ini;)

Penjelasan:

                                    : (implicit) Q=eval(input())
VhQ                                 : for N in range(Q+1):
   J`N                              : J=str(N)
      +J*\.                         : J + "." * ...
           &nJX_J`69`96             : J!=translate(reversed(J),"69","96") and...
                       &eN          : N%10 and...
                          !-J"0689  : not(setwise_difference(J, "0689"))
FryAmTheEggman
sumber
Saya tidak berpikir Anda perlu menggunakan daftar bilangan bulat untuk Kdan J- cukup gunakan string saja. Beralih Kke <backtick> 69 dan Jke <backtick> N menyimpan beberapa karakter, seperti halnya inlining Kdalam program yang dihasilkan. Terpendek yang bisa saya dapatkan di bawah teknik itu adalah VhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689, 34 karakter. (Dua backticks benar-benar satu.)
isaacg
@isaacg Terima kasih atas tipnya! Saya pikir karena alasan tertentu saya lupa bahwa membuat string angka benar-benar pendek dengan menggunakan `. Bagaimanapun, Anda dapat menulis blok kode dengan backticks dengan menghindarinya dengan \. Misalnya:hell`o wo`rld
FryAmTheEggman
Dalam penjelasannya, Anda tampaknya memiliki tambahan _, sebelum `96.
isaacg
@isaacg Terima kasih, sudah diperbaiki
FryAmTheEggman
10

CJam, 46 44 43 42 byte

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

Saya pikir ada beberapa ruang untuk perbaikan.

Uji di sini.

Penjelasan

l~),{_A%g1$s_6890s-!\_69s_W%erW%=!&&'.*N}/
l~                                         "Read an eval input.";
  ),                                       "Get range from 0 to n.";
    {                                   }/ "For each...";
     _                                     "Get a copy of the integer.";
      A%g                                  "Ends with digit other than 0?";
         1$s_                              "Get another copy, convert to string, get a copy.";
             0689s-!                       "Contains rotation-safe digits?";
                    \                      "Swap with other copy.";
                     _                     "Get another copy.";
                      69s_W%er             "Swap 6 and 9.";
                              W%           "Reverse.";
                                =!         "Is different from original?";
                                  &&       "AND all three conditions.";
                                    '.*    "If true, push a period (else, an empty string).";
                                       N   "Push a newline.";
Martin Ender
sumber
Apa yang kembali ketika input 8? (Saya menempelkan kode pada Input dan kemudian mengklik tombol Run, tetapi kesalahan dipanggil.)
DavidC
@ Davidvidarrarr menaruh kode di "Kode" dan ndi Input.
Martin Ender
masukan 98, program Anda meletakkan titik di sebelah 66, yang tidak benar.
Sparr
3
@Parr Anda harus menunggu OP untuk menjawab pertanyaan Anda sebelum mengatakan jawaban tidak valid. Pernyataannya: "Masing-masing angka berikut harus dicetak persis seperti ini" tampaknya bertentangan dengan interpretasi Anda.
FryAmTheEggman
Saya suka keindahan penjelasan CJam.
nyuszika7h
8

CJam, 46 45 43 42 byte

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

Saya pikir itu bisa bermain golf lebih sedikit.

Diambil ndari STDIN.

Cobalah online di sini

Pengoptimal
sumber
5

APL 66

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

Penjelasan:

¨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 

Cobalah di tryapl.org

Perhatikan bahwa dalam interpreter online fungsi ⍎ tidak berfungsi jadi saya harus menggantinya dengan 2⊃⎕VFI yang melakukan hal yang sama dalam hal ini, mengeksekusi dan mengembalikan nomor, diberikan string.

Moris Zucca
sumber
Terlihat salah: 60, 69, 90, dan 96 tidak boleh memiliki titik.
ngn
Terima kasih @ ngn, saya memperbaikinya, saya pikir itu berfungsi dengan benar sekarang.
Moris Zucca
2
Bagus :) Alih-alih ⊃,/atau ,/Anda dapat menggunakan di depan.
ngn
Oh benar! Saya biasanya tidak bekerja dalam ml1 jadi saya lupa tentang ∊.
Moris Zucca
4

Perl 5, 53 byte

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

Demo online.

Menggunakan fitur Perl 5.10+ say, jadi harus dijalankan dengan perl -M5.010(atau perl -E) untuk mengaktifkannya. (Lihat utas meta ini. ) Membaca input dari stdin, mencetak ke stdout.

Ilmari Karonen
sumber
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])

Menentukan fungsi fyang mencetak angka ke STDOUT, dalam urutan menaik.

Kali ini saya pikir saya akan mengambil daun dari buku @ feersum dengan .translate:)

Diperluas:

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

Solusi sebelumnya:

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)

Terima kasih kepada @xnor karena menunjukkan .replacetriknya kepada saya beberapa waktu lalu.

Sp3000
sumber
Anda bisa menggunakan (u''+S[::-1])bukan unicode(S[::-1]). Juga, jika Anda menukar printdan panggilan rekursif, nomor akan keluar dalam urutan yang meningkat.
ngn
@ ngn Ah, terima kasih, saya tidak berpikir u""+akan benar-benar bekerja
Sp3000
Lihat Saya pikir ini harus lebih kecil, misalnya itu bukan kesalahan Anda bahwa cetak seharusnya dicetak, bukan "p" katakan, tetapi jika Anda menulis "p = cetak" dan tidak memiliki hitungan sebagai byte dalam pengiriman "resmi" Anda itu akan mempersingkat!
Alec Teal
4

C #, 343 309 karakter

Cara terlalu lama, tapi tetap:

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

Bagaimana cara kerjanya? Untuk menambahkan periode ke nomor, itu harus sesuai dengan persyaratan berikut:

  • Hanya terdiri dari 0, 8, 6dan 9.
  • Tidak diakhiri dengan nol.
  • Bukan angka yang sama ketika Anda memutarnya:
    • Jika angka memiliki jumlah 6s dan 9s yang sama, dan
    • jika c= angka dengan semua 6s menggantikan dengan 9s,
    • dan terbalik c== c,
    • lalu: angka yang diputar sama dengan angka itu sendiri.

Angka-angka dipisahkan oleh spasi.

Kode dengan lekukan:

namespace System.Linq
{
    class C
    {
        static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i <= n; i++)
            {
                var b = i + "";
                var c = b.Replace("6", "9");
                Console.Write(b +
                    (b.All(x => x == '0' | x == '8' | x == '6' | x == '9') &
                    !b.EndsWith("0") &
                    !(b.Count(x => x == '6') == b.Count(x => x == '9') &
                    new String(c.Reverse().ToArray()) == c) ? ". " : " "));
            }
        }
    }
}
ProgramFOX
sumber
1
Jawaban saya lebih panjang;) Saya tampaknya menjadi bowling di lapangan golf.
Trauma Digital
1
Bagaimana dengan 8808? Itu tidak memiliki 6s atau 9s, tetapi 8088 ketika diputar.
El'endia Starman
1
@ El'endiaStarman Terima kasih banyak! Saat memperbaiki kiriman saya, saya sebenarnya menyimpan karakter :)
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) "."

Sebagian besar perintah dan fungsi bawaan di M memiliki versi singkat. Saya telah menggunakan nama lengkap di bawah ini.

READ n- Baca string dari keyboard dan simpan di n.

FOR i=0:1:n- Putaran dari nol ke n, bertambah i1 setiap kali. (Sisa dari garis membentuk badan lingkaran.)

WRITE !,i- Cetak baris baru diikuti dengan nilai i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Balikkan i, ganti sembilan dengan enam dan enam dengan sembilan, dan simpan itu di r.

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

  • :- Menunjukkan ekspresi postconditional, sehingga WRITEperintah hanya dieksekusi jika r=+r*r'=i*'$TRANSLATE(i,0689)dievaluasi ke nilai yang benar.
  • r=+r- Pastikan rtidak ada nol di depannya. +Operator unary mengonversi string menjadi angka, yang menghilangkan nol di awal jika ada.
  • *- Operator perkalian. M tidak memiliki urutan operasi; semua operator biner dievaluasi dalam urutan mereka muncul dari kiri ke kanan.
  • r'=i- Pastikan itidak sama dengan versi terbalik r.
  • '$TRANSLATE(i,0689)- Hapus semua nol, enam, delapan, dan sembilan i, dan periksa bahwa tidak ada yang tersisa. ( 'Adalah operator negasi logis.)
  • "."- Akhirnya argumen ke WRITEperintah (string literal).

Sunting: Membuatnya sedikit lebih pendek dengan menyalahgunakan operator perkalian. Versi sebelumnya:

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 "."
temporisida
sumber
3

APL, 53 karakter

∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳

0,⍳N        numbers 0..N
{...}∘⍕¨    format each number as a string and do the thing in curly braces
                inside the braces ⍵ is the current string
'6908'⍳⍵    encode '6' as 1, '9' as 2, '0' as 3, '8' as 4, and all others as 5
⌽           reverse
'9608x'[A]  use each element of A as an index in '9608x':
                effectively: swap '9'←→'6', preserve '08', mask other digits
⍵≡          does it match the original string?
                this is the first boolean condition, two more to come
5∊i         did we have a digit other than '0689'?
3≡⊃i        is the first of i (that is, the last of ⍵) a '0' (encoded as 3)?
∨/          disjunction ("or") over the three conditions, returns 0 or 1
'. '↓⍨      drop 0 or 1 elements from the beginning of the string '. '
⍵,          prepend ⍵
∊           flatten the results to obtain a single output string
ngn
sumber
3

C # 205 209

C # tidak harus terlalu panjang ...
lebih atau kurang, port jawaban JavaScript saya

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

Tidak disatukan

class P 
{
    static void Main(string[] a)
    {
        for (int n = int.Parse(a[0]); n >= 0; --n)
        {
            string p = "", u = n + p;
            int e = n % 10;
            foreach (var d in u) p = (d < 56 ? d != 54 ? d > 48 ? e = 0 : 0 : 9 : 120 - d - d) + p;
            System.Console.WriteLine(e != 0 & p != u ? u + "." : u);
        }
    }
}
edc65
sumber
2

Ruby, 81

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

Input diambil dari baris perintah.

Menghasilkan daftar Strings dari 0hingga n. Itu loop melalui mereka dan mencetaknya. Menambahkan satu titik jika semua kondisi terpenuhi:

  • membalikkan angka dan mengganti 6s dengan 9s tidak menghasilkan yang asli
  • nomor hanya terdiri dari angka 0, 6, 8dan9
  • jumlahnya tidak berakhir dengan 0
britishtea
sumber
2

JavaScript (ES6) 101 104 106 109

Sebuah fungsi dengan n sebagai argumen, output melalui console.log
Edit menggunakan% 10 untuk menguji memimpin 0
Edit 2 for reorganisasi, saya tidak perlu pemahaman array setelah semua
Edit 3 dimodifikasi (lagi) cek untuk memimpin 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
}

Tidak disatukan dan lebih mudah untuk diuji

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)

Keluaran

100 99. 98. 97 96 95 94 93 92 91 90 89. 88 87 86. 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68. 67 66. 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9. 8 7 6. 5 4 3 2 1 0
edc65
sumber
Apakah ada nama untuk konstruksi dengan for loop di dalam tanda kurung []? Saya mencari dokumentasi, karena saya hanya tahu ini dari python sejauh ini.
flawr
1
Saya pikir Anda dapat menghemat banyak pada baris baru di sini.
britishtea
1
@britishtea baris baru dan lekukan ditambahkan agar mudah dibaca dan tidak dihitung. Ini satu baris
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=
}

Uji:

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

sed, 467

Lebih lama dari C # ...

Saya cukup banyak menyelesaikan ini ketika @ edc65 menunjukkan bahwa jawaban perlu memproses angka 0-n dan bukan hanya n. Menambahkan kode sed ke kenaikan 0-n menambahkan kode LOT lebih banyak, karena tugas ini tidak cocok untuk sed aritmatika-kurang.

: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

Sesuai OP, pemesanan tidak masalah, jadi kami bekerja ke bawah dari n ke 0.

Keluaran:

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

Baca nilai n dari stdin.

Uji:

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

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

Tidak dikumpulkan + beberapa anotasi:

for n 0 do input 1 [
    b: copy a: form n
    d: c: 0

    ; reverse number and rotate "6" & "9"
    ; and do some counts (c when "6" or "9" and d when != "0689")
    parse reverse a [
        any [
            m:
              "6" (change m "9" ++ c)
            | "9" (change m "6" ++ c)
            | "0"
            | "8"
            | skip (++ d)
        ]
    ]

    print rejoin [
        b either all [
            d = 0               ; only has 0689 digits
            c > 0               ; must have at least one "6" or "9"
            a != b              ; not same when reversed
            a/1 != #"0"         ; does not "end" with zero
        ]
        "." {}                  ; if ALL then print "." else blank {}
    ]
]
draegtun
sumber
1

bc, 158

Setelah melakukan ini sepenuhnya dengan menggunakan semua operasi string dan regex tanpa aritmatika asli, saya ingin tahu bagaimana ini akan terlihat sebaliknya, yaitu semua operasi aritmatika dan logika dan tanpa string / regex:

for(i=read();i+1;r=0){p=1
for(x=i;x;x/=A){d=x%A
if(x==i&&!d)p=0
if(d==6||d==9)d=F-d else if(d%8)p=0
r=r*A+d}
if(r==i)p=0
print i--
if(p)print "."
print "\n"}

Output diurutkan dalam urutan menurun.

Keluaran:

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

Python - 152

for i in range(input()+1):print`i`+("."*all([j in"0689"for j in`i`])and`i`[-1]!="0"and`i`!=`i`.replace("9","x").replace("6","9").replace("x","6")[::-1])
KSFT
sumber
+1. Terlihat bagus ... Jika Anda ingin mempelajari beberapa trik untuk membuatnya lebih pendek, ada jawaban lain dalam python 2 yang menggunakan terjemahan alih-alih menggantikan, dan dalam riwayat edit juga memiliki cara untuk menggabungkan 3 pengganti tersebut menjadi 1 yang mungkin datang berguna untuk pertanyaan di masa mendatang ...
trichoplax
2
Kemajuan bagus! Selain di atas inilah beberapa golfs lebih: "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(yang benar-benar hanya eval(raw_input()))
Sp3000
Beberapa golf: (1) Dalam Python 2, Anda dapat menggantinya str(i)dengan `i`. (2) Anda ahanya menggunakan sekali, jadi mengapa menetapkannya ke variabel.
Wrzlprmft
Saya akan menggunakan saran kedua Anda, tetapi saya menggunakan str(i)beberapa kali. Mana yang bisa saya ganti i?
KSFT
1
Tidak i, tetapi idengan backticks, yang identik dengan repr(i). Anda dapat menggunakannya daripada di str(i)mana - mana, meskipun jika Anda memiliki str(i)sekitar berkali-kali mungkin lebih pendek untuk menetapkannya ke variabel dan menggunakannya selain menggunakan backticks. (yaitu 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.

Atau versi yang dapat dibaca:

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

Saya tidak terlalu senang dengan regex, ada ide?

Mengedit : Belajar trik rapi dengan ~dan for (... of ...)dari @ edc65
Edit2 : kondisi Reorganisasi
Edit3 : diterapkan saran oleh @ edc65

zabalajka
sumber
Murid yang buruk :) i=n+"";for(c of i)=> for(c of i=n+"")simpan 2 byte
edc65
... dan c==6?A:B=> c!=6=>B:A=>c-6?B:A
edc65
juga, biasanya Regexp.test (String) dapat digunakan sebagai pengganti String.match (Regexp), 1 byte lebih pendek.
edc65
6 byte total, terima kasih :) for(c of i=n+"")cukup logis ketika saya melihatnya, tapi saya tidak akan memikirkannya. c-6?B:ATuhan melarang saya pernah memasukkan ini ke dalam kode produksi
zabalajka
Gagasan tentang regexp: Anda perlu memeriksa 1 char tidak valid, tidak 1 bijih lagi, jadi '+' tidak diperlukan. Jika Anda mengutak-atik ekspresi console.log Anda, Anda dapat menyimpan 8 byte ... tapi kemudian saya pikir jawaban Anda akan terlalu pendek
edc65
1

05AB1E , 38 37 30 29 byte

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

Cobalah online.

Penjelasan:

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

Penjelasan tambahan untuk beberapa bagian:

Ti       # Check if the integer contains no trailing zeros:
T          #  Push 10 (T is a builtin for 10)
 %         #  Modulo
  Ā        #  Trutified: 0 remains 0 (falsey), everything else becomes 1 (truthy)
           #   i.e. 12 % 10 → 2 → 1 (truthy)
           #   i.e. 68 % 10 → 8 → 1 (truthy)
           #   i.e. 70 % 10 → 0 → 0 (falsey) (70 remains as is)
           #   i.e. 609 % 10 → 9 → 1 (truthy)
           #   i.e. 808 % 10 → 8 → 1 (truthy)

ŽR!XåPi    # Check if the integer only consists of the digits 0, 6, 8 and/or 9:
ŽR!        #  Push 6890 (Ž is a builtin for 2-char compressed integers, where R! is 6890)
   X       #  Push variable `X` (the list of digits)
    å      #  Check for each of these digits if they're in "6890"
     P     #  Take the product of that list
           #   i.e. [1,2] → [0,0] → 0 (falsey) (12 remains as is)
           #   i.e. [6,8] → [1,1] → 1 (truthy)
           #   i.e. [6,0,9] → [1,1,1] → 1 (truthy)
           #   i.e. [8,0,8] → [1,1,1] → 1 (truthy)

Ð69‡RÊi   # Check if the integer with 6s and 9s swapped and then reversed isn't unchanged:
Ð          #  Triplicate the integer
 69        #  Push 69
   Â       #  Bifurcate (short for Duplicate & Reverse)
          #  Transliterate (in `a` replace all characters `b` with characters `c`)
     R     #  Reverse
      Ê    #  Check for inequality
           #   i.e. 68 → "68" → "98" → "89" → 68 != "89" → 1 (truthy) (68 becomes "68.")
           #   i.e. 609 → "609" → "906" → "609" → 609 != "609" → 0 (falsey) (609 remains as is)
           #   i.e. 808 → "808" → "808" → "808" → 808 != "808" → 0 (falsey) (808 remains as is)
Kevin Cruijssen
sumber
0

Perl - 84

for(0..$ARGV[0]){s/6/x/g;s/9/6/g;s/x/9/g;printf"$_%s\n",$_=~/^[0689]+[689]$/?".":""}
KSFT
sumber
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}}))

Script tes yang dijelaskan:

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

Keluaran:

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.
mazzy
sumber
0

Stax , 27 byte

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

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini

rekursif
sumber