Döndürme güvenli sayıları yazdır


29

Arka fon

Bir masa oyunu üreticisi için çalışıyorsunuz ve bazı oyunlar için üzerine 0'dan n'ye kadar sayıları olan ahşap fayanslar üretmeniz gerekiyor . Ancak, daha fazla uzatmadan, bazı fayanslar ayırt edilemez hale gelir, örneğin 6ve 9. Bunu önlemek için, bir daha belirgin hale getirmek nokta olan, örneğin (ve sadece bu) başkaları ile karışabilir numaralar donatmak lazım, gibi fayans olurdu 9.ya 6089..

Ne yazık ki, bunun için çok eski, ancak programlanabilen ahşap oyma cihazını kullanmanız gerekiyor, bunun için ara yüzü o kadar bozuktu ki programın her karakterini elle tarif edilemeyecek kadar sıkıcı bir süreç içerisinde elle kodlamanız gerekiyor. Neyse ki cihaz mevcut her programlama dilini anlıyor. Böylece bu tür fayans basan en kısa programı arıyoruz.

Gerçek görev

En kısa programı yazınız:

  • Girdi olarak n pozitif bir tamsayı alır . Girişin nasıl okunacağı size bağlıdır.
  • Tek bir boşluk karakteri (yeni satır dahil) ile ayrılmış olarak , 0 ile n arasındaki (0 ve n dahil) sayılarını istediğiniz sırada tam olarak bir kez yazdırır . Sayılar, baştaki sıfırlar olmadan yazdırılmalıdır.
  • Başka bir sayıya dönüşen her sayıya bir nokta (.) Ekler, bu sayı n'den büyük olsa bile, valid (180 °) döndürülerek geçerli sayıdır . Yazı tipinizin 0 ve 8'i döndürme simetriktir ve 9 döndürülmüş 6'dır. 2 ve 5 döndürüldüğünde belirgindir; 1, dönme simetrik değildir. Başında sıfır bulunan sayılar geçerli değildir.

Örnekler

Aşağıdaki numaraların her biri tam olarak bu şekilde basılmalıdır:

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

Gerekmiyor 60olmak 60.?
kırmızı-X

2
@ red-X "Başında sıfır bulunan numaralar geçerli değil."
Sp3000,

2
@rationalis: Bunun için standart bir boşluk var . (Ayrıca, bu makineye o dili öğretmeniz gerektiğinden, bu tematik olarak mantıklı olmaz.) Her iki şekilde de bir tane ekledim .
Wrzlprmft

2
@rationalis Genel olarak olan, yalnızca meydan okumadan önce var olan dil sürümlerinin kazanan program olarak seçilebilmesidir. Sonra yapılan sürümler hala eğlence için gönderebilir, ancak gönderilerinde yarışmayacaklarını belirtmelidir. Yani evet , böyle bir dili tanımlayabilirsiniz, ancak standart bir boşluk olması nedeniyle (yukarıda olduğu gibi) uygun değildir ve büyük olasılıkla iyi karşılanmamıştır.
Sp3000

3
8088.Örneklerinize, 6 veya 9 olmayan dönme güvensiz bir sayı olarak dahil edilmesinin faydalı olacağını düşünüyorum .
El'endia Starman

Yanıtlar:


6

Pyth - 34 38

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

4 bayt'ı kaldırmama yardım ettiği için @ Sp3000'e teşekkür etmeliyim. Başlangıçta &@JK, numarada 6 ya da 9 olduğundan emin olan ek bir çekim vardı, ancak göndermeden önce cevapları inceledikten sonra, cevabını okudum ve özdeş çevirimin ve ters çevirimin çoktan hallettiğini fark ettim.

Ayrıca, dizgelerin yinelenebilir olduğuna dikkat çektiğiniz için @isaacg'a teşekkür ederiz ve üzerlerinde ayarlanmış işlemleri kullanabilirsiniz. Ayrıca mevcut kodu yapmak için;)

Açıklama:

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

