Wyjmij odpowiedź powyżej swojej

15

Napisz program, który wypisuje zawartość pierwszego <code>...</code>bloku HTML odpowiedzi na to pytanie, który jest tuż nad twoim, gdy odpowiedzi są sortowane według głosów. Wyjdź, Top!jeśli jesteś najlepszą odpowiedzią.

Zignoruj ​​odpowiedzi, które mają negatywne głosy lub nie zawierają <code>...</code>tagów. Źródło twojego programu musi pojawić się w pierwszym <code>...</code>bloku postu. Te bloki są tworzone automatycznie, gdy Ty use backtickslub

indent things with 4 spaces.

To jest golf golfowy, wygrywa odpowiedź z najmniejszą liczbą postaci.

Dodatkowe zasady (zaktualizowane)

  • Odpowiedz w dowolnym języku programowania, ale jeśli odpowiadasz wielokrotnie, użyj różnych języków.
  • Nie możesz na stałe kodować swoich wyników. Zdolność do prawidłowego działania programu nie powinna zależeć od liczby głosów ani od powyższej odpowiedzi. Jeśli rozkład głosów zmienił się drastycznie, twój program powinien nadal poprawnie wypisywać kod odpowiedzi powyżej.
  • Państwo może ciężko kod program do wyszukiwania sobie na tej stronie (tak aby znaleźć następny najwyższy) poprzez jakiś unikalny własności odpowiedź, takich jak nazwa użytkownika (jeśli masz tylko jedną odpowiedź) lub odpowiedzieć na bezpośredni link.
  • Jeśli dwie odpowiedzi mają równe głosy, nadal powinieneś użyć tej tuż nad twoją (która, jak sądzę, będzie najnowsza).
  • W <code>...</code>odpowiedzi może znajdować się wiele bloków, ale pierwszy musi zawierać źródło programu.
Hobby Calvina
źródło
1
Czy muszę rozliczać się z wielu stron?
Οurous
1
Tak, powinieneś wziąć pod uwagę wiele stron
Calvin's Hobbies
4
Zauważ, że inline code spanssą po prostu <code></code>, ale są odpowiednie bloki kodu <pre><code>stuff</code></pre>.
Klamka
3
@ Calvin'sHobbies Myślę, że kolejność powiązanych odpowiedzi (według głosów) jest losowa. Przynajmniej na SO, nie wiem o tym tutaj.
Martin Ender
4
Twierdziłbym, że dbanie o wiele stron nie jest konieczne - jeśli nie ma cię na pierwszej stronie, to i tak
NIE WYGRYWASZ

Odpowiedzi:

5

JavaScript + jQuery (92 86 64 znaków)

Aby przetestować, otwórz Narzędzia deweloperskie na tej stronie (zazwyczaj F12) i uruchom mój kod!

Ten skrypt Javscript należy uruchomić za pomocą konsoli z tej strony (i tylko tej strony).

alert($("code",$("#answer-34767").prev().prev()).html()||"Top!")

Tak krótko, że nawet nie potrzebuje paska przewijania!

Zasadniczo znajduje moją odpowiedź według identyfikatora, a następnie przesuwa się o dwa węzły do ​​przodu (pomijając link kotwiczący). Jeśli to nie istnieje, muszę być na szczycie. Następnie kopie w dół do pierwszego codeelementu i otrzymuje go .innerHTML.

Zaletą jest to, że SE domyślnie korzysta z jQuery, więc czerpię tę przewagę, nawet nie próbując.

Robbie Wxyz
źródło
2
Osobiście nie podoba mi się twoja odpowiedź, ponieważ jest to trochę jak oszukiwanie ... W każdym razie może być tak krótkie jak alert($("code",$("#answer-34767").prev().prev()).html()||"Top!").
core1024
@ core1024: Dzięki za ulepszenie! Nie myślałem o zrobieniu tego w jednym oświadczeniu. Zgadzam się, że mam ogromną przewagę. Może muszę liczyć kod Firefoksa na> 78 MB? Reguły mówią „Odpowiedz w dowolnym języku programowania”.
Robbie Wxyz,
Nie musisz liczyć kodu Firefoksa :) Twoja przewaga jest w obecnym środowisku, a nie w tłumaczu. To tak, jakby wszyscy mieli już źródło strony załadowane do zmiennej „obiekt” / „zmienna”. +1 za exploita;)
core1024
4
To ostrzeże „górę”, jeśli jest na górze drugiej strony, czy jest to prawidłowe zachowanie?
William Barbosa
@WilliamBarbosa: Jestem z „lrn” na tym. (patrz jego komentarz do pytania OP).
Robbie Wxyz
6

