Jest mi za zimno, podnieś temperaturę

53

To mój pierwszy konkurs golfowy.

Co musisz zrobić

Zbuduj mi, w jak najkrótszej ilości bajtów, mój system zdalnego sterowania AC. W moim pokoju jest teraz za zimno i brakuje mi pilota.

Nie chcę, żebyś budował to dosłownie czy coś, po prostu golf to:

Powolny przyrost temperatury, zaczynający się od 40 stopni, a kończący się dokładnie na 72. Czas przyrostu musi zawsze wynosić 500 milisów na przyrost. Na koniec może poczekać kolejne 500 ms. Wolałbym jednak, żeby przestał. Sam przyrost musi wzrosnąć o dwa za każdym razem, podobnie jak mój pilot.

Nie powinieneś wyczyścić ekranu. Powinieneś mieć nowe linie.

Co powinno się stać?

Przykładowe dane wyjściowe (nie należy wypisywać wszystkiego w nawiasach).

40
(wait 500 millis)
42
(wait 500 millis)
44
(..repeat until 72..)
72
(stop or wait 500ms)

Pamiętaj, to jest mój pierwszy golf, więc przepraszam, jeśli jest to zbyt trudne do gry w golfa. :(

Powodzenia, golfiści!

IMustBeSomeone
źródło
3
Drobna rzecz, ale „zawsze musi być 500 milisów” jest zasadniczo zbyt surowa dla jakiegokolwiek rozsądnego urządzenia. Polecam określenie wariancji, na przykład +/- 10%.
FryAmTheEggman
1
Czy możesz poczekać 500 ms przed wyświetleniem wyjściowego wyniku?
FlipTack,
35
-1 za używanie Fahrenheita (niezupełnie, ale powinieneś przynajmniej powiedzieć, że go używasz; 40 stopni Celsjusza nie jest zbyt zimno w najmniejszym stopniu)
John Dvorak
20
+1 za używanie Fahrenheita, ma lepszą rozdzielczość niż Celsjusz i jest tak samo arbitralne jak wszystko inne niż Kelvin lub Rankine
Nick T
8
@NickT, więc nie masz szczęścia, ponieważ rozdzielczość tego pilota wynosi 2 ° F, czyli więcej niż 1 ° C. Możesz uzyskać wyższą rozdzielczość w stopniach Celsjusza niż Fahrenheita dzięki pilotowi, który może wyświetlać 0,5 i znacznie więcej, jeśli może wyświetlać do 0,1. W każdym razie jestem prostym człowiekiem i nie potrafię rozróżnić między 22 a 23 ° C, więc wysoka rozdzielczość w tym przypadku jest dla mnie bezużyteczna
phuclv

Odpowiedzi:

43

Narzędzia Bash + Linux, 19

seq 40 2 72|pv -qlL2

seqgeneruje dane liczbowe. pvratelimits to 2 linie / sek.

Cyfrowa trauma
źródło
2
-qTłumienie wyjścia przechodzi do STDERR, więc nie sądzę, żebyś go potrzebował.
Dennis
14
Doskonały pokaz „zrób jedną rzecz i zrób to dobrze” z odpowiednimi narzędziami do pracy. :)
Klamka
2
Zbliża się do terytorium „przeciw golfowi” .
Vi.
42

Minecraft 1.9.0+, 204 162 bajty + 58 36 28 24 20 bloków = 262 240 232 186 182 blytów

To rozwiązanie jest obniżone i nie można go zobaczyć w całości na jednym, a nawet dwóch zrzutach ekranu. Wykorzystuje dwa usterki i narusza kolejne dwie funkcje gry

BIEGAĆ!  MINECRAFT Cię zabije!

W tym rozwiązaniu zastosowano te same zasady, co poniżej, tylko 4 bloki bardziej kompaktowej konstrukcji.

  • Nadużywa faktu, że bloków poleceń Łańcucha (zielone bloki) nie można zasilać przez kamień czerwony, a tylko przez singal z impulsu bloku poleceń (pomarańczowy).

  • Nadużywa faktu, że całkowite wydłużenie tłoków zajmuje 0,30 sekundy, a redstone potrzebuje tylko 0,10 s, aby zarejestrować sygnał.

  • Nadużywa również podwójnej usterki, aby wyłączyć timer (TNT): czerwony kamień obok timera (TNT) jest nie tylko zasilany, ale także myśli, że TNT jest kolejnym czerwonym kamieniem i zasila go.

  • Oprócz tych wszystkich nadużyć, skracacz sygnału (rzecz pod TNT) jest jednorazowego użytku, po zasileniu zmienia kształt, umożliwiając przekazywanie sygnału przez „inkrementator” (najwyższy pomarańczowy blok)

