Cyfry całkowite tabel arytmetycznych


17

Wyzwanie:

Wyprowadza „liczby całkowite” jednej z następujących sześciu tabel arytmetycznych na podstawie danych wejściowych:
- add ( +);
- odejmowanie ( -);
- mnożenie ( *);
- podział ( /);
- potęgowanie ( ^);
- działanie modulo ( %).

Zasady:

  • Co mogę określić jako „całkowitych końcowych cyfr”: każdy wynik arytmetycznej argumentu, który jest dokładnie jeden z następujących elementów: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Oznacza to, że wykluczasz każdy wynik 10lub wyższy, każdy wynik -1lub niższy i każdy wynik nie będący liczbą całkowitą.
  • Jak obliczyć wyniki arytmetyczne: Najpierw używając pierwszej cyfry, a następnie operandu z cyfrą lewą. Możesz to zrobić na odwrót (tj. y/xZamiast x/y), o ile jesteś konsekwentny dla wszystkich sześciu wyników! (Więc nie są dopuszczone do użytku y-xi x/yw tej samej odpowiedzi.)
  • Nie wyprowadzimy niczego do podzielenia przez 0 przypadków testowych (dla tabel operacji dzielenia i modulo)
  • Nie będziemy generować niczego dla Edge-Case 0^0.

Wynik:

Więc wypisz następujące (format tabeli jest nieco elastyczny (patrz poniżej): więc wiersze są opcjonalne i dodane głównie dla czytelności przypadków testowych):

Dodanie:

+ | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 | 0 1 2 3 4 5 6 7 8 9
1 | 1 2 3 4 5 6 7 8 9
2 | 2 3 4 5 6 7 8 9
3 | 3 4 5 6 7 8 9
4 | 4 5 6 7 8 9
5 | 5 6 7 8 9
6 | 6 7 8 9
7 | 7 8 9
8 | 8 9
9 | 9

Odejmowanie:

- | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 | 0 1 2 3 4 5 6 7 8 9
1 |   0 1 2 3 4 5 6 7 8
2 |     0 1 2 3 4 5 6 7
3 |       0 1 2 3 4 5 6
4 |         0 1 2 3 4 5
5 |           0 1 2 3 4
6 |             0 1 2 3
7 |               0 1 2
8 |                 0 1
9 |                   0

Mnożenie:

* | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 | 0 0 0 0 0 0 0 0 0 0
1 | 0 1 2 3 4 5 6 7 8 9
2 | 0 2 4 6 8
3 | 0 3 6 9
4 | 0 4 8
5 | 0 5
6 | 0 6
7 | 0 7
8 | 0 8
9 | 0 9

Podział:

/ | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 | 
1 | 0 1 2 3 4 5 6 7 8 9
2 | 0   1   2   3   4
3 | 0     1     2     3
4 | 0       1       2
5 | 0         1
6 | 0           1
7 | 0             1
8 | 0               1
9 | 0                 1

Potęgowanie:

^ | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 |   1 1 1 1 1 1 1 1 1
1 | 0 1 2 3 4 5 6 7 8 9
2 | 0 1 4 9
3 | 0 1 8
4 | 0 1
5 | 0 1
6 | 0 1
7 | 0 1
8 | 0 1
9 | 0 1

Modulo:

% | 0 1 2 3 4 5 6 7 8 9
-----------------------
0 | 
1 | 0 0 0 0 0 0 0 0 0 0
2 | 0 1 0 1 0 1 0 1 0 1
3 | 0 1 2 0 1 2 0 1 2 0
4 | 0 1 2 3 0 1 2 3 0 1
5 | 0 1 2 3 4 0 1 2 3 4
6 | 0 1 2 3 4 5 0 1 2 3
7 | 0 1 2 3 4 5 6 0 1 2
8 | 0 1 2 3 4 5 6 7 0 1
9 | 0 1 2 3 4 5 6 7 8 0

