Utwórz tabelę am * n w HTML


22

Wejście:

Dwie liczby dziesiętne mi nktóre odpowiednio podać liczbę wierszy i kolumn w tabeli. mi nsą większe lub równe 1.

Wyjście:

Tabela w HTML, która ma m wierszy i n kolumn.

Stół powinien być wyświetlany przez wybraną przez ciebie nowoczesną przeglądarkę. Większość przeglądarek wyświetla wszystko poprawnie, nawet jeśli tagi nie są zamknięte. Właściwe wcięcie i odstępy są opcjonalne.

W każdej komórce powinien znajdować się co najmniej jeden znak (spacja).

Komórki w pierwszym wierszu powinny używać <th>znaczników, a komórki w kolejnych wierszach powinny używać <td>znaczników.

Warunek wygranej:

To jest więc wygrywa najkrótszy kod źródłowy dla każdego języka.

Przykład wprowadzania:

2 3

Przykład wyjściowy:

<table>
 <tr>
   <th>A</th>
   <th>A</th>
   <th>A</th>
 </tr>
 <tr>
   <td>A</td>
   <td>A</td>
   <td>A</td>
 </tr>
</table>

lub: <table><tr><th>A<th>A<th>A<tr><td>A<td>A<td>A


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Mego

Odpowiedzi:


7

APL (Dyalog Unicode) z MiServer 3.0 , 31 30 bajtów SBCS

Pełny program Monituje stdin dla listy dwóch elementów [m,n]i wypisuje ścisłe XHTML na standardowe wyjście.

(⎕NEW _.Table((⎕⍴0)⍬1)).Render

Przykładowa sesja:

      )xload C:\Users\Adam.DYALOG\Documents\MiServer\miserver.dws
C:\Users\Adam.DYALOG\Documents\MiServer\miserver.dws saved Wed Mar  7 17:19:40 2018
      Load ''
Development environment loaded
MiSite "C:/Users/Adam.DYALOG/Documents/MiServer/MS3/" loaded
      (⎕NEW _.Table((⎕⍴0)⍬1)).Render
⎕:
      2 3
<table id="id691498143"><thead><tr><th>0</th><th>0</th><th>0</th></tr></thead><tbody><tr><td>0</td><td>0</td><td>0</td></tr></tbody></table>

Wypróbuj online!

Wyjaśnienie:

().Render Renderuj następujący element HTML:

⎕NEW _.Table () Nowa tabela z następującymi parametrami:

  () ⍬ 1 Następująca treść, bez specjalnej stylizacji, 1 wiersz nagłówka:

   ⎕⍴0 oceniane wejście zmienia kształt zera (tj. macierz zer m, n-kolumn)


6

JavaScript (ES6), 70 bajtów

Zaoszczędzono 2 bajty dzięki @RickHitchcock

Pobiera dane wejściowe w składni curry (m)(n).

m=>n=>'<table>'+(g=c=>'<tr>'+`<t${c}>A`.repeat(n))`h`+g`d`.repeat(m-1)

Wypróbuj online!

Próbny




3

JavaScript, 65 bajtów

f=(m,n)=>m?f(--m,n)+'<tr>'+`<t${m?'d':'h'}>x`.repeat(n):'<table>'

document.write(f(4,3));


rekurencja. miły!
mazzy

2

05AB1E , 30 bajtów

’<…È>’sF"<tr>"„hdNĀè"<tÿ>A"I×J

Wypróbuj online!

Wyjaśnienie

’<…È>’                           # push "<table>"
      sF                         # no-of-rows times do:
        "<tr>"                   # push "<tr>"
              „hd                # push "hd"
                 NĀ              # push the iteration counter truthified
                   è             # index into the 2-char string with this
                    "<tÿ>A"      # insert the result into the string "<tÿ>A" instead of ÿ
                           I×    # repeat this string no-of-columns times
                             J   # join the stack to a single string

2

Stax , 28 bajtów

üÉ$♠═?S┼╪├8°‼←sí☼←T≡┴╜ô‼\↑0ⁿ

Uruchom i debuguj

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

"<table>"P  print "table"
"<th>A"*    "<th>A" repeated specified number of times
,D          repeat the rest of the program specified number of times
  "<tr>"p   print "<tr>" with no newline
  Q         print top of stack without popping
  .hd|t     replace "h" with "d"