Trochę wyjaśnienia na temat funkcjonalności różnych części można znaleźć w starszych rozwiązaniach (ale najlepsze w tym poniżej). Możesz także wypróbować offline! (uproszczone rozwiązanie zwiększające się o 4, działa tylko w wersji 1.11+) , uruchamiając to polecenie w bloku poleceń .


Stare rozwiązanie, Minecraft 1.9.0+, 186 blytes:

NADUŻYCIE MINECRAFT

Ponieważ TNT zwykle eksploduje po 3.0s w Minecraft, ten musi zostać umieszczony za pomocą polecenia ( /setblock) z określonym bezpiecznikiem. Używa również bardziej zwartej konstrukcji do usuwania zbędnego bloku poleceń (zawierającego 42 bajty) i redstone w stosunku do starszych wersji. Jestem pewien, że nie może być niżej ...

Starsze rozwiązanie, Minecraft 1.9.0+, 232 blytes:

Ups, dowiedziałem się, że te starsze rozwiązania zwiększają się o 4 ...

golfcraft

Używa funkcji łańcucha bloków poleceń 1.9 (zielony blok) do zapisywania bloków. Używa również bardziej kompaktowego skracacza sygnału niż w starszych rozwiązaniach

Nawet starsze rozwiązanie, Minecraft 1.7.0+, 240 blytów:

bezduszny potwór

Używa bardziej kompaktowego timera (TNT) niż pierwszego rozwiązania (poniżej).

Najstarsze rozwiązanie, Minecraft 1.7.0+, 262 blytes:

stary potwór


Jest to tak długie ze względu na sposób, w jaki Minecraft obsługuje zmienne:

  • Aby zdefiniować zmienną (int): scoreboard objectives add <variable> dummy

  • Aby ustawić wartość zmiennej (każda jednostka, w tym gracze, ma swoją własną wartość zmiennej): scoreboard players set <entity> <variable> <value>

    • *może być użyty jako <entity>do wybrania wszystkich jednostek i zapisania bajtów.

    • można używać tylko zdefiniowanych zmiennych

    • wartość zmiennej musi być ustawiona na liczbę, a nie na zmienną

  • Aby zwiększyć wartość var1 o var2: scoreboard players operation <entity> var1 += <entity> var2

    • <entity>musi być pojedynczym bytem, ​​np. @p, nie*

Zrzuty ekranu są moje, podwójnie licencjonowane na WTFPL i jakiej licencji SE decyduje się dziś użyć (obecnie cc by-sa 3.0 with attribution required) :-)

RudolfJelin
źródło
2
Łał! Użyłeś Minecrafta, to jest genialne! +1 :)
IMustBeSomeone
1
@IMustBeSomeone Poczekaj, znalazłem sposób na golfa :)
RudolfJelin,
1
... twój obwód wysadza się w powietrze po zakończeniu.
SuperJedi224,
@ SuperJedi224 Tak. Czy to źle?
RudolfJelin
2
@ RudolfL.Jelínek Jestem pewien, że tak naprawdę nie jest to niezgodne z zasadami, ale jest trochę dziwne. Z drugiej strony jest to część tego, na czym polega golf golfowy.
SuperJedi224,
18

Vim, 24 , 23 bajty / naciśnięcia klawiszy

i40<esc>qq:sl500m
Yp2<C-a>q15@q

Jeden bajt zapisany dzięki @Kritixi Lithos!

Napisane z mojego telefonu, przetestowane w vimie mobilnym (co najwyraźniej jest prawdziwe).

Oto gif z tego:

wprowadź opis zdjęcia tutaj

A oto wyjaśnienie polecenia po poleceniu:

i40<esc>            " Insert '40' into the buffer
        qq          " Start recording into register 'q'
          :sl500m   " Sleep form 500 ms
Y                   " Yank this line
 p                  " and paste it on a newline
  2<C-a>            " Increment this line twice
        q           " Stop recording
         15@q       " Callback register 'q' 15 times