PHP 666 611 593 588 580 znaków

Edycja: Używany nawet mniejszy adres URL niż wcześniej z tinyurl.

Edycja: Po komentarzu do innej odpowiedzi użyłem int, a nie boolean. Potrzebny również do poprawienia błędu, który stał się widoczny, ale teraz naprawiony.

Oto mój kod

<?
$a=34727;$b=new DOMDocument();$b->loadHTMLFile("http://turl.no/t2u");$c=$b->saveHTML();$d=$e=1;$f='data-answerid="';$g=strpos($c,$f);$h=substr($c,0,$g);$c=substr($c,($g+15));while($d==1){$g=strpos($c,'"');$i=substr($c,0,$g);if($i==$a){$j=$h;$k=$e;}$g=strpos($c,'vote-count-post ">');$c=substr($c,($g+18));$g=strpos($c,'<');$l=substr($c,0,$g);$g=strpos($c,'data-answerid="');if($g){++$e;++$e;$h=substr($c,0,$g);$c=substr($c,($g+15));}else{$d=2;}}if($k==1){echo 'Top!';}else{$g=strpos($j,'><code>');$m=strpos($j,'</code></pre>');$n=$m-$g-7;$o=substr($j,($g+7),$n);echo nl2br($o);}

Jestem pewien, że można to poprawić za pomocą DOMXPath i węzłów. Jednak jestem z tego bardzo zadowolony. Nie mogłem zdecydować, co zrobić w przypadku mojej, to jedyna odpowiedź, ale z tak ignorowanymi punktami -ve. Jednak opublikowano kolejną odpowiedź, więc nie ma już problemu.

Użyłem również tinyurl, aby skrócić adres URL, oszczędzając wiele znaków.

Mam nadzieję, że to lubisz,

Paweł.

PS To nie będzie działać w codepad, więc nie może pokazać skrzypce.

Edycja: zapisano jeszcze 5 z modyfikowanymi tagami php

Możesz zobaczyć, jak działa tutaj w domenie, z której obecnie nie korzystam (więc nie tylko próbuję podstępnego linku). Nie jest to jednak stały link, ale jest obecnie dostępny.

Paul Drewett
źródło
Możesz go jeszcze bardziej skrócić, używając jeszcze krótszego adresu URL =) na przykład ➡.ws / .v
flawr
Próbowałem z linkiem tinyarrows.com, ale opóźnienie w połączeniu przekroczyło limit czasu serwera. Są to jednak naprawdę małe adresy URL.
Paul Drewett
1
Na tej stronie dopuszczalne jest użycie skróconego tagu otwierającego (sądzę, że <?zamiast niego <?php) i pominięcie tagu zamykającego. To powinno dać ci jeszcze kilka znaków.
Justin
1
turl.no tworzy dość krótkie linki, a ponieważ jest to norweski skrót, niewiele osób zauważyło go na arenie międzynarodowej. Oto link do ciebie: turl.no/t2u wskazuje tę samą stronę, co link malutki.com i zapisuje 8 znaków.
bilde2910
@ bilde2910 Dziękuję, że zadziałało i jest to rzeczywiście kolejny bardzo mały adres URL. Bardzo ceniony i Turl.ca jest interesujący. Uwielbia swoje domeny .ca, prawda :-)
Paul Drewett
4

Dart 412 403

import"dart:io";import"dart:convert";main(){new HttpClient().get("pi.vu",0,"BYga").then((v)=>v.close()).then((r)=>r.transform(UTF8.decoder).join()).then((s,[i,c="Top!"])=>new RegExp(r'<div id="answer-(\d+)[^]*?vote-count-post ">(\d+)[^]*?<table class="fw"').allMatches(s).forEach((m)=>m[1]=="34735"?print(c):m[2][0]!='-'&&(i=(s=m[0]).indexOf("<code>"))>0?c=s.substring(i+6,s.indexOf("</code>",i)):0));}