Uruchom ten


2

Java 10, 139 133 102 bajtów

m->n->{var r="<table>";for(int j=0,i;j++<m;)for(r+="<tr>",i=n;i-->0;r+=j<2?"<th>A":"<td>B");return r;}

Wypróbuj online.

Wyjaśnienie:

n->m->{                  // Method with two integer parameters and String return-type
  var r="<table>";       //  Result-String, starting at "<table>"
  for(int j=0,i;j++<m;)  //  Loop `j` over the rows in the range [0, `m`)
    for(r+="<tr>",       //   Append "<tr>" to the result
        i=n;i-->0;       //   Inner loop `i` over the columns in the range [`n`, 0)
      r+=j<2?            //    If `j` is 1 (first iteration):
          "<th>A"        //     Append "<th>A" to the result
         :               //    Else:
          "<td>B");      //     Append "<td>B" to the result
  return r;}             //  Return the result

Myślę, że jest trochę literówki, napisałeś „th” dwa razy.
ziemniak

@potato Ach, masz rację. Sam kod i łącze TIO były poprawne, ale moje wyjaśnienie zawierało literówkę. Teraz powinno zostać naprawione, dzięki.
Kevin Cruijssen

(m,n)->{var l="<tr>";for(;n-->0;)l+="<td>A";var s="<table>"+l.replace('d','h');for(;--m>0;)s+=l;return s;}(106 bajtów) Znalazłem ten interesujący, ale nie warty, biorąc pod uwagę twój obecny wynik. Prawdopodobnie możesz trochę pograć w golfa, używając pomysłów takich jak mutable m.
Olivier Grégoire

@ OlivierGrégoire Początkowo miałem modyfikowalne m, ale ze względu na różnice <th>/ <td>nie miałoby to znaczenia. Nadal muszę sprawdzić, czy jest to pierwsza iteracja pętli zewnętrznej, w którym to przypadku potrzebuję obu ji m, i muszę wykonać pętlę wewnętrzną wiele razy, w takim przypadku potrzebuję ii n. Zamiast iść w górę od 0 i sprawdzić j<2, mógłbym wrócić i sprawdzić i>m-2, ale będzie to +1 bajt zamiast -1. Twoje podejście do używania dwóch oddzielnych pętli z możliwością modyfikacji mi njest rzeczywiście interesujące. :)
Kevin Cruijssen

2

APL (Dyalog Unicode) , 42 38 bajtów SBCS

-4 dzięki ngn.

Pełny program Monituje stdin dla listy dwóch elementów [m, n] i wypisuje niezamknięte tagi na standardowe wyjście.

'<table>',∊'<tr>',⍤1{'d'}@3⍀⎕⍴⊂'<th>A'

Wypróbuj online!

⊂'<th>A' dołącz ten ciąg, aby traktować go jako całość

⎕⍴ szybka wymiarów i cyklicznie r eshape pojedynczej komórki do matrycy, że wielkość

…⍀ kumulatywnie wstaw następującą funkcję między każdą pionową parą komórek:

{'d'}@3 zignoruj ​​górną komórkę; umieść dna 3. pozycji w dolnej komórce

'<tr>',⍤1 dodaj ten ciąg do każdego wiersza

ε nlist (spłaszczyć)

'<table>', dodaj ten ciąg




@ngn Wszystko gotowe. Dzięki. Istotne .
Adám

2

C (gcc) , 107 99 98 97 bajtów

i;f(x,y){char s[]="<th>A";for(puts("<table><tr>");x--;s[2]=96+puts("<tr>"))for(i=y;i--;)puts(s);}

Wypróbuj online!

-8 bajtów dzięki ziemniakowi

-2 bajty dzięki pułapkowi cat

sTablica musi zostać zadeklarowana jako nie tablica wskaźnik w przeciwnym razie nie będzie można edytować (możemy ustawić pierwszy h do reklamy). Większość przeglądarek nawet nie dba o to, czy tag zamykający jest poprawny, więc zamykamy wszystkie za pomocą </t>.


Nadal działa dobrze, jeśli usuniesz </t>pojawiający się dwukrotnie i -8 bajtów.
ziemniak