İçin tamsayı listelerini kullanmanız gerektiğini düşünmüyorum. K ve Jbunun yerine sadece dizeleri kullanın. Switching Kiçin <backtick> 69 ve Jüzere <backtick> N olarak inlining gelmez, birkaç karakter kazandırır Kçıkan programda. Bu tekniğin altına girebildiğim en kısa süre VhQJ``N+J*\.&nJX_J``69``96&eN!-J"068934 karakterdi. (İki geri
tepme

@isaacg Tahmininiz için teşekkürler! Bir nedenden ötürü bir sayı dizisi yapmanın `kullanarak pyth'ta gerçekten kısa olduğunu unuttum. Neyse, \ ile kaçarak backticks ile bir kod bloğu yazabilirsiniz. Örneğin:hell`o wo`rld
FryAmTheEggman

Açıklamada _, önce bir ekstra var gibi görünmektedir `96.
isaacg

@isaacg Teşekkürler, sabit
FryAmTheEggman

10

CJam, 46 44 43 42 bayt

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

Sanırım iyileştirme için bir oda var.

Burada test et.

açıklama

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

Giriş 8 olduğunda bu ne olur? (Kodu Girdi'ye yapıştırdım ve Çalıştır düğmesine tıkladım, ancak bir hata çağrıldı.)
DavidC

@DavidCarraher "Kod" ve nGiriş kodunu koydu .
Martin Ender

giriş 98'de, programınız 66'nın yanına bir nokta koyar; bu hatalı olur.
Sparr

3
@Sparr Bir cevabın geçersiz olduğunu söylemeden önce OP'nin sorunuzu cevaplamasını beklemelisiniz. Onun ifadesi: "Aşağıdaki numaraların her birinin tam olarak bu şekilde basılması gerekiyor" yorumuna aykırı görünüyor.
FryAmTheEggman

CJam açıklamalarının güzelliğini seviyorum.
nyuszika7h


5

APL 66

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

Açıklama:

¨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'da deneyin

Çevrimiçi tercümanda ⍎ işlevinin çalışmadığını ve bu durumda aynı olan 2⊃⎕VFI ile değiştirmek zorunda kaldığımı ve bunun için bir dize verilen sayıyı çalıştırdığını ve döndürdüğünü unutmayın.


Yanlış görünüyor: 60, 69, 90 ve 96'da noktalar olmamalıdır.
ngn

Thanks @ngn, düzelttim, sanırım şimdi doğru çalışıyor.
Moris Zucca,

2
Aferin :) Bunun yerine ⊃,/veya ,/bir ön kullanabilirsiniz.
ngn

Ah doğru! Genellikle ml1'de çalışmıyorum, bu yüzden ∊'yi unutuyorum.
Moris Zucca

4

Perl 5, 53 bayt

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

Çevrimiçi demo.

Perl 5.10+ sayözelliğini kullanır , bu yüzden etkinleştirmek için perl -M5.010(veya perl -E) ile çalıştırılması gerekir. ( Bu meta konu başlığına bakınız . ) Stdin'den girişi okur, stdout'a yazdırır.


4

Python 2, 130 116 113 bayt

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

fSayıları STDOUT'a artan düzende basacak işlevi tanımlar .

Bu sefer @ feersum'un kitabından bir sayfa çıkartacağımı düşündüm .translate:)

Expanded:

def f(n):
 S=`n`        
 n and f(n-1)                                      # Recurse if not 0                                     
 print S+"."*all([n%10,                            # Not divisible by 10
                  set(S)<=set("0689"),             # Consists of 0689
                  (u""+S[::-1]).translate
                  ({54:57,57:54})!=S])             # When rotated is not itself

Önceki çözüm:

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)

.replaceBir süre önce bana numarayı gösterdiğin için @xnor'a teşekkürler .


Sen kullanabilirsiniz (u''+S[::-1])yerine unicode(S[::-1]). Ayrıca printve özyinelemeli çağrıyı değiştirirseniz, sayılar artan sırada ortaya çıkacaktır.
ngn

@ Ah Ah, u""+gerçekten işe yarayacağını sanmıyorum
Sp3000