Niegolfowany (cóż, z nowymi liniami i wiodącą białą spacją)

import"dart:io";
import"dart:convert";
main(){
  new HttpClient().get("pi.vu",0,"BYga")
  .then((v)=>v.close())
  .then((r)=>r.transform(UTF8.decoder).join())
  .then((s,[i,c="Top!"])=>
      new RegExp(r'<div id="answer-(\d+)[^]*?vote-count-post ">(\d+)[^]*?<table class="fw"')
      .allMatches(s)
      .forEach((m)=>
          m[1]=="34735"?print(c)
                       :m[2][0]!='-'&&(i=(s=m[0]).indexOf("<code>"))>0
                           ?c=s.substring(i+6,s.indexOf("</code>",i)):0
  ));
}
lrn
źródło
4

Delphi (688 873 859 848 840)

Nadal będę próbował zgolić niektóre postacie, ale to zadziała :)

Edycja: zamiast
skracać to wydłużyłem: P Zapomniałem dodać ignorowanie odpowiedzi, gdy ma ujemną liczbę głosów lub nie ma bloków kodu.

Właśnie aktualizuję wersję bez gry w golfa podczas edycji.
Dzięki @manatwork za sugerowane zmiany, które usunęły 8 znaków.

Wersja golfowa:

uses IdHTTP,Classes,MSHTML;const u='http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718';var g:TIdHTTP;m:TMemoryStream;l:TStringList;p,t,r,o:OleVariant;s,i,j:int32;c:boolean;begin L:=TStringList.Create;g:=TIdHTTP.Create(nil);m:=TMemoryStream.Create;g.Get(u,m);m.Position:=0;L.LoadFromStream(m);p:=coHTMLDocument.Create as IHTMLDocument2;p.write(l.Text);for I:=0to p.body.all.length-1do begin c:=0>1;t:=p.body.all.item(i);if(t.classname='answer')and(t.id='answer-34718')then if s=0 then writeln('Top!') else for j:=0to o.all.length-1do begin t:=o.all.item(j);if t.tagname='CODE'then writeln(t.innertext);end else if t.classname='answer'then begin for j:=0to t.all.length-1do begin r:=t.all.item(j);if r.tagname='CODE'then c:=1>0 else if c and(r.class='vote-count-post')and(r.innertext[1]<>'-')then begin o:=t;s:=1;end;end;end;end;end.

Wersja bez golfa:

uses
  IdHTTP,Classes,MSHTML;
const
  u='http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718';
  a='answer';b='CODE';
var
  g:TIdHTTP;
  m:TMemoryStream;
  l:TStrings;
  p,t,r,o,z:OleVariant;
  s,i,j:int32;
  c:byte;
begin
  L:=TStringList.Create;
  g:=TIdHTTP.Create(nil);
  m:=TMemoryStream.Create;
  g.Get(u,m);
  m.Position:=0;
  L.LoadFromStream(m);
  p:=coHTMLDocument.Create as IHTMLDocument2;
  p.write(l.Text);
  z:=p.body.all;
  for I:=0to z.length-1do
  begin
    c:=0;
    t:=z.item(i);
    if(t.classname=a)and(t.id='answer-34718')then
      if s=0 then
        write('Top!')
      else
        for j:=0to o.all.length-1do
        begin
          t:=o.all.item(j);
          if t.tagname=b then
            write(t.innertext)
        end
    else if t.classname=a then
      for j:=0to t.all.length-1do
      begin
        r:=t.all.item(j);
        if r.tagname=b then
          c:=1
        else if(c=1)and(r.class='vote-count-post')and(r.innertext[1]<>'-')then
        begin
          o:=t;
          s:=1;
        end;
      end;
  end;