Możesz ogolić jeszcze 4 bajty, jeśli przesuniesz wyjście nowego wiersza do wewnętrznej pętli (unikniesz też pustego rzędu): Wypróbuj online!
ErikF,

2

R , 73 bajty

function(n,m)cat("<table><tr>","<th>A"<m,c("<tr>","<td>A"<m)<n-1)
"<"=rep

Wypróbuj online!

Zapisano 7 bajtów z brudnym włamaniem - zamień „rep” na „<”.


1

Haskell , 109 107 103 bajtów

n!i="<t"++n++'>':i++"</t"++n++">"
r#c="able"!("r"!([1..c]*>"h"!"H")++([2..r]*>("r"!([1..c]*>"d"!"A"))))

Tyle nawiasów… Dzięki @nimi za dwa bajty (i utratę ogólności)!

Wypróbuj online!

Bez tagów końcowych prosta implementacja wygrywa przy 87 bajtach ( Wypróbuj online ):

r?c="<table><tr>"++([1..c]*>"<th>H")++([2..r]*>("<tr>"++([1..c]*>"<td>A")))++"</table>"

1

APL + WIN, 68 63 56 bajtów

W sumie 12 bajtów zaoszczędzonych dzięki Adámowi

Monity o liczbę wierszy, a następnie liczbę kolumn i opcji wyjścia niezamknięcia:

t←⊂'<tr>'⋄'<table>'t(n⍴⊂'<th>A'),,t,((⎕-1),n←⎕)⍴⊂'<td>A'

@ Adám Zbyt wyzwalacz szczęśliwy Obawiam się. Wygląda teraz OK?
Graham,

Tak, ale nie potrzebujesz końcowych parens: t,,((⎕-1),n←⎕)⍴rani dwóch pierwszych przecinków.
Adám,

@ Adám Thanks. To nie mój dzień musi być upałem (28 ° C)!
Graham,

Scal hi przejdź rdo głównego wyrażenia:'<table>'t(n⍴⊂'<th>A')t,,((⎕-1),n←⎕)⍴⊂'<td>A'
Adám

Coś jest nie tak. Wstawiasz tylko jeden <tr>dla ciała. Każdy rząd potrzebuje <tr>.
Adám,

1

Siatkówka , 56 54 bajtów