Bakın bunun daha küçük olması gerektiğini düşünüyorum, örneğin "p" deyip değil, "p = print" yazacaktınız ve "resmi" gönderiminizde bayt olarak sayılmadıysanız, yazdırmanın doğru şekilde yazdırılması sizin suçunuz değil. kısaltın!
Alec Teal

4

C #, 343 309 karakter

Yol çok uzun, ama yine de:

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

O nasıl çalışır? Sayıya bir süre eklemek için, aşağıdaki gereksinimlerle eşleşmesi gerekir:

  • Sadece oluşur 0, 8, 6ve 9.
  • Sıfır ile bitmiyor.
  • Döndürdüğünüzde aynı numara değil:
    • Sayının eşit miktarda 6s ve 9s olması ve
    • if c= Tüm 6s sayıları s ile değiştirilir 9,
    • ve ters çevrilmiş c== c,
    • o zaman: döndürülen sayı, sayının kendisi ile aynıdır.

Sayılar boşlukla ayrılır.

Girintili kod:

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
Cevabım daha uzun;) Golf sahasında bowling oynuyor gibi görünüyor.
Dijital Travma

1
8808'den ne haber? Herhangi bir 6 ya da 9'a sahip değildir, fakat döndürüldüğünde 8088'dir.
El'endia Starman

1
@ El'endiaStarman Çok teşekkürler! Gönderimimi düzeltirken, aslında karakterleri
kaydetmiştim

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'deki çoğu yerleşik komut ve işlevler kısaltılmış sürümlere sahiptir. Aşağıdaki tam adlarını kullandım.

READ n- Klavyeden bir dize okuyun ve saklayın n.

FOR i=0:1:n- Her seferinde 1 ile nartan , sıfırdan sıfıra döngü i. (Çizginin kalanı, döngünün gövdesini oluşturur.)

WRITE !,i- Değerini izleyen yeni bir satır yazdırın i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Ters çevirin i, altı ile altı ve altı ile dokuzları değiştirin ve saklayın r.

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

  • :- Koşullu bir ifadeyi belirtir, bu nedenle WRITEkomut yalnızca r=+r*r'=i*'$TRANSLATE(i,0689)bir truthy değerini değerlendirirse çalıştırılır .
  • r=+r- rSıfır olmadığını kontrol edin . Unary +operatörü bir dizgiyi bir sayıya dönüştürür, eğer varsa baştaki sıfırları soyan.
  • *- Çarpma operatörü. M'nin işlem sırası yoktur; Tüm ikili operatörler, soldan sağa göründükleri sırayla değerlendirilir.
  • r'=i- iÇevirilmiş versiyonuyla aynı olmadığını kontrol edin r.
  • '$TRANSLATE(i,0689)- Tüm sıfırları, altıları, sekizleri ve dokuzları çıkarın ive hiçbir şey kalmadığını kontrol edin. ( 'mantıksal olumsuzlama operatörüdür.)
  • "."- Sonunda WRITEkomut argümanı (değişmez bir dize).

Düzenleme: Çarpma operatörünü kötüye kullanarak biraz daha kısaltılmış. Önceki versiyon:

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

3

C # 205 209

C # çok uzun olmak zorunda değil ...
az ya da çok, JavaScript cevabımın bir bağlantı noktası

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

Ungolfed

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

2

Ruby, 81

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

Giriş komut satırından alınır.

Bir listesini oluşturur Stringgelen s 0için n. Oluklardan geçerler ve basarlar. Tüm koşullar yerine getirildiğinde bir nokta ekler:

  • sayının tersine çevrilmesi ve 6s'nin s ile değiştirilmesi 9, orijinali vermez
  • sayısı, sadece basamaktan oluşur 0, 6,8 ve9
  • numara bitmiyor 0

2

JavaScript (ES6) 101 104 106 109

Console.log ile bağımsız değişken, çıktı olarak n bir fonksiyon
Edit 0 gelen test etmek için,% 10 kullanılarak
Düzenleme 2 for Sonuçta yeniden düzenlenmesi, bir dizi kavrama gerekmez
Düzenleme 3 0 gelen (tekrar) kontrolü modifiye

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 ve test etmek daha kolay

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)