Zasady konkursu:

  • Końcowe znaki nowej linii i końcowe spacje są opcjonalne
  • Poziome i pionowe linie w przypadkach testowych są opcjonalne. Dodałem je tylko dla lepszej czytelności.
  • Odstępy między wynikami NIE są opcjonalne.
  • Symbol arytmetyki może być inny, o ile jest jasne, który to jest. Tj. ×Lub ·zamiast *do mnożenia; ÷zamiast /do podziału; itp.
    I tak długo, jak jest to jedna postać, przepraszam za Python **.
  • Format wejściowy jest elastyczny. Możesz wybrać indeks od 0-5 lub 1-6 dla odpowiednich sześciu tabel; możesz wprowadzić symbol argumentu; itp. (W przeciwieństwie do tego, co wyświetlasz w wyniku, możesz wpisać pełne ciągi lub **w przypadku Pythona.)
    Po prostu upewnij się, że określisz format wejściowy, którego używasz w swojej odpowiedzi!

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

† Przykład prawidłowego wyniku bez linii poziomych i pionowych, ÷jako symbol i użycie y/xzamiast x/y:

÷ 0 1 2 3 4 5 6 7 8 9
0   0 0 0 0 0 0 0 0 0
1   1
2   2 1
3   3   1
4   4 2   1
5   5       1
6   6 3 2     1
7   7           1
8   8 4   2       1
9   9   3           1

Czy podanie wyniku może być dzielone przez zero, jeśli taki jest wynik w naszym języku? Np. W APL 0 ÷ 0 to domyślnie 1, a N mod-0 to N? Można również wybrać inny schemat, w którym dzielenie przez zero zawsze wynosi zero.
Adám,

Czy wolno nam więcej niż jedna spacja między kolumnami?
Adám

@ Adám Przepraszamy za ostatnią odpowiedź. Co do twojego pierwszego pytania: nie przepraszam. Wiem, że niektóre języki drukują 1, inne 0, inne coś innego 0^0lub dzielą / mod 0, ale będziesz musiał to obejść. Jeśli chodzi o twoje drugie pytanie: tak, o ile cyfry są nadal w tych samych kolumnach / wierszach, możesz użyć tyle spacji, ile chcesz.
Kevin Cruijssen

Czy kolejność argumentów jest ważna dla operacji nieprzemiennych?
Adám

@ Adam więc oznaczać będziesz wyjście siatkę dla y-x, y/x, y^xa y%xzamiast x-y, x/y, x^yi x%y? Hmm, chyba dobrze. Zmienię to w odpowiedzi; tak długo, jak będziesz konsekwentny dla wszystkich sześciu z nich (więc nie y-xi x/yw tej samej odpowiedzi).
Kevin Cruijssen

Odpowiedzi:


7

Japt , 45 bajtów

Współpracował z @ETHproductions

AÆAÇU¥'p«Z«XªOvZ+U+X)+P r"..+"SÃuXÃuAo uU)m¸·

Uruchom to online!

Pobiera dane wejściowe jako:

"+" do dodania

"-" do odejmowania

"*" do mnożenia

"/" do podziału

"p" do potęgowania

"%" dla modulo

Objaśnienie (z rozszerzonymi skrótami):

AÆ  AÇ  U¥ 'p«  Z«  Xª OvZ+U+X)+P r"..+"SÃ uXÃ uAo uU)m¸  ·
AoX{AoZ{U=='p&&!Z&&!X||OvZ+U+X)+P r"..+"S} uX} uAo uU)mqS qR

A                                                             // By default, 10 is assigned to A
 o                                                            // Create a range from [0...9]
  X{                                         }                // Iterate through the range, X becomes the iterative item
    Ao                                                        //   Create another range [0...9]
      Z{                                 }                    //   Iterate through the range, Z becomes the iterative item
                                                              //     Take:
        U=='p                                                 //       U (input) =="p"
             &&!Z                                             //       && Z != 0
                 &&!X                                         //       && X != 0
                     ||                                       //     If any of these turned out false, instead take
                       Ov                                     //       Japt Eval:
                         Z+U+X                                //         Z{Input}X
                              )+P                             //     Whichever it was, convert to a string
                                  r"..+"S                     //     Replace all strings of length 2 or more with " "
                                                              //     (this makes sure the result !== "false" and has length 1)
                                           uX                 //   Insert X (the row number) into the front of the row
                                               u              // Insert at the beginning the first row:
                                                Ao            //   [0...9]
                                                   uU)        //   with the input inserted at the beginning
                                                      mqS     // Join each item in the final array with " "
                                                          qR  // Join the final array with "\n"