end.
Teun Pronk
źródło
http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours/34718#34718można zmienić na http://codegolf.stackexchange.com/q/34718, co zaoszczędziłoby sporo znaków.
Klamka
Dzięki, niestety musiałem też dodać trochę, ponieważ zapomniałem części, w której musisz ignorować odpowiedzi z ujemną liczbą głosów lub bez bloków kodu: / .. nie działa :( Dostaję 301 na stałe przeniesiony
Teun Pronk
Jak sugerowano wcześniej , TStringszamiast tego możesz zadeklarować l . (Ale zachowaj instancję z TStringList.)
manatwork
Spróbowałbym zrobić c bytezamiast boolean.
manatwork
3

Python - 280

import os, sys, cgi
os.system('wget http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours.html -q -O a')
b=[ x[:-2] for x in open('a').read().split('code>') if x[-1]=='/']
for i, m in enumerate(b):
    if m == cgi.escape(open(sys.argv[0]).read()):
        print b[i-1]

To mój pierwszy codegolf, więc mam nadzieję, że to wystarczy!

Edycja: Dzięki za wskazówki! Teraz wygląda trochę bardziej golfowo.

KidElephant
źródło
Za pierwszym razem nie wygląda źle! Chociaż można użyć do skracania adresów URL na odnośnik i pozbyć się z kilku pomieszczeń w tam ( for i,m, m==openitp).
Christoph Böhmwalder
@HackerCow Myślę, że skracacze adresów URL są na ogół rozczarowane, ale na http://codegolf.stackexchange.com/q/34705/14509pewno zadziałają.
undergroundmonorail
@KidElephant Usunąłem kilka białych znaków z twojego kodu. Nie testowałem tego ani nic, ale chyba, że ​​spieprzyłem, powinien to być (logicznie) ten sam program. Pamiętaj, że usunąłem shebang, nie są one tutaj wymagane. ix.io/dsz Usunięcie białych znaków może zaoszczędzić sporo bajtów :)
undergroundmonorail
Ponadto w przypadku wyzwań związanych z golfem kodowym należy podać liczbę bajtów. Zredagowałbym jeden dla ciebie tutaj, ale twoja odpowiedź prawdopodobnie ulegnie zmianie, jeśli użyjesz jakichkolwiek sugestii, aby nie zawracać sobie głowy. Liczbę bajtów można znaleźć, uruchamiając wc -c $filename. Jeśli Twój edytor dołącza końcowy znak nowej linii do plików (prawdopodobnie tak jest), możesz go odjąć, aby uzyskać końcowy wynik.
undergroundmonorail
2

Mathematica - 159

Pierwszy raz parsuję w Mathematica

FirstCase[
 Cases[Import["http://bit.do/JGta1","XMLObject"],
 {__,a_,_,_,_,XMLElement[_, {_, "id""answer-34780",__},_],__}a,∞], 
 XMLElement["code",_,{c_}]c,"Top!",∞]
śmigać
źródło
2

Rubin 283 + 17 = 300

Udaje się to bez względu na to, ile głosów otrzyma ta odpowiedź, i nie ważne, czy jest druga (lub piętnasta) strona odpowiedzi, czy nie. Korzysta z interfejsu API danych.

d=34849
JSON.parse(Net::HTTP.get(URI("http://api.stackexchange.com/2.2/questions/34705/answers?site=codegolf&filter=8G3Ng9T*")))['items'].map{|a|abort$1.gsub(/&.+?;/){|g|g[?a]??&:g[?g]??>:?<}if !d&&a['score']>=0&&/<code>(.*?)<\/code>/m=~a['body']
d=p if a['answer_id']==d}
$><<'Top!'

musi być uruchamiany z ruby -rnet/http -rjson(stąd +17)

bez golfa:

d = 34849 # this answer id
i = JSON.parse(Net::HTTP.get(URI("http://api.stackexchange.com/2.2/questions/34705/answers?site=codegolf&filter=8G3Ng9T*")))['items'] # stackexchange api answers for this question
i.map{ |a|
  # if we've already hit this answer, the score's above 0 and there's code...
  if !d && a['score']>=0 && /<code>(.*?)<\/code>/m=~a['body'] then
    # abort with html-unescaped code
    abort $1.gsub(/&.+?;/){ |g|
      # this turns &amp;, &gt; and &lt; into &, > and <, respectively
      g[?a] ? ?& : g[?g] ? ?> : ?<       
    }
  end
  # if we are at our answer, set d = nil
  if a['answer_id']==d then 
    d = p 
  end
}
# no abort. puts 'Top!'
$><<'Top!'

Dziennik zmian

300 usuniętych parenów w wyrażeniu regularnym symbolu

302 wstępne zatwierdzenie