Çıktı

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

Yapının köşeli parantez içinde olduğu bir isim var mı []? Bir dokümantasyon arıyorum, çünkü bunu yalnızca python'dan biliyordum.
kusur

1
Burada yeni hatlardan çok tasarruf edebileceğinizi düşünüyorum.
britishtea

1
@ britittea newlines ve okunabilirlik için girintili eklenir ve sayılmaz. Tek bir çizgi
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=
}

Ölçek:

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

1

sed, 467

C # 'den daha uzun ...

@ Edc65, cevapların yalnızca n değil, 0-n sayıları işlemesi gerektiğine işaret ettiğinde bunu hemen hemen tamamladım. Sed kodunu 0-n artışa eklemek, LOT fazla kod ekler, çünkü bu görev aritmetik olmayan sed için uygun değildir.

: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'ye göre, sipariş önemli değil, bu yüzden n'den 0'a kadar çalışıyoruz.

Çıktı:

$ 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 değerini stdin'den okuyun.

Ölçek:

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

Ungolfed + bazı ek açıklamalar:

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

Bunu, tamamen yerel aritmetik olmayan tüm string ve regex işlemlerini kullanarak sed'de yaptıktan sonra , bunun nasıl tersine bakacağını, yani tüm aritmetik ve mantık işlemlerini ve string / regex'i görmediğini merak ettim:

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

Çıkış azalan düzende sıralanır.

Çıktı:

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

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

+1. İyi görünüyorsun ... Kısaltmak için bazı püf noktaları öğrenmek istiyorsanız python 2'de, yerine yerine tercüman kullanan başka bir cevap var ve düzenleme geçmişinde, bu 3 yerinin 1'de bir araya gelme yolu da var. gelecekteki sorular için kullanışlı ...
trichoplax

2
Güzel ilerleme! : Yukarıdakilere ek olarak burada biraz daha golfları var "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(gerçekten sadece bir eval(raw_input()))
SP3000

Bazı golf sporları: (1) Python 2'de str(i)ile değiştirebilirsiniz `i`. (2) aSadece bir kez kullanıyorsunuz, neden bir değişkene atayın?
Wrzlprmft

İkinci önerinizi kullanacağım, ancak str(i)birkaç kez kullanıyorum. Hangisiyle değiştirebilirim i?
KSFT

1
Değil i, ancak ibackticks ile eşanlamlı olan repr(i). Her str(i)yerde kullanabilirsiniz , ancak str(i)bu kadar çok süreniz varsa onu değişkene atamak daha kısa olabilir ve backticks kullanmaya ek olarak kullanabilirsiniz. (yani 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'da açıklanmaktadır.

Veya okunabilir sürüm:

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

Ben regex, herhangi bir fikir ile çok mutlu değilim?

Düzenleme : ile düzgün hile Öğrenilmiş ~ve for (... of ...)@ edc65 gelen
Edit2 yeniden yapılandırıldı koşullar:
Edit3 : önerilerini tatbik @ edc65


Kötü öğrenci :) i=n+"";for(c of i)=> for(c of i=n+"")2 bayt kaydet
edc65 20

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

Ayrıca, genellikle 1 bayt kısa olan String.match (Regexp) yerine genellikle Regexp.test (String) kullanılabilir.
edc65

6 bayt toplam, teşekkürler :) for(c of i=n+"")gördüğümde oldukça mantıklı, ama bunu düşünmem. c-6?B:ATanrı korusun, bunu üretim koduna koydum
zabalajka

Regexp hakkında bir fikir: 1 geçersiz karakter olup olmadığını kontrol etmelisin, 1 cevher daha değil, bu yüzden '+' gerekli değil. çok kısa olurdu
edc65

1

05AB1E , 38 37 30 29 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Bazı parçalar için ek açıklama:

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 bayt

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

Açıklanan test komut dosyası:

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

Çıktı:

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 bayt

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

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

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

Bunu çalıştır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.