8

JavaScript (ES7), 128 bajtów

f=
c=>[...c+`0123456789`].map((r,_,a)=>a.map(l=>l==c?r:r==c?l:/^\d$/.test(l=c<`^`?eval(l+c+r):l|c?l**r:l/r)?l:` `).join` `).join`
`
<select onchange=o.textContent=f(this.value)><option>><option>+<option>-<option>*<option>/<option>%<option>^<option>&<option>,<option>.</select><pre id=o>

Specjalna obudowa 0^0kosztowała mnie 8 bajtów.


Bardzo fajnie, jak dodałeś dodatkowe operandy, takie jak OR i AND, do twojego fragmentu testowego. +1
Kevin Cruijssen

@KevinCruijssen Musiałem usunąć LUB, aby zapisać bajt (wszyscy inni operatorzy sortują wcześniej ^), ale dzięki!
Neil,

5

Operacyjny język skryptowy Flashpoint , 343 333 303 301 bajtów

f={o=_this;s=o+" 0 1 2 3 4 5 6 7 8 9\n";i=0;while{i<10}do{j=0;s=s+format["%1",i];if(i<1&&(o=="/"||o=="%"||o=="^"))then{if(o=="^")then{if(j<1)then{s=s+"  ";j=1}}else{s=s+"\n1";i=1}};while{j<10}do{r=call format["%1%2%3",j,o,i];if(r>9||r<0||r%1>0)then{r=" "};s=s+format[" %1",r];j=j+1};s=s+"\n";i=i+1};s}

Zadzwoń z:

hint ("+" call f)

Nie golfowany:

f=
{
    o=_this;
    s=o+" 0 1 2 3 4 5 6 7 8 9\n";
    i=0;
    while{i<10}do
    {
        j=0;
        s=s+format["%1",i];
        if(i<1&&(o=="/"||o=="%"||o=="^"))then
        {
            if(o=="^")then{if(j<1)then{s=s+"  ";j=1}}
            else{s=s+"\n1";i=1}
        };
        while{j<10}do
        {
            r=call format["%1%2%3",j,o,i];
            if(r>9||r<0||r%1>0)then{r=" "};
            s=s+format[" %1",r];
            j=j+1
        };
        s=s+"\n";
        i=i+1
    };
    s
}

Wynik:

operator +

operator -

operator *

operator /

operator ^

operator%


5

Python 2 , 240 231 226 224 203 202 200 197 bajtów

a=i=input()
R=range(10)
for z in R:a+=' '+`z`
print a
for x in R:
 try:
	d=`x`
	for b in R:c=eval("b%s(x*1.)"%('**',i)[i<'^']);d+=' '+(' ',`int(c)`)[(i<'^'or x+b>0)and c in R]
 except:pass
 print d

Wypróbuj online!

Pobiera dane wejściowe jako „+”, „-”, „*”, „/”, „^” lub „%”.

Edycje

-9 -16 dzięki dzięki @FelipeNardiBatista za wspaniałe wskazówki

Zejdź do 221 z większą pomocą @FelipeNardiBatista, a następnie do 203, przegrywając and E(c)==int(E(c)). Jeśli sprawdzamy, czy E(c)jest w range(10)środku, zawsze będzie liczbą całkowitą, jeśli tam jest. Nie ma potrzeby powielania kontroli.

To musi spaść poniżej 200 bez przełączania się na Python 3 i deklarowania P=print. Jakieś pomysły? Zawsze chętnie się uczę.

Tak! Wiedziałem, że da się to zrobić. 197. Czas na łóżko teraz. Spędziłem na tym wystarczająco dużo czasu. Dzięki za interesujące wyzwanie @KevinCruijssen.


1
('**',i)[i<'^']i (i<'^'or x>0 or b>0)oszczędza 4 bajty
Felipe Nardi Batista