Nie ten Charles
źródło
Możesz zaoszczędzić kilka bajtów, czyniąc swój filtr niebezpiecznym
pppery
@ppperry proszę wyjaśnić?
Nie to, że Charles
Korzystanie z niebezpiecznych filtrów oznacza, że ​​musisz ręcznie usunąć HTML z przeglądarki. Zobacz dokumentację dotyczącą filtrów
pppery
1

PHP 135

<?
preg_match_all('@(\d+?)"></a.*de>(.*)</c@Us',join('
',file('http://pi.vu/BYga')),$m);echo$m[2][array_search(34786,$m[1])-1]?:'Top!';

Edycja: skracacz URL lrn tworzy najkrótszy URL :)

RegEx dopasowuje kotwicę przed każdą odpowiedzią (wraz z identyfikatorem odpowiedzi) i zawartością wewnątrz pierwszego <code>znacznika. UFlag uruchamia Utryb ngreedy i smakijaż flaga .pasuje nowe linie (bardzo garść). Nie martwię się, jeśli to pasuje do czegoś innego, ponieważ odpowiedzi są unikane, więc nikt nie może wstawić <literału w źródle strony.

Po otrzymaniu wszystkich odpowiedzi $m[2]i ich identyfikatorów $m[1], po prostu używam, echoaby wydrukować odpowiedź nad moją, gdy jest $m[2][array_search(34786,$m[1])-1], lub „Top!”, Jeśli moja odpowiedź w końcu będzie pierwsza :)

Podoba mi się fakt, że w PHP operator trójskładnikowy może być używany jako operator zwarciowy ?:

rdzeń 1024
źródło
To jest niesamowite. Właśnie go przetestowałem, ale pokazuje kod z poniższego. Jestem pewien, że będzie to szybkie rozwiązanie, ale pomyślałem, że o tym wspomnę. Niesamowita praca, 135 w PHP, wciąż nie mogę w to uwierzyć ...
Paul Drewett
1
@PaulDrewett Po otwarciu tej strony podczas przeglądania prywatnego zapoznaj się z zamówieniem. Po zalogowaniu się różni się od kolejności.
core1024,
Och, to zaskakujące. Zastanawiam się dlaczego? Przepraszam, że wskazałem błąd. Mój błąd. Głosowałem jednak za przydatną odpowiedzią. Nadal uważam, że to niesamowite ...
Paul Drewett
1

Delphi, 461 bajtów , 553 bajtów

Teraz obsługuje także wiele stron!

Gra w golfa:

uses IdHTTP,RegularExpressions;var T,S,O:String;K,V,C:Int32;begin repeat Inc(C);Str(C,S);S:=TIdHTTP.Create.Get('http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours?page='+S);T:=T+S;until Pos('<span class="page-numbers next',S)=0;O:='Top!';for T in TRegEx.Split(T,'<a name="') do begin S:=T;Val(Copy(S,1,Pos('"',S)-1),K,C);if C=1then Continue;Delete(S,1,Pos('post ">',S)+6);Val(Copy(S,1,Pos('<',S)-1),V,C);C:=Pos('<code>',S);if(C=0)or(V<0)then Continue;if K=34844then Break;O:=Copy(S,C+6,Pos('</code>',S)-C-6);end;Write(O)end.

(nieznacznie) Nie golfowany:

uses
  IdHTTP,RegularExpressions;
var
  T,S,O:String;
  K,V,C:Int32;
begin
  // download all pages in thread and concat them
  repeat
    Inc(C);
    Str(C,S);
    S:=TIdHTTP.Create.Get('http://codegolf.stackexchange.com/questions/34705/output-the-answer-above-yours?page='+S);
    T:=T+S;
  until Pos('<span class="page-numbers next',S)=0;
  O:='Top!'; // initialize code string to 'Top!'
  for T in TRegEx.Split(T,'<a name="') do begin
    S:=T;
    Val(Copy(S,1,Pos('"',S)-1),K,C); // try to extract user id
    if C=1then Continue; // if failed, continue loop
    Delete(S,1,Pos('post ">',S)+6); // prepare S for next parse
    Val(Copy(S,1,Pos('<',S)-1),V,C); // try to extract vote count
    C:=Pos('<code>',S); // check if <code> tag exists
    if(C=0)or(V<0)then Continue; // make sure vote count is positive and <code> tag exists
    if K=34844then Break; // if its our answer, break the loop
    O:=Copy(S,C+6,Pos('</code>',S)-C-6); // get string in <code> tag
  end;
  Write(O); // write <code> string