DJMcMayhem
źródło
sW msjest opcjonalne, można go usunąć, aby zapisać bajt :)
Kritixi Lithos
@KritixiLithos Wiedziałem o tym! Jak to przeoczyłem? Dzięki!
DJMcMayhem
8
Uczeń został nauczycielem: P
Kritixi Lithos
1
„Prześlę gif i wyjaśnienie później, gdy będę mieć dostęp do komputera” czeka pół roku (niezupełnie)
HyperNeutrino
@HyperNeutrino Hahahahaha, zupełnie zapomniałem o tej odpowiedzi. Czy to lepiej: P
DJMcMayhem
10

JavaScript (ES6), 52 bajty

f=(i=40)=>console.log(i)|i-72&&setTimeout(f,500,i+2)

f()

ETHprodukcje
źródło
Oto bardziej schludny re-aranżacja odpowiedź dla Ciebie: f=(i=40)=>setTimeout(i>70||f,500,i+2,console.log(i)). Niestety wciąż te same 52 bajty.
Ismael Miguel,
Czy nie powinny to być 50bajty, ponieważ nie trzeba liczyć na f=podstawie meta konsensusu, że anonimowe deklaracje funkcji są dozwolone?
R. Kap
1
@ R.Kap Dobry chwyt, ale w tym przypadku f=jest wymagany, ponieważ funkcja musi się wywołać (jako pierwszy parametr do setTimeout).
ETHprodukcje
8

Galaretka , 13 12 bajtów

40µṄœS.+2µ⁴¡

Wypróbuj online! Program Jelly jest zawinięty w skrypt Bash, aby poprzedzać każdą linię wyjścia znacznikiem czasu.

Jak to działa

40µṄœS.+2µ⁴¡  Main link. No arguments.

40             Set the return value to 40.
  µ      µ⁴¡  Execute the chain between the two µ 16 times.

   Ṅ           Print the return value, followed by a linefeed.
      .        Yield 0.5.
    œS         Sleep for 0.5 seconds. Yield the previous result.
       +2      Add 2.

Po ostatniej iteracji wartość końcowa 72 jest drukowana domyślnie i program kończy działanie.

Dennis
źródło
Wow, czy to zamierzona funkcja, możliwość dzwonienia do innych języków z Bash in tio?
mile
2
Tak, to jest zamierzone. Powinieneś być w stanie zrobić to samo ze wszystkich języków obsługujących wywołania systemowe lub podobne funkcje.
Dennis,
Dla języka, który wygrywa w golfa, a część wyzwania jest zwiększana o stałą wartość, dla mnie wygląda to bardzo długo :)
AlexRacer
6

Perl 6 , 30 bajtów

for 20..36 {sleep .5;say 2*$_}

Przepraszam, że wygląda jak kod bez golfa, nie widzę sposobu, aby go skrócić ...

Wersja, która zatrzymuje się zaraz po ostatnim numerze, miałaby 37 bajtów:

for 20..36 {sleep .5 if $++;say 2*$_}
smls
źródło
Czy potrzebujesz później miejsca 36?
NoOneIsHere
2
.say&sleep(.5) for 40,42...7229 bajtów
ugexe
@ugexe: Poleganie na skutkach ubocznych argumentów operatorów, którzy nie mają zwarcia, aby się odbyło, wydaje mi się hackem specyficznym dla implementacji, ponieważ AFAIK specyfikacja języka tego nie gwarantuje. OTOH, może dla golfa z kodem jest w porządku?
smls
@SeeOneRhino: Tak. {Wspornik następstwie innej ekspresji bez białych jest interpretowane jako rozpoczęciem mieszania ( „asocjacyjny”) indeksu tablicy. Perl 6 jest taki ścisły, ponieważ jego gramatyka została celowo zaprojektowana, aby umożliwić jednoprzebiegową analizę kodu źródłowego (prawie) bez cofania.
smls
6

Pyth - 12 bajtów

Bardzo proste, używa pętli for od 0-17.

V17+40yN.d.5
Maltysen
źródło
Najmniejszy jak dotąd, jesteś remisowany na pierwszym miejscu :)
IMustBeSomeone
6

TI-Basic (tylko CE lub CSE), 16 bajtów