(.+) (.+)
<table>$1*$(<tr>$2*$(<td>@
T`\d`\h`^.*?r.*?r

Wypróbuj online! Edycja: Zapisano 2 bajty dzięki @CowsQuack. Objaśnienie: Pierwszy etap wykorzystuje najpierw mnożenie ciągów Retina 1 do wygenerowania odpowiedniej liczby komórek, a następnie do wygenerowania odpowiedniej liczby wierszy. Drugi etap następnie zmienia pierwszy rząd tds na ths.


Jeśli wiesz, że dane wejściowe zostaną podzielone na spacje, powinieneś być w stanie użyć .zamiast\d
Kritixi Lithos

1

Węgiel drzewny , 33 bajty

<table><tr>×<th>AηF⊖θ«<tr>×<td>Aη

Wypróbuj online!

Wyjaśnienie

<table><tr>                         Print "<table><tr>"
           ×<th>Aη                  Print "<th>A" * second input
                  F⊖θ«            For i in (implicit) range over first input
                        <tr>        Print("<tr>")
                            ×<td>Aη Print("<td>A") * second input

1

K, 58 bajtów

Wersja K to wszystko, co jest zawarte w KDB+ 3.5 2017.11.30.

Port odpowiedzi Python powyżej. Kończy się o 1 bajt dłużej ze względu na konieczność wielokrotnego zapisywania i spłaszczania.

{,/"<table><tr>",(y#,"<th>A"),(x-1)#,("<tr>",/y#,"<td>A")}

1

Perl 5 -p , 65 54 bajtów

-11 bajtów dzięki przypomnieniu @ msh2108

/ /;$_="<table><tr>"."<th>A"x$'.('<tr>'.'<td>B'x$')x$`

Wypróbuj online!


Zaoszczędź sobie bajtów. Na przykład w wyzwaniu możesz upuścić .'</table>'.
msh210


1

PowerShell Core , 72 68 bajtów

Function F($m,$n){'<table><tr>'+'<th>A'*$n+('<tr>'+'<td>A'*$n)*--$m}

Wypróbuj online!

Oto moje przypadki testowe i oczekiwane wyniki (Cf, TIO)

  • m = 2; n = 3 <table><tr><th>A<th>A<th>A<tr><td>A<td>A<td>A
  • m = 1; n = 3 <table><tr><th>A<th>A<th>A
  • m = 4; n = 2 <table><tr><th>A<th>A<tr><td>A<td>A<tr><td>A<td>A<tr><td>A<td>A
  • m = 2; n = 8 <table><tr><th>A<th>A<th>A<th>A<th>A<th>A<th>A<th>A<tr><td>A<td>A<td>A<td>A<td>A<td>A<td>A<td>A

Dzięki, @ mazzy , za -4 bajty!


1
Wsporniki są opcjonalne. Spróbować Function F($m,$n){'<table><tr>'+'<th>A'*$n+('<tr>'+'<td>A'*$n)*--$m}.
mazzy


0

Dart , 45 63 bajtów

Rozwiązanie robocze:

(m,n){print('<table><tr>'+'<th>A'*n+('<tr>'+'<td>A'*n)*(m-1));}

Wypróbuj online tutaj!

Funkcja lambda / anonimowa przyjmuje mi njako parametry wyświetla dane wyjściowe do STDOUT.

Ponieważ tabele z unclosed <table>, <tr>, <th>, i <td>tagi nadal czynią w nowoczesnych przeglądarek (np. Chrome), wyjście jest ważny.

Stare (zepsute) rozwiązanie:

Moja pierwsza próba zapomniała przejść do <td>pierwszego wiersza:

(m,n){print('<table><tr>'+'<th>A'*n+('<tr>'+'<th>A'*n)*(m-1));}

Dzięki @Lynn za zwrócenie na to uwagi.


0

Arkusze Google, 66 bajtów

="<table><tr>"&Rept("<th>A",B1)&Rept("<tr>"&Rept("<td>A",B1),A1-1)

Dane wejściowe są w komórce A1i B1.
Naprawdę nie ma nic wyszukanego; to tylko zagnieżdżone Reptfunkcje.
To nie zakładać m > n > 0i że oboje są liczbami całkowitymi.


0

Galaretka ,  33  32 bajty

“<td>A”ẋ”h3¦s5ẋ€ṭ€“<tr>”ṭ“¢ssɱU»

Pełny program do pobierania rows, columnsktóry drukuje wynik.

Wypróbuj online!


hmm, również 32 przy użyciu tabeli:

Ịị⁾hdṭ”t⁾<>j;ðþZṭ€“<tr>”ṭ“¢ssɱU»

0

J, 64 bajty

Kolejny port odpowiedzi w języku Python:

4 :0
'<table><tr>',(;y#<'<th>A'),;(<:x)#<('<tr>',(;y#<'<td>A'))
)

0

PHP, 161 bajtów

Wypróbuj online

Kod

function f($m,$n){$t=["table>","th>","td>","tr>","</"];echo strtr("
<0<3".str_repeat("<1A41",$n)."43".str_repeat("<3".str_repeat("
<2A42",$n)."43",$m-1)."40",$t);}

Wyjaśnienie

function f($m,$n){
  $t=["table>","th>","td>","tr>","</"];           //array representing the tags its created
  echo strtr("<0<3".str_repeat("<1A41",$n)."43"   //strtr it's called and uses 
                                                  //the array to replace values
           .str_repeat("<3".                      //repeat the tags
                         str_repeat("<2A42",$n)   //repeat the tags again
                            ."43",$m-1)."40",$t); 
   //its repeated m-1 times because head is counted as one row
  }

PHP, 193 bajtów

Zapomniałem o pełnej strukturze stołu<tfooter> <thead>, <tbody>..etc..

Wypróbuj przykład funkcji

function f($m,$n)   {$t=["table>","thead>","tbody>","th>","td>","tbody>","tr>"];
echo strtr(
      "<0<1".str_repeat("<3A</3",$n).
      "</1<2".str_repeat(
                  "<6".str_repeat("<4A</4",$n)
                       ."</6",$m-1)."</2</0",
  $t);
  }

Wyjaśnienie

$t=["table>","thead>","tbody>","th>","td>","tbody>","tr>"];

Zapisywana jest tablica ze wszystkimi znacznikami dla tabeli, w której została zbudowana, a następnie z str_repeatliczbą odnoszącą się do indeksu w tablicy jest zapisywana, a następnie do strtrciągu i tablica jest przekazywana


0

Yabasic , 124 bajty

Anonimowa funkcja, która pobiera dane wejściowe z rozdzielonych spacjami liczb całkowitych i danych wyjściowych do konsoli.

?"<table>"
input""i,j
For c=1To i
?"<tr>"
For r=1To j
If c=1?"<th>H</th>"
If c>1?"<td>D</td>"
Next
?"</tr>"
Next
?"</table>"

Wypróbuj online!


To nie tworzy tagów <td>.
ziemniak

@potato - ahh, nie widziałem tego. Jest poprawione.
Taylor Scott

0

Dalej (gforth) , 86 bajtów

: f ." <table>" 0 do ." <tr>" dup 0 do j if ." <td>A" else ." <th>A" then loop loop ; 

Wypróbuj online!

Wyjaśnienie

." <table>"         \ output <table>
0 do                \ start loop from 0 to m-1
   ." <tr>"         \ output <tr>
   dup 0 do         \ duplicate n and loop from 0 to n-1
      j if          \ if the outer loop index is true (not 0)
         ." <td>A"  \ output <td>A
      else          \ if outer loop index is false (0)
         ." <th>A"  \ output <th>A
      then          \ end if-else
   loop             \ end inner loop
loop                \ end outer loop                      

0

Marchew , 77 51 bajtów

<th>A^*$v<tr>vl+(^h)*($^F- 1)A"h"S"d"h+(^l)v<table>

(Pracując nad tym, odkryłem błąd, który hnie działa i naprawiłem go)

Otworzył niektóre bajty, skracając html, a także używając opcji „podziel, połącz” zamiast „zamień”

Wypróbuj online! , użyj opcji wiersza polecenia-d aby wyświetlić AST (Uwaga: używa to nowego interpretera węzłów, więc starsza wersja na stronie nie może tego uruchomić).

Ten program pobiera indeksowane wejście 0 w odwrotnej kolejności, z powodu dziwnej natury Marchewki, w ten sposób 3 2drukując tabelę 3 × 4.

Uruchom program w ten sposób, ./carrot -f prog.carrot input.txt

Zasadniczo tworzy wiersz nagłówka, a następnie wiersze danych w innej komórce ogrodu (taśma 2D) i łączy je razem.


Marchew działa na taśmie 2D, zwanej ogrodem. Każda komórka w ogrodzie składa się z trzech trybów stosu: ciąg, pływak, tablica. Dla każdego trybu istnieje wartość, zwana „stosem” (uwaga: błędna nazwa). Te stosy zaczynają się puste. Gdy komórka znajduje się w określonym trybie, następujące polecenia wpłyną na stos, który odpowiada temu trybowi, na przykład w trybie zmiennoprzecinkowym operacje wpłyną na zmiennoprzecinkowe stosu. I oczywiście są polecenia do przełączania między trybami. Tryby są ważne, ponieważ każdy operator może być przeciążony dla każdego trybu i każdego typu argumentu.

Ponadto istnieją dwa dodatkowe tryby (wpływają tylko na polecenia, a nie na stos bezpośrednio), tryb normalny i tryb karetki. Tryb normalny działa normalnie, gdy operatorzy przyjmują argumenty i wpływają bezpośrednio na stos. W trybie karetki (prawie) każdy znak jest interpretowany dosłownie jako ciąg znaków, a następnie jest dodawany / dodawany odpowiednio do stosu. Tryb Caret jest uruchamiany / kończony za pomocą karetek (dołączanie) lub kuracji opadających (dołączanie).

Marchew zaczyna się w celi w ogrodzie, w trybie strun i w trybie karetki.


Począwszy od trybu karetki ciąg <th>Ajest dodawany do początkowo pustego ciągu stosu. Następnie następuje *polecenie, które go powiela $, dane wejściowe, czasy. Następnie <tr>jest dodawany do łańcucha stosu za pomocą znaku dolnego v. Spowoduje to utworzenie wiersza nagłówka tabeli.

Aby utworzyć wiersze danych, duplikujemy nagłówek do innej komórki. lprzenosi adres IP do pustej prawej komórki i +dołącza (^h)ciąg do komórki po lewej stronie (zasadniczo kopiując go do komórki po prawej). ()uruchamia podpowłokę, nowy program Marchewki z prawie taką samą taśmą, i ^wychodzi z trybu karetki, abyśmy mogli hpobrać ciąg z lewej komórki. Jest to następnie *duplikowane przez ($^F- 1)kolejne wejście minus 1 razy.

Nadal w prawej komórce Austawia tablicę tej komórki na układanie stosów podzielone przez "h". Słączy tablicę stosu przez "d"i ustawia ciąg stosu na tę wartość. A"h"S"d"tak naprawdę po prostu zamienia hs na ds, aby utworzyć wiersze danych. Teraz hprzechodzimy do lewej komórki początkowej.

Teraz dołączamy ciąg stosu komórki po prawej stronie do tej komórki za pomocą +(^l). Wystarczy dodać <table>tag, więc robimy to, vprzygotowując go.



0

PowerShell, 63 bajty

$m,$n=$args;$t='h';'<table>';1..$m|%{'<tr>'+"<t$t>A"*$n;$t='d'}

zapisz to jako new-mntable.ps1. Skrypt testowy:

.\new-mntable.ps1 2 3
.\new-mntable.ps1 1 3
.\new-mntable.ps1 4 2
.\new-mntable.ps1 2 8

wyjście (dodatkowe spacje są opcjonalne):

<table>
<tr><th>A<th>A<th>A
<tr><td>A<td>A<td>A
<table>
<tr><th>A<th>A<th>A
<table>
<tr><th>A<th>A
<tr><td>A<td>A
<tr><td>A<td>A
<tr><td>A<td>A
<table>
<tr><th>A<th>A<th>A<th>A<th>A<th>A<th>A<th>A
<tr><td>A<td>A<td>A<td>A<td>A<td>A<td>A<td>A

PowerShell, 65 bajtów, -replace

'<table>h'+'d'*--$args[0]-replace'h|d',('<tr>'+'<t$0>A'*$args[1])

zapisz to jako new-mntable.ps1. Skrypt testowy:

.\new-mntable.ps1 2 3
.\new-mntable.ps1 1 3
.\new-mntable.ps1 4 2
.\new-mntable.ps1 2 8

wydajność:

<table><tr><th>A<th>A<th>A<tr><td>A<td>A<td>A
<table><tr><th>A<th>A<th>A
<table><tr><th>A<th>A<tr><td>A<td>A<tr><td>A<td>A<tr><td>A<td>A
<table><tr><th>A<th>A<th>A<th>A<th>A<th>A<th>A<th>A<tr><td>A<td>A<td>A<td>A<td>A<td>A<td>A<td>A

Jak to działa:

  1. '<table>h'+'d'*--$args[0] - utwórz ciąg podobny do <table>hddd...
  2. 'h|d'- wyszukiwanie hlub dznaki w ciągu do zastąpienia
  3. '<tr>'+'<t$0>A'*$args[1] - zamień każdy znak na ciąg znaków podobny do <tr><t$0>A<t$0>A...
  4. gdzie $0jest schwytany group[0]- char w -replace.

PowerShell, 65 bajtów, scriptblock

$m,$n=$args;'<table>';&($r={'<tr>'+"<t$args>A"*$n})h;(&$r d)*--$m

zapisz to jako new-mntable.ps1. Skrypt testowy:

.\new-mntable.ps1 2 3
.\new-mntable.ps1 1 3
.\new-mntable.ps1 4 2
.\new-mntable.ps1 2 8

wydajność:

<table>
<tr><th>A<th>A<th>A
<tr><td>A<td>A<td>A
<table>
<tr><th>A<th>A<th>A

<table>
<tr><th>A<th>A
<tr><td>A<td>A<tr><td>A<td>A<tr><td>A<td>A
<table>
<tr><th>A<th>A<th>A<th>A<th>A<th>A<th>A<th>A
<tr><td>A<td>A<td>A<td>A<td>A<td>A<td>A<td>A
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.