1
a=i=input()z for z in R:a+=' '+`z`pewnymi dodatkowymi bajtami zapisanymi vsa=i+' 0 1 2 3 4 5 6 7 8 9'
Felipe Nardi Batista

1
1.vs 1.0i E(c)in Rvs -1<E(c)<10dla 2 bajtów
Felipe Nardi Batista

1
x+b>0vs x>0 or b>0i "b%s(x*1.)"%('**',i)[i<'^']vs"b"+('**',i)[i<'^']+"(x*1.)"
Felipe Nardi Batista

1
jest jeden zestaw dodatkowych paren (, )w twoim złączeniu na 223 bajty
Felipe Nardi Batista

4

Mathematica, 150 bajtów

r=0~Range~9;p=Prepend;±i_:=Grid@p[p[If[0<=#<=9,#]/._@__->""&/@<|Thread[Characters@"+-*/^%"->{Plus,#-#2&,1##&,#/#2&,Power,Mod}]|>[i][r,#],#]&/@r,r~p~i]

Definiuje jednoargumentową funkcję, ±która pobiera jeden ze znaków +-*/^%jako dane wejściowe i(tak na przykład ±"^") i zwraca Gridobiekt, który wygląda dokładnie tak, jak ostatni wynik w OP.

<|Thread[Characters@"+-*/^%"->{Plus,#-#2&,1##&,#/#2&,Power,Mod}]|>kojarzy z każdym możliwym znakiem wejściowym odpowiednią (wymienną) funkcję binarną (gdzie #-#2&,1##&,#/#2&są wersje gry w golfa Subtract,Times,Divide); dlatego <|...|>[i][r,#]oblicza operację binarną ze wszystkimi możliwymi pierwszymi argumentami i #jako drugi argument. If[0<=#<=9,#]/._@__->""&konwertuje każdy wynik na a Nulllub ""jeśli nie jest to wynik jednocyfrowy ( /._@__->""jest to konieczne, ponieważ niektóre wyniki, takie jak, 1/0nie mogą być przetworzone przez nierówności 0<=#<=9). Na koniec przygotowujemy różne nagłówki i stopki i wyświetlamy odpowiedź.


Ładna odpowiedź i wyjaśnienie. Czy może masz link Try-it-online? I jedno pytanie / uwaga: nie widzę żadnej wzmianki o regule dotyczącej krawędzi: „ Nie wydamy nic dla przypadku krawędzi 0^0. ” Czy Mathematica domyślnie nic nie wyświetla dla tego przypadku?
Kevin Cruijssen

1
Dodałem link powyżej. Mathematica ocenia 0^0to Indeterminate, co daje nam nieszczęśliwy, nieoceniony wynik w If[0<=Indeterminate<=9, Indeterminate]połowie obliczeń; ale /._@__->""jest regułą, która przyjmuje każdą nieocenioną funkcję i jej argumenty i zamienia ją na niewidoczny ciąg.
Greg Martin,

Ach ok, więc Mathematica poprawnie zwraca, że ​​występują dwie sprzeczne reguły #^0=1i 0^#= 0` 0^0. Dobrze do tej pory i wygodne dla tego wyzwania. :) Btw, twój link nie działa. Pojawia się błąd, że nie mam uprawnień dostępu do niego.
Kevin Cruijssen

Ok, musisz przejść do sandbox.open.wolframcloud.com i wkleić kod do siebie, a następnie wywołać go poleceniem podobnym do ±"^".
Greg Martin

4

Python 3, 343 335 363 362 bajtów

Najsmutniejsze w tym jest to, że bije mnie odpowiedź Javy ... Rano zagram w golfa.

o=input()
r=range(10)
g=[['']*10 for i in r]
for x in r:
 for y in r:exec('if"/"!=o and(o!="%"or x)and(o!="**"or x or y):k=str(y'+o+'x);g[x][y]=k')
if'/'==o:
 for x in r:
  for y in r:
   if x and y%x<1:g[x][y]=str(round(y/x))
if'**'==o:o='^'
print('\n'.join([' '.join([o]+list(map(str,r)))]+[' '.join([str(q)]+[' 'if len(x)!=1else x for x in g[q]])for q in r]))

Zamień

-8 bajtów, przełączając się na rozumienie listy zamiast podwójnej pętli
+28 bajtów, aby uniknąć wielkości krawędzi 0 ^ 0. -.-
-1 bajt, zmieniając ==0na <1dzięki @StewieGriffin


Najsmutniejsze w tym jest to, że bije mnie odpowiedź Java… ” Ta część sprawiła, że ​​zachichotałem… xD Podoba mi się to, jak sprawdzasz długość numeru, aby ustalić, czy jest w zakresie 0-9. Btw, umm .. Zauważyłem jeden błąd w twoim Repl. Obecnie wyprowadza **zamiast ^potęgowania. (Ponadto możesz wprowadzać dane **, ale nie wypisywać ich w tabeli wyników. Obecnie masz to na odwrót.)
Kevin Cruijssen

1
@KevinCruijssen Whoops. Naprawiono pomyślnie, bez zmiany liczby bajtów. Dzięki za zwrócenie na to uwagi!
HyperNeutrino,

@StewieGriffin Tak. Dziękuję Ci.
HyperNeutrino

4

Java 7, 312 305 bajtów

String c(int o){String r=("+-*/^%".charAt(o))+" 0 1 2 3 4 5 6 7 8 9\n";for(int i=0,j,p;i<10;i++){r+=i+" ";for(j=0;j<10;r+=p<0|p>9?"  ":p+" ")p=p(o,i,j++);r+="\n";}return r;}int p(int o,int a,double b){b=o<1?b+a:o<2?b-a:o<3?b*a:o<4&a>0?b/a:o<5&(a!=0|b!=0)?Math.pow(b,a):a>0?b%a:-1;return b%1==0?(int)b:-1;}

Nie używa linii poziomych / pionowych, a znaki są wyświetlane w przykładach wyzwania ( +-*/^%).
Używa indeksu 0-5dla sześciu operandów matematycznych jako danych wejściowych.

-7 bajtów dzięki @Frozn .

Wyjaśnienie:

String c(int o){                   // Method with integer parameter and String return-type
  String r = ("+-*/^%".charAt(o))  //  Get the current mathematical operand character based on the input index
    + " 0 1 2 3 4 5 6 7 8 9\n";    //  Append the column header and a new-line
  for(int i=0,j,p; i<10; i++){     //  Loop over the rows
    r += i+" ";                    //   Append the left-side row-nr
    for(j=0; j<10;                 //   Inner-loop over the columns of the current row
        r += p<0|p>9?"  ":p+" ")   //     And after every iteration, append the result with either a space or an integer
      p = p(o,i,j++);              //    Calculate the current sum-result
                                   //   End of inner-loop (implicit / single-line body)
    r+="\n";                       //   Append result with new-line
  }                                //  End of loop
  return r;                        //  Return result String
}                                  // End of method

int p(int o,int a,double b){       // Separate method with two integer and a double parameters and integer return-type
  b = o<1 ?                        //  If the given operand is 0:
       b+a                         //   Use addition
      : o<2 ?                      //  Els-if the given operand is 1:
       b-a                         //   Use subtraction
      : o<3 ?                      //  Else-if the given operand is 2:
       b*a                         //   Use multiplication
      : o<4 & a>0 ?                //  Else-if the given operand is 3 and `a` is above 0:
       b/a                         //   Use division
      : o<5 & (a!=0|b!=0) ?        //  Else-if the given operand is 4 and not both `a` and `b` are 0:
       Math.pow(b,a)               //   Use exponentiation
      : a>0 ?                      //  Else-if the given operand is 5:
       b%a                         //   Use modulo
      :                            //  Else:
       -1;                         //   Use -1 as result
  return b%1 == 0 ?                //  If the result is not a decimal number:
     (int)b                        //   Return the result
    :                              //  Else:
     -1;                           //   Return -1 as result
}                                  // End of separate method

Kod testowy:

Wypróbuj tutaj.

class M{
  String c(int o){String r=("+-*/^%".charAt(o))+" 0 1 2 3 4 5 6 7 8 9\n";for(int i=0,j,p;i<10;i++){r+=i+" ";for(j=0;j<10;r+=p<0|p>9?"  ":p+" ")p=p(o,i,j++);r+="\n";}return r;}int p(int o,int a,double b){b=o<1?b+a:o<2?b-a:o<3?b*a:o<4&a>0?b/a:o<5&(a!=0|b!=0)?Math.pow(b,a):a>0?b%a:-1;return b%1==0?(int)b:-1;}

  public static void main(String[]a){
    M m = new M();
    System.out.println(m.c(0)); // +
    System.out.println(m.c(1)); // -
    System.out.println(m.c(2)); // *
    System.out.println(m.c(3)); // /
    System.out.println(m.c(4)); // ^
    System.out.println(m.c(5)); // %
  }
}

1
Może można przekazać bjako doublecelu pi pozbyć się rpoprzez przypisanie wartości do powiązanej trójskładnikowych b.
Frozn

3

Haskell, 230 199 182 + 53 47 46 + 1 bajt separatora = 284 247 232 229 bajtów

f=head.show
g=[0..9]
h=(:" ")
y(%)s=unlines$(s:map f g>>=h):[f y:[last$' ':[f(x%y)|x%y`elem`g]|x<-g]>>=h|y<-g]
0?0=10;a?b=a^b
a!0=10;a!b|(e,0)<-a`divMod`b=e|1>0=10
a&0=10;a&b=mod a b

Funkcja polega na tym (zipWith y[(+),(-),(*),(!),(?),(&)]"+-*/^%"!!), że sam zajmuje 53 bajty, gdzie 0 to dodawanie, 1 to odejmowanie, 2 to mnożenie, 3 to dzielenie, 4 to potęgowanie, a 5 to modulo.

Wypróbuj online!

Wyjaśnienie

W przyszłości (prawdopodobnie). . . . Na razie trochę ciekawostek:? jest operatorem potęgowania! jest operatorem podziału i operatorem mod.

EDYCJA: Część zbiorcza może być spowodowana tym, że większość (?) Pozostałych odpowiedzi używa wartości eval, której Haskell nie ma bez długiego importu.

EDIT2: Dzięki Ørjan Johansen za -31 bajtów (Wow!) Wyłączony kod i -6 bajtów wyłączonych z funkcji! Zmieniono również niektóre z 11 na 10 w celu zachowania spójności.Wypróbuj zaktualizowaną wersję online!

EDYCJA 3: Ta sama osoba, jeszcze siedemnaście bajtów! Wypróbuj zaktualizowaną, zaktualizowaną wersję online!


1
Krótsze !testy: e<-a`div`b,e*b==a=elub (e,0)<-a`divMod`b=e.
Ørjan Johansen

1
Krótsza funkcja:(zipWith(#)"+-*/^%"[(+),(-),(*),(!),(?),(&)]!!)
Ørjan Johansen

Testy cofania + „standardowa” sztuczka golfowa daje last$f k:[' '|k<0||k>9]. Wreszcie (być może) [0..9]jest na tyle długi, że opłaca się zdefiniować go jako nazwę przy dwukrotnym użyciu.
Ørjan Johansen

Nie, jeszcze jedno: k<-[o x y]jest krótszy niż a let.
Ørjan Johansen

Jedno słowo: Wow! :)
Ogólna nazwa wyświetlana

2

Python 2 , 197 bajtów

p=input()
r=range(10)
s=' '
print p+s+s.join(map(str,r))
for i in r:print str(i)+s+s.join(eval(("s","str(j"+p+"i)")[i and(j%i==0 and'/'==p or'%'==p)or p in'**+-'and eval("j"+p+"i")in r])for j in r)

Wypróbuj online!

Dane wejściowe: Python 2

'+' Dodanie

'-' Sbtraction

'*' Mnożenie

'/' Podział

'**' Potęgowanie

'%' Modulo

Python 3 , 200 bajtów

p=input()
r=range(10)
s=' '
print(p+s+s.join(map(str,r)))
for i in r:print(str(i)+s+s.join(eval(("s","str(j"+p+"i)")[i and(j%i==0 and'/'in p or'%'==p)or p in'**+-'and eval("j"+p+"i")in r])for j in r))

Wypróbuj online!

Dane wejściowe: Python 3

+ Dodanie

- Sbtraction

* Mnożenie

// Podział

** Potęgowanie

% Modulo

Wyjaśnienie

przechowując range(10)zmienną r, możemy uzyskać pierwszy wiersz wyniku formatu

operator 0 1 2 3 4 5 6 7 8 9

poprzez mapowanie każdej int w rciągu i łączenie listy ciągów ['0','1','2','3','4','5','6','7','8','9']spacją sz poperatorem

p+s+s.join(map(str,r)

Z tym, dla każdego iw r(zakresie), dla każdej joceny ii ju operatora

eval("j"+p+"i")

w tym przypadku wyjątek może zostać zgłoszony, jeśli nie zostanie obsłużony - dzielenie lub moduł przez 0. Aby obsłużyć ten przypadek ( i and(j%i==0 and'/'==p or'%'==p)) i format wyjściowy opisany w instrukcji problemu (wynik dla każdej oceny nie powinien być liczbą ujemną ani liczbą większą niż 10 - eval("j"+p+"i")in r),

i and(j%i==0 and'/'==p or'%'==p)or p in'**+-'and eval("j"+p+"i")in r

W ten sposób drukujemy tabelę arytmetyczną!

Happy Coding!


Niezła odpowiedź na Python 2. Zgadnij w 197 roku, co czyni nas równymi. Zajęło mi to jeszcze kilka prób. Dobra robota. Niewielki problem. Dla / tabela pokazuje .0, a nie liczby całkowite. Pewnie, że łatwo to poprawić :)
ElPedro

Przepraszam, ale wycofałem moją opinię, gdy ją zobaczyłem, dodam ją ponownie, gdy będzie można ją poprawić :)
ElPedro

Dziękuję Ci! Ale Python 2 wypisuje int, a Python 3 wypisuje, jeśli użyjesz '/' jako wejścia. Fir fir python 3 musisz użyć „//”. Wyraźnie o tym wspomniałem.
Keerthana Prabhakaran

I wygląda na to, że ktoś edytuje mój link, a link do python 2 został zmieniony na python 3. Teraz go przywróciłem.
Keerthana Prabhakaran

Miałem już ten problem. To dlatego, że masz 2 linki TOI na tej samej stronie. Po kliknięciu dowolnego łącza otworzy się pierwsza znaleziona definicja łącza. Obejdź to, zmieniając nazwę drugiego linku na „wypróbuj online 3” lub coś takiego, a także zmień nazwę definicji linku. Powinien więc działać dobrze.
ElPedro

2

APL (Dyalog) , 68 76 bajtów

Wymaga ⎕IO←0ustawienia domyślnego w wielu systemach. Monituje o wejście i oczekuje pojedynczego znaku reprezentującego operand.

t'|'=w←⎕
(w,n),n⍪⍉⍣t∘.{(⍺w⍵≡0'*'0)∨(t∧⍵≡0)∨⍺w0'÷':⍬
n∊⍨r←⍵(⍎w)⍺:r
⍬}⍨n←⍳10

Wypróbuj online!

Znaczna część kodu ma na celu obejście wyników APL dla ÷0i 0*0przeciwdziałanie modułowi APL (| ) ma odwrócone argumenty w porównaniu do większości innych języków. Byłoby tylko 41 bajtów przeciwnym razie :

w←⎕
(w,n),n⍪∘.{0::⍬
÷n∊⍨r←⍵(⍎w)⍺:r}⍨n←⍳10

Wypróbuj online!


Łał! i po wszystkim moja ciężka praca nad odpowiedzią na Python. Uczciwa gra.
ElPedro,

1

R , 194 177 bajtów

-17 bajtów przełączania na manipulowanie danymi wyjściowymi macierzy

function(o){s=0:9
y=sapply(s,function(x)Reduce(o,x,init=s))
dimnames(y)=list(s,rep('',10))
y[!y%in%s|!is.finite(y)]=' '
if(o=='^')y[1]=' '
cat(substr(o,1,1),s)
print(y,quote=F)}

Wypróbuj online!

Przejście na to podejście ma pewne wady, a mianowicie nie można go zoptymalizować za pomocą pryr i jest trochę nieporęczne w ustawianiu oryginalnej macierzy, ale można go wyprowadzić idealnie z pewnymi końcowymi spacjami w pierwszym wierszu.

Nadal muszę użyć tej substrsztuczki z powodu %%operatora mod. Będę nadal go przycinać, gdy będę miał szansę, nadal czuję się niezgrabnie zajmując się specjalnymi przypadkami.


0

PHP, 191 bajtów

**zamiast ^jako dane wejściowe+ - / % * **

echo$k=$argn,$k=="**"?"":" ",join(" ",$d=range(0,9));foreach($d as$r){echo"\n$r";foreach($d as$c){echo" ";($k=="/"|($m=$k=="%"))&$r<1?print" ":eval("echo in_array($c$k$r,\$d)?$c$k$r:' ';");}}

Wersja online obu wersji

PHP, 245 bajtów bez ewaluacji

Wejście + - / % * ^

użyj bcpowmod($c,1,$r)zamiast, bcmod($c,$r)ponieważ potrzebuję trzeciego parametru w danych wejściowych dzielenia. $c**1%$r==$c%$r

Funkcje matematyczne BC

echo$k=$argn," ".join(" ",$d=range(0,9));foreach($d as$r){echo"\n$r";foreach($d as$c)echo" ",in_array($s=($k=="/"|($m=$k=="%"))&$r<1?-1:("bc".["+"=>add,"-"=>sub,"/"=>div,"*"=>mul,"^"=>pow,"%"=>powmod][$k])($c,$m?1:$r,$m?$r:9),$d)?round($s):" ";}

0

05AB1E , 56 55 bajtów

9ÝDãεðýì„/%Iåyθ_*I'mQyO_*~iðë.VD9ÝQàiïëð]«TôεN<š}®I:ðý»

Wyjścia bez linii iz odwróconym xi y. Wejście / wyjście używasz +, -, *, /, m, %.

Wypróbuj online lub sprawdź wszystkie tabele .

21 bajty są stosowane w przypadkach, krawędź ustalenie /0, %0i 0^0, w wyniku których 0, 0oraz 1odpowiednio w 05AB1E .. tu bez tej części ( 34 bajtów )

9ÝDãεðýì.VD9ÝQàiïëð]«TôεN<š}®I:ðý»

Wypróbuj online lub wypróbuj wszystkie stoły .

Wyjaśnienie:

9Ý                     # Push list [0,1,2,3,4,5,6,7,8,9]
  D                    # Duplicate it (for the header later on)
   ã                   # Take the cartesian product with itself (creating all pairs):
                       #  [[0,0],[0,1],[0,2],...,[9,7],[9,8],[9,9]]
ε                      # Map each pair `y` to:
 ðý                    #  Join the pairs with a space
   ì                   #  Prepend it before the (implicit) input-char 
 „/%Iå                 #   If the input is "/" or "%"
         *             #   and
      yθ_              #   The last value of the pair is exactly 0
                  ~    #  OR
          I'mQ        '#   If the input is "m"
                 *     #   and
              yO_      #   The sum of the pair is exactly 0 (thus [0,0])
 i                     #  If that is truthy:
  ð                    #   Push a space character " "
 ë                     #  Else:
  .V                   #   Execute the string as 05AB1E code
    D                  #   Duplicate the result
     9ÝQài             #   If it's in the list [0,1,2,3,4,5,6,7,8,9]:
          ï            #    Cast it to an integer to remove any trailing ".0"
                       #    (since dividing always results in a float)
         ë             #   Else:
          ð            #    Push a space character " "
]                      # Close both the if-else clauses and the map
 «                     # Merge the resulting list with the duplicated [0,1,2,3,4,5,6,7,8,9]
  Tô                   # Split the list in parts of size 10
    ε   }              # Map each list to:
     N<                #  Get the map-index + 1
       š               #  And prepend it at the front of the list
         ®I:           # Then replace the "-1" with the input-character
ðý                     # And finally join every inner list by spaces
  »                    # And join the entire string by newlines (which is output implicitly)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.