:For(A,40,72
:Pause A,.5
:End

Zauważ, że wiele poleceń to tokeny jednobajtowe.

Julian Lachniet
źródło
Widzę 29 bajtów? Czy możesz wyświetlić 8-bajtowy kod?
redstarcoder
1
TI-Basic ma własny zestaw znaków. For(, Pause , End, A dwukropek na początku linii są wszystkie pojedyncze bajty.
Julian Lachniet
Dziwne ... w porządku, wygląda na to, że robią to również inne odpowiedzi.
redstarcoder
1
Jak dotąd najlepiej! Nie wiem jednak, czy policzę zestaw znaków.
IMustBeSomeone
5

MATL , 14 bajtów

17:E38+".5Y.@D

Wypróbuj w MATL Online! Może być konieczne ponowne załadowanie strony, jeśli początkowo nie działa.

Wyjaśnienie

17:     % Push array [1 2 ... 17]
E       % Multiply by 2, element-wise
38+     % Add 38, element-wise. This gives [40 42 ... 72]
"       % For each k in that array
  .5Y.  %   Pause 0.5 seconds
  @D    %   Push k and display
        % End (implicit)

Stara wersja (przed zmianą specyfikacji), czyszczenie ekranu

17:E38+"5&Xx@D

Wypróbuj w MATL Online!

Luis Mendo
źródło
Nie musisz czyścić ekranu.
Adám
@ Adám Thanks. Wiem, ale zajęło to tyle samo bajtów i wygląda ładniej :-)
Luis Mendo,
1
@LuisMendo Wyzwanie golfa mówi coś o tym, że nie wyczyściłem ekranu, po edycji / wyjaśnieniu (być może po twoim poście)
Thomas Ward
@ThomasWard Dzięki za heads-up! OP naprawdę powinien był powiadomić respondentów o zmianie
Luis Mendo
4

Dyalog APL , 20 bajtów

{⎕DL.5⊣⎕←⍵}¨38+2×⍳17

{ anonimowa funkcja

⎕DL opóźnienie...

.5⊣ pół (sekunda) zamiast wartości

⎕← drukuj (z nową linią)

 argument

stosowane do każdego z

38+ trzydzieści osiem plus

dwa razy

⍳17 liczby całkowite od 1 do 17

Adám
źródło
4

C skompilowany z Clangiem 3.8.1 w systemie Linux, 62 59 58 bajtów

2 bajty zapisane dzięki @ranisalt

s=38;main(){for(;s<74;printf("%d\n",s+=2))usleep(500000);}

59 bajtów

s=38;main(){for(;s<73;printf("%d\n",s+=2+usleep(500000)));}

62 bajtów

s=38;main(){for(;s!=72;){printf("%d\n",s+=2);usleep(500000);}}

s=38                # Initializes a global (int) variable, this is only possible in C, in other languages from the C family variables must have an explicit type.
main()              # Is the main entry point, again as before, in case a type isn't specified C defaults to int
printf("%d\n",s+=2) # printf outputs to stdout based on the pattern defined in the first parameter 
                    # %d is a placeholder for an int variable
                    # \n appends a newline to stdout
                    # The second parameter increments the s variable and afterwards it goes in the placeholder's spot.
usleep(500000)      # This function is Linux specific, it takes an int as parameter, it represents how much time the app needs to sleep in microseconds
Wade Tyler
źródło
2
Dziękujemy za odpowiedź i witamy na stronie. Czy możesz dodać wyjaśnienie dla tych, którzy nie znają twojego języka?
isaacg,
1
Dzięki za powitanie mnie. Tak, jasne, mogę to zrobić. Ponadto, jak sprawić, by mój post obliczył, ile bajtów zajmuje? Sam to napisałem, ale w postach innych wygląda to inaczej.
Wade Tyler,
Każdy pisze to sam, nie ma funkcji automatycznego obliczania. Nagłówek używa ** ... **znaczników, podczas gdy tradycyjny nagłówek na tej stronie # .... Zredagowałem twoją odpowiedź, abyś mógł zobaczyć, jak to się robi.
isaacg,
1
@isaacg Wielkie dzięki. Teraz wygląda lepiej.
Wade Tyler,
1
Użycie s<72zapisuje kolejny bajt.
ranisalt
4

Scratch, 5 bloków

(miejsce na dysku 56.0kb)

img

(przepraszam za niską rozdzielczość!)

Naprawdę oczywiste. Wartość zmiennej jest wyświetlana w polu na „scenie”.

RudolfJelin
źródło
Czy to nie ma przyrostu 4? (w przeciwieństwie do 2 jako żądanie)
VisualMelon
1
@VisualMelon Ach, dziękuję za zawiadomienie - źle zinterpretowałem pytanie przed jego edycją; Później ponownie go przeczytałem i zredagowałem drugą odpowiedź, zapominając o tej. Dzięki!
RudolfJelin
3

Mathematica, 34 bajty

Pause[Print@#;.5]&/@Range[40,72,2]

Pełny program Nie pobiera danych wejściowych i wyjściowych do STDOUT.

LegionMammal978
źródło
3

R, 49 bajtów

x=38;while(x<72){Sys.sleep(.5);x=x+2;cat(x,"\n")}

Bardzo trywialne rozwiązanie, ale załatwia sprawę.

Billywob
źródło
Początkowe x = 40 nie drukuje 40 na początku. Musisz zacząć od x = 38.
rnso
Zabawny, ten sam pomysł, ale z forpętlą ma dokładnie taką samą długość.
JAD
3

Perl 6 , 27 bajtów

sleep .say/2 for 40,42...72

sayzwraca True, która jest 1dzielona na wartość liczbową po podzieleniu przez 2.

Zhenanigany w Unicode mogą mieć maksymalnie 23 znaki:

sleep .say/2 for ㊵,㊷…72

Ale to 29 bajtów zakodowanych w UTF-8.

Sean
źródło
3

Python 2, 57 56 55 bajtów

import time
a=40
while a<73:print a;time.sleep(.5);a+=2

EDYTOWAĆ:

-1 bajt dzięki Mega Man

-1 bajt dzięki Flp.Tkc

sonrad10
źródło
1
Możesz zaoszczędzić jeden bajt, używając 0,5 zamiast 0,5
Mega Man
@MegaMan Dzięki, nie zdawałem sobie sprawy, że to może zadziałać
sonrad10,
Dlaczego nie usunąć nawiasu wokół instrukcji print i użyć Python 2?
FlipTack,
3

Ruby, 33 bajty

(40).step(72,2){|n|p n;sleep 0.5}
Jatin Dhankhar
źródło
3

C #, 95 bajtów

()=>{for(int i=40;i<73;i+=2){System.Console.WriteLine(i);System.Threading.Thread.Sleep(500);}};

Jest to prosta pętla, na końcu czeka dodatkowe 500 ms.

Horváth Dávid
źródło
3

QBIC , 21 bajtów

[44,72,4|?a┘'sleep 1.

QBIC uruchamia pętlę FOR, od 44 do 72 i zwiększając licznik o 4 w każdej pętli. Następnie śpi przez 1 sekundę. QBasic nie ma bardziej szczegółowej kontroli sleep, więc dodałem jako argument .symulację dawania .5.

Steenbergh
źródło
3

Kotlin, 47 bajtów

Wydaje mi się, że w opisie problemu nie powiedziano, że rozwiązania powinny faktycznie zawierać przyrost o dwa, więc 40+2*ijest to tutaj legalne.

Jeśli napisane jako zwykłe źródło Kotlin z main:

fun main(args:Array<String>){(0..16).map{println(40+2*it);Thread.sleep(500)}}

(77 bajtów)

UPD : W Kotlin 1.3 args:Array<String>można go usunąć, więc jest 18 bajtów mniej.

W Skrypcie Kotlina byłby cały program

(0..16).map{println(40+2*it);Thread.sleep(500)}

(47 bajtów)

Klawisz skrótu
źródło
Twój pierwszy program wydaje się najpierw czekać długo, a następnie wyświetlać wszystkie wyniki.
devRicher
1
@devRicher, wygląda na to, że używasz go na try.kotlinlang.org. Jeśli tak, to problem środowiska, wygląda na to, że standardowe wyjście nie jest opróżniane lub coś takiego. Kiedy uruchamiam go lokalnie, zachowuje się zgodnie z przeznaczeniem.
skrót
2

Haskell, 67 bajtów

import System.Posix.Unistd
mapM((>>usleep 500000).print)[40,42..70]

Jeśli chcesz korzystać tylko z ghc, możesz zaoszczędzić kilka bajtów, importując GHC.Conci używając threadDelayzamiast usleep.

nimi
źródło
2

php, 38 bajtów

for(;35>$t+=2;usleep(5e5))echo$t+38,_;

używa znaku podkreślenia jako separatora. Uruchom z -nr.

Tytus
źródło
2

Clojure, 54 bajty

(doseq[t(range 32 73 2)](println t)(Thread/sleep 500))

Trzecie seplenienie ftw. Po prostu iteruje w zakresie, drukuje i śpi każdą iterację. Śpi na końcu.

Nie golfowany:

(doseq [t (range 32 73 2)]
    (println t)
    (Thread/sleep 500)))

Wersja, która nie śpi na końcu, 66 bajtów

(doseq[t(range 32 73 2)](println t)(if(< t 72)(Thread/sleep 500)))

Uwaga: są to pełne programy, ponieważ instrukcje nie określają. Dodaj bajt do każdego, jeśli wymagana jest funkcja.

Carcigenicate
źródło
2

Rakieta 46 bajtów

(for((i(range 40 73 2)))(println i)(sleep .5))

Nie golfowany:

(define (f)
  (for ((i (range 40 73 2)))
    (println i)
    (sleep .5)))

Polecenie do uruchomienia: (f)

rnso
źródło
1
Pamiętaj, że nie musi zatrzymywać się na 72, może czekać kolejne 500ms. :)
IMustBeSomeone
2

Oktawa, 38 35 bajtów

Zaoszczędź 3 bajty dzięki @LuisMendo, zmieniając endfornaend

for i=20:36;disp(2*i);sleep(.5);end

Wypróbuj online!

Jestem nowy w Octave, więc to rozwiązanie może być jeszcze bardziej rozbudowane. Wszelkie wskazówki są mile widziane!

Bez golfa

for i=20:36
  disp(2*i)
  sleep(.5)
end
Kritixi Lithos
źródło
2

Python 2, 57 58 bajtów

Edytować

Liczone jako 57 bajtów na mojej poręczności, ale TIO mówi teraz 58, że wróciłem na własną maszynę, więc to moja ostateczna oferta. Co ciekawe, TIO wydaje się nie respektować limitu czasu i po prostu czeka, a następnie drukuje całą listę za jednym razem. Działa na QPython dla Androida i Python 2 na moim systemie Ubuntu, więc to mi wystarczy.

import time
for x in range(40,74,2):print x;time.sleep(.5)

Wypróbuj online!

W Pythonie 3 byłoby 58 59, więc i tak nie bije @ sonrad10.

ElPedro
źródło
1
To spowodowałoby błąd składniowy, potrzebujesz dwukropka (nie średnika) porange(...)
FlipTack,
Dzięki @ Flp.Tkc. Został wpisany bezpośrednio na mojej podręcznej literówce.
ElPedro
2

R 44 44 bajtów

Prosta pętla for, prawdopodobnie istnieje bardziej golfista. (Poza tym przekreślone 44 jest nadal regularne 44 ...)

for(i in 20:36*2)cat(i,"\n",Sys.sleep(.5))
rturnbull
źródło
2

F #, 60 bajtów

async{for i in 40..2..72 do printfn"%d"i;do!Async.Sleep 500}

Jest to wyrażenie asynchroniczne, w celu uruchomienia należy przekazać je do Async.Startlub Async.RunSynchronously.

pmbanka
źródło
2

Noodel , niekonkurencyjne 10 bajtów

Nie można konkurować, ponieważ Noodel urodził się po utworzeniu wyzwania :(

40Ḷ16ñ++ḍh

Spróbuj:)

Jak to działa

40         # Creates the literal number 40 and places it into the pipe.
  Ḷ16      # Loop the following code 16 times.
     ñ     # Print what is in the front of the pipe with a new line.
      ++   # Increment what is in the pipe by two.
        ḍh # Delay for a half a second (500ms).

Nie ma wersji Noodel, która obsługuje składnię zastosowaną w tej odpowiedzi. Oto poprawna wersja:

kȥḶ16ñ⁺2ḍh

<div id="noodel" code="kȥḶ16ñ⁺2ḍh" input="" cols="10" rows="17"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

tkellehe
źródło