end.

Jak uruchomić:

app.exe > output.txt
Marko Paunovic
źródło
Fajnie, mógłbym to zrobić zamiast używać jednostek HTML. Szkoda, że ​​nie pomyślałem o tym: P
Teun Pronk
Dzięki. Ponadto jeden z (jeśli nie tylko) kodów, który obsługuje również wiele stron.
Marko Paunovic
1

PHP - 412 - 422 - 416 - 252 - 248:

Nadal trwają prace, nie zrobiłem nic dotyczącego wielu stron (ani nikogo innego?)

Dostałem upuszczenie 200 znaków, wycinając wiele dodatkowych domen, po co szukać obiektów, kiedy mogę po prostu znaleźć ich pozycję?

To także mój pierwszy golf w golfa! Cieszę się, że zrobiłem to w latach dwudziestych i używam metod Dom. Dzięki komentarzom ogoliłem jeszcze 4 postacie.

Chciałem zrobić coś takiego jak jquery / jscript w odniesieniu do przechodzenia przez dom i nadal pracuję nad tym, aby to schudnąć. Może uda mi się znaleźć „asi” jako moją nazwę użytkownika?

Golf:

<? $d=new DOMDocument;$d->loadHTMLFile("http://bit.do/JGta");$x=new DOMXPath($d);$r=$x->query("//*[@class='answer']");$a=-1;while($f=$r->item(++$a))if(strpos($f->nodeValue,"Asitaka"))echo$x->query(".//pre//code",$r->item($a-1))->item(0)->nodeValue;

Sformatowany:

    <?php
$d = new DOMDocument();
$d->loadHTMLFile("http://bit.do/JGta");
$x = new DOMXPath($d);
$r = $x->query("//*[@class='answer']");
$a = -1;
while($f = $r->item(++$a))
        if ( stripos($f->nodeValue, "Asitaka")!= 0)
            echo $x->query(".//pre//code",$r->item($a-1))->item(0)->nodeValue;
?>

Twoje zdrowie

Asitaka
źródło
W PHP nawiasy new DOMDocument()i zamykanie ?>można pominąć.
jimmy23013
Dzięki, straciłem 4 kolejne postacie. W tej chwili nie wyobrażam sobie, jak można go skrócić, chyba że użyję różnych klas, a akcesoria DOM są drogie.
Asitaka,
Zapisz znaki, zmieniając nazwę użytkownika!
DavidG
Myślę, że to jest fajne. Próbuję tylko nauczyć się części zapytania do DOMXPath, ale muszę przyznać, że jest mi ciężko. Próbowałem tego, ale nie mogłem tego pojąć. Testowałem twój, ale wydaje się, że raportuje dwa dwa powyżej, a nie ten bezpośrednio powyżej. Jestem pewien, że to szybkie rozwiązanie, ale pomyślałem, że o tym wspomnę.
Paul Drewett,
Po tych informacjach „Proszę spojrzeć na kolejność otwierania tej strony podczas przeglądania prywatnego. Różni się ona od kolejności, gdy użytkownik jest zalogowany - core1024” z innego komentarza, muszę założyć, że to samo dzieje się tutaj. Przepraszam za to.
Paul Drewett
1

Python 3, 197 191 bajtów

import urllib.request as u,gzip,json;p='Top!'
for r in json.loads(gzip.decompress(u.urlopen("http://bit.ly/2hN8TKV").read()).decode())["items"]:
 if r['answer_id']==82837:exit(p)
 p=r['body']

Reguły nie mówią, że nie mogę korzystać z API i że nie mogę używać skracacza adresów URL.

https://tinyurl.com/hdemk76rozwija się https://api.stackexchange.com/2.2/questions/34705/answers?order=desc&sort=votes&site=codegolf&filter=withbody&pagesize=100 Działa to tylko wtedy, gdy znajduje się w 100 najlepszych odpowiedziach posortowanych według głosów.

pppery
źródło
-6, jeśli wymienisz https://tinyurl.com/hdemk76 sięhttp://bit.ly/2hN8TKV
Taylor Scotta