Wydrukuj numery zabezpieczone przed rotacją

29

tło

Pracujesz dla jakiegoś producenta gier planszowych i musisz produkować drewniane płytki z cyframi od 0 do n wygrawerowanymi na nich w niektórych grach. Jednakże, bez dalszej zwłoki, niektóre płytki stałaby się nie do odróżnienia, na przykład, 6i 9. Aby tego uniknąć, musisz wyposażyć liczby, które można pomylić z innymi (i tylko tymi), w jednoznaczną kropkę, np. Masz płytki takie jak 9.lub 6089..

Niestety, musisz użyć do tego jakiegoś starego, ale programowalnego urządzenia do grawerowania drewna, którego interfejs jest tak zepsuty, że musisz ręcznie zakodować każdy znak programu w sposób nie do opisania żmudny. Na szczęście urządzenie rozpoznaje każdy istniejący język programowania. Dlatego szukasz najkrótszego programu, który drukuje takie kafelki.

Rzeczywiste zadanie

Napisz najkrótszy program, który:

  • Pobiera na wejściu dodatnią liczbę całkowitą n . Sposób odczytu danych zależy od Ciebie.
  • Drukuje każdą z liczb od 0 do n ( włącznie 0 i n ) dokładnie raz w wybranej przez Ciebie kolejności, oddzielone pojedynczym białym znakiem (w tym znakiem nowej linii). Liczby należy wydrukować bez zer wiodących.
  • Dodaje kropkę (.) Do każdej liczby, która zmienia się w inną prawidłową liczbę po obróceniu o π (180 °), nawet jeśli liczba ta jest większa niż n. 0 i 8 kroju pisma są symetryczne obrotowo, a 9 to obrócony 6. 2 i 5 różnią się po obrocie; 1 nie jest obrotowo-symetryczny. Liczby z wiodącymi zerami są nieprawidłowe.

Przykłady

Każdy z poniższych numerów musi zostać wydrukowany dokładnie w ten sposób:

  • 2
  • 4
  • 5
  • 6.
  • 8
  • 9.
  • 16
  • 60
  • 66.
  • 68.
  • 69
  • 906
  • 909.
  • 8088.
  • 9806.
  • 9886
  • 9889.
Wrzlprmft
źródło
Nie powinno 60być 60.?
czerwony-X
2
@ czerwony-X „Liczby z wiodącymi zerami są nieprawidłowe.”
Sp3000,
2
@rationalis: Istnieje standardowa luka w tym zakresie. (Poza tym tematycznie nie miałoby to sensu, ponieważ musisz nauczyć tę maszynę tego języka.) Tak czy inaczej, dodałem istniejący.
Wrzlprmft
2
@rationalis Zasadniczo dzieje się tak, że tylko wersje językowe istniejące przed opublikowaniem wyzwania kwalifikują się do zwycięskiego programu. Wersje wykonane później mogą nadal publikować dla zabawy, ale w swoim poście powinny określać, że nie rywalizują. Tak, możesz zdefiniować taki język, ale byłby on niekwalifikowalny i najprawdopodobniej źle przyjęty ze względu na to, że jest standardową luką (jak wyżej).
Sp3000,
3
Myślę, że dobrze byłoby podać 8088.w swoich przykładach liczbę niebezpieczną dla rotacji, która nie ma cyfry 6 lub 9.
El'endia Starman

Odpowiedzi:

6

Pyth - 34 38

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

Muszę podziękować @ Sp3000 za pomoc w usunięciu 4 bajtów. Początkowo miałem dodatkową kontrolę, &@JKktóra upewniła się, że w numerze jest 6 lub 9, ale po przeczytaniu odpowiedzi przed wysłaniem przeczytałem jego odpowiedź i zauważyłem, że moje identyczne tłumaczenie i odwrócenie już się tym zajęło.

Również dzięki @isaacg za wskazanie, że ciągi są iterowalne i można na nich używać operacji set. Również do tworzenia bieżącego kodu;)

Wyjaśnienie:

                                    : (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
źródło
Nie sądzę, że musisz używać list liczb całkowitych dla Ki J- po prostu używaj ciągów. Przełączenie Kna <backtick> 69 i J<backtick> N zapisuje kilka znaków, podobnie jak wstawianie Kw wynikowym programie. Najkrótszą metodą VhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689, jaką udało mi się uzyskać w ramach tej techniki, było 34 znaki. (Dwa backty są naprawdę jednym.)
isaacg
@isaacg Dzięki za wskazówkę! Myślę, że z jakiegoś powodu zapomniałem, że wykonanie ciągu liczb było naprawdę krótkie w pyth przy użyciu `. W każdym razie możesz napisać blok kodu z backtickami, uciekając je za pomocą \. Na przykład:hell`o wo`rld
FryAmTheEggman
W wyjaśnieniu wydaje się, że masz dodatkowy _, przed `96.
isaacg
@isaacg Dzięki, naprawiono
FryAmTheEggman
10

CJam, 46 44 43 42 bajtów

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

Myślę, że jest miejsce na ulepszenia.

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
Co to zwraca, gdy wejście ma wartość 8? (Wkleiłem kod w danych wejściowych, a następnie kliknąłem przycisk Uruchom, ale został wywołany błąd).
DavidC
@DavidCarraher umieść kod w „Code” i nInput.
Martin Ender
wprowadź 98, twój program umieszcza kropkę obok 66, co jest niepoprawne.
Sparr
3
@Sparr Musisz poczekać, aż OP odpowie na twoje pytanie, zanim powiesz, że odpowiedź jest nieprawidłowa. Jego stwierdzenie: „Każda z poniższych liczb musi być wydrukowana dokładnie w ten sposób” wydaje się zaprzeczać twojej interpretacji.
FryAmTheEggman
Lubię piękno wyjaśnień CJam.
nyuszika7h
8

CJam, 46 45 43 42 bajtów

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

Myślę, że można trochę bardziej zagrać w golfa.

Bierze nod STDIN.

Wypróbuj online tutaj

Optymalizator
źródło
5

APL 66

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

Wyjaśnienie:

¨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 

Wypróbuj na tryapl.org

Zauważ, że w internetowym tłumaczu funkcja ⍎ nie działa, więc musiałem zastąpić ją 2⊃⎕VFI, która robi to samo w tym przypadku, wykonuje i zwraca liczbę, podając ciąg znaków.

Moris Zucca
źródło
Wygląda źle: 60, 69, 90 i 96 nie mogą mieć kropek.
ngn
Dzięki @ngn, poprawiłem to, myślę, że teraz działa poprawnie.
Moris Zucca
2
Dobra robota :) Zamiast ⊃,/lub ,/możesz użyć z przodu.
ngn
Och racja! Zwykle nie pracuję w ml1, więc zapominam o ∊.
Moris Zucca
4

Perl 5, 53 bajtów

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

Demo online.

Korzysta z funkcji Perl 5.10+ say, więc należy ją uruchomić z perl -M5.010(lub perl -E), aby ją włączyć. (Zobacz ten meta wątek. ) Czyta dane wejściowe ze standardowego wejścia, drukuje na standardowe wyjście.

Ilmari Karonen
źródło
4

Python 2, 130 116 113 bajtów

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

Definiuje funkcję, fktóra drukuje liczby do STDOUT w porządku rosnącym.

Tym razem pomyślałem, że wyjdę z książki @ feersum z .translate:)

Rozszerzony:

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

Poprzednie rozwiązanie:

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)

Dzięki @xnor za pokazanie mi .replacetriku jakiś czas temu.

Sp3000
źródło
Możesz użyć (u''+S[::-1])zamiast unicode(S[::-1]). Ponadto, jeśli zamienisz połączenie printi połączenie rekurencyjne, numery będą pojawiać się w kolejności rosnącej.
ngn
@ngn Ach, dzięki, nie sądziłem u""+, że to naprawdę zadziała
Sp3000
Widzisz, myślę, że powinno to być mniejsze, na przykład to nie twoja wina, że ​​druk jest poprawnie drukowany, a nie „p”, ale jeśli napisałeś „p = drukuj” i nie liczyłeś się jako bajty w „oficjalnym” przesłaniu, to skróciłbym to!
Alec Teal,
4

C #, 343 309 znaków

Sposób zbyt długo, ale i tak:

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

Jak to działa? Aby dodać kropkę do numeru, musi spełniać następujące wymagania:

  • Składa się tylko z 0, 8, 6i 9.
  • Nie kończy się na zero.
  • Nie jest ten sam numer, gdy go obrócisz:
    • Jeśli liczba ma równą liczbę 6si 9si, i
    • if c= liczba ze wszystkimi 6s zastępuje się 9s,
    • i odwrócone c== c,
    • następnie: obrócony numer jest taki sam jak sam numer.

Liczby są oddzielone spacją.

Kod z wcięciem:

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
źródło
1
Moja odpowiedź jest dłuższa;) Wygląda na to, że gram w kręgle na polu golfowym.
Digital Trauma
1
Co z 8808? Nie ma żadnych 6 ani 9, ale po obróceniu wynosi 8088.
El'endia Starman
1
@ El'endiaStarman Wielkie dzięki! Naprawiając swoje zgłoszenie, faktycznie zapisałem znaki :)
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) "."

Większość wbudowanych poleceń i funkcji w M ma wersje skrócone. Użyłem pełnych nazw poniżej.

READ n- Przeczytaj ciąg z klawiatury i zapisz go n.

FOR i=0:1:n- Pętla od zera do n, iza każdym razem zwiększana o 1. (Pozostała część linii stanowi treść pętli.)

WRITE !,i- Wydrukuj nowy wiersz, a następnie wartość i.

SET r=$TRANSLATE($REVERSE(i),69,96))- Odwróć i, zamień dziewiątki na szóstki i szóstki na dziewiątki i zapisz to w r.

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

  • :- Oznacza wyrażenie warunkowe, więc WRITEpolecenie jest wykonywane tylko wtedy, gdy zostanie r=+r*r'=i*'$TRANSLATE(i,0689)ocenione na prawdziwą wartość.
  • r=+r- Sprawdź, rczy nie ma wiodącego zera. Jednoargumentowy +operator przekształca ciąg znaków na liczbę, która usuwa początkowe zera, jeśli takie istnieją.
  • *- Operator mnożenia. M nie ma kolejności operacji; wszystkie operatory binarne są oceniane w kolejności, w jakiej występują od lewej do prawej.
  • r'=i- Sprawdź, czy ito nie to samo, co wersja odwrócona r.
  • '$TRANSLATE(i,0689)- Usuń wszystkie zera, szóstki, ósemki i dziewiątki ii sprawdź, czy nic nie zostało. ( 'jest logicznym operatorem negacji).
  • "."- Na koniec argument WRITEpolecenia (ciąg dosłowny).

Edycja: nieco krótszy, nadużywając operatora mnożenia. Poprzednia wersja:

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 "."
zabójstwo
źródło
3

APL, 53 znaki

∊{⍵,'. '↓⍨∨/(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
źródło
3

C # 205 209

C # nie musi być tak długie ...
mniej więcej, część mojej odpowiedzi 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);}}}

Nie golfił

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
źródło
2

Ruby, 81

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

Dane wejściowe są pobierane z wiersza poleceń.

Generuje listę Strings od 0do n. Pętle przechodzą przez nie i drukują je. Dołącza kropkę, jeśli wszystkie warunki są spełnione:

  • odwrócenie liczby i zamiana 6s na 9s nie daje oryginału
  • liczba składa się tylko z cyfr 0, 6, 8i9
  • numer nie kończy się na 0
Britishtea
źródło
2

JavaScript (ES6) 101 104 106 109

Funkcja z argumentem n jako wyjście, wysyłana przez konsolę.log
Edytuj za pomocą% 10 do testowania na potrzeby reorganizacji na początku 0
Edytuj 2 for , nie potrzebuję zrozumienia tablicy po tym, jak wszystkie
Edytuj 3 zmodyfikowały (ponownie) sprawdzenie na początku 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
}

Bez golfa i łatwiejsze do przetestowania

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)

Wydajność

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
źródło
Czy istnieje nazwa konstrukcji z pętlą for w nawiasach []? Szukam dokumentacji, ponieważ do tej pory znałem ją tylko z Pythona.
flawr
1
Myślę, że możesz dużo zaoszczędzić tutaj.
britishtea
1
@britishtea nowe wiersze i wcięcia dodane dla czytelności i nie są liczone. To jedna linia
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=
}

Test:

$ ./rotproof.sh 100 | grep "\."
6.
9.
66.
68.
86.
89.
98.
99.
$ 
Cyfrowa trauma
źródło
1

sed, 467

Dłuższy niż C # ...

Prawie skończyłem to, gdy @ edc65 wskazał, że odpowiedzi muszą przetwarzać liczby 0-n, a nie tylko n. Dodanie kodu sed do przyrostu 0-n dodaje DUŻO więcej kodu, ponieważ to zadanie jest nieodpowiednie dla sed pozbawionego arytmetyki.

: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

Zgodnie z OP, kolejność nie ma znaczenia, więc pracujemy w dół od n do 0.

Wydajność:

$ sed -rnf rotproof.sed <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Cyfrowa trauma
źródło
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"."}}

Odczytaj wartość n ze standardowego wejścia.

Test:

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

LeFauve
źródło
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"]"."{}]]

Niegolfowany + kilka adnotacji:

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
źródło
1

p.n.e. 158

Po zrobieniu tego czysto w sed przy użyciu wszystkich operacji na łańcuchach i wyrażeniach regularnych bez natywnej arytmetyki, byłem ciekawy, jak to wyglądałoby na odwrót, tj. Wszystkie operacje arytmetyczne i logiczne oraz brak łańcucha / wyrażenia regularnego:

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

Dane wyjściowe są sortowane w kolejności malejącej.

Wydajność:

$ bc rotproof.bc <<< 100 | grep "\."
99.
98.
89.
86.
68.
66.
9.
6.
$ 
Cyfrowa trauma
źródło
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
źródło
+1. Wygląda dobrze ... Jeśli chcesz nauczyć się kilku sztuczek, aby go skrócić, w Pythonie 2 jest inna odpowiedź, która używa tłumaczenia zamiast zamiany, aw historii edycji ma również sposób na połączenie tych 3 zamienników w 1, które mogą przyjść przydaje się w przypadku przyszłych pytań ...
trichoplax
2
Niezły postęp! W uzupełnieniu do powyższego tutaj jest trochę więcej: Golfy "."if a[i]else"" -> "."*a[i], int(raw_input()) -> input()(który jest naprawdę tylko eval(raw_input()))
SP3000
Niektóre golfes: (1) w Pythonie 2, można wymienić str(i)z `i`. (2) Używasz atylko raz, więc po co przypisywać ją do zmiennej.
Wrzlprmft
Wykorzystam twoją drugą sugestię, ale używam str(i)kilka razy. Który mogę wymienić i?
KSFT
1
Nie i, ale iz backtickami, co jest synonimem repr(i). Możesz go używać zamiast str(i)wszędzie, chociaż jeśli masz go str(i)tak wiele razy, może być krótsze przypisanie go do zmiennej i użycie jej oprócz korzystania z backsicków. (tj. 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.

Lub wersja do odczytu:

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

Nie jestem bardzo zadowolony z wyrażenia regularnego, jakieś pomysły?

Edit : Learned schludny sztuczkę z ~i for (... of ...)od @ edc65
Edit2 : zreorganizowana warunki
Edit3 : propozycje stosowane przez @ edc65

zabalajka
źródło
Zły uczeń :) i=n+"";for(c of i)=> for(c of i=n+"")zapisz 2 bajty
edc65
... i c==6?A:B=> c!=6=>B:A=>c-6?B:A
edc65
również zwykle można użyć Regexp.test (String) zamiast String.match (Regexp), 1 bajt krótszy.
edc65
Łącznie 6 bajtów, dzięki :) for(c of i=n+"")jest całkiem logiczny, kiedy go widzę, ale nie pomyślałbym o tym. c-6?B:ABoże, zabraniaj, że kiedykolwiek wprowadzałem to do kodu produkcyjnego
zabalajka
Pomysł na temat wyrażenia regularnego: musisz sprawdzić, czy jest 1 nieprawidłowy znak, a nie 1 lub więcej, więc „+” nie jest potrzebne. Jeśli masz problemy z wyrażeniem console.log, możesz zapisać 8 bajtów ... byłoby za krótkie
edc65
1

05AB1E , 38 37 30 29 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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

Dodatkowe wyjaśnienie niektórych części:

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
źródło
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
źródło
0

PowerShell, 111 102 bajtów

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

Wyjaśniony skrypt testowy:

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

Wydajność:

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
źródło
0

Stax , 27 bajtów

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

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

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

Uruchom ten

rekurencyjny
źródło