Tak, jak dużo , a nie ile ...
Jak wszyscy wiemy, duży prezent jest znacznie lepszy niż mały. Dlatego wartość prezentów należy zawsze mierzyć w całkowitej objętości, a nie w ilości prezentów, wadze, a nawet w łącznej cenie.
Ponieważ nie ma nic przeciwko porównywaniu ilości prezentów, które się dostaje, nie potrzebujesz długiego skryptu, który będzie łatwo widoczny i czytany przez innych na przyjęciu bożonarodzeniowym. Dlatego musisz ograniczyć liczbę bajtów do skryptu.
Twoje zadanie jest proste: utwórz program, który pobiera listę wymiarów jako dane wejściowe, w dowolnym odpowiednim formacie, i generuje połączoną objętość prezentów. Wymiar każdego prezentu będzie albo zbiorem trzech liczb, albo pojedynczej liczby. Jeśli dane wejściowe to trzy liczby ( L, W, H
), teraźniejszość jest prostopadłościanem wymiarów L x W x H
. Jeśli jest to pojedyncza liczba ( R
), teraźniejszość jest kulą o promieniu R
.
Zasady:
- Może to być pełny program lub funkcja
- Dane wejściowe mogą być w dowolnym dogodnym formacie
- Jeśli jest to pożądane, kula może być reprezentowana przez liczbę, po której następują dwa zera
- Prostopadłościan zawsze będzie miał wszystkie niezerowe wymiary.
- Dane wyjściowe powinny być pojedynczymi liczbami dziesiętnymi
- Dodatkowe dane wyjściowe są akceptowane, o ile jest oczywiste, jaka jest odpowiedź
- Dane wyjściowe muszą mieć co najmniej dwie cyfry po przecinku
- Dane wyjściowe mogą być w standardowej formie / notacji naukowej, jeśli liczba jest większa niż 1000.
- Jeśli twój język nie ma stałej Pi, odpowiedź powinna być dokładna do 9999.99.
Przykłady:
((1,4,3),(2,2,2),(3),(4,4,4))
197.0973 // (1*4*3 + 2*2*2 + 4/3*pi*3^3 + 4*4*4)
(5)
523.5988
(5,0,0)
523.5988
Tabela liderów
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=67027,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
(5)
to tylko częściowy przykład, a nasz kod musi się z tym pogodzić((5))
.Odpowiedzi:
Galaretka ,
1918 bajtówWypróbuj online!
Niestety, Jelly nie ma jeszcze stałej π , a wektoryzator nie obsługuje poprawnie pływaków.
Aby rozwiązać te problemy, zamiast mnożenia przez 4π / 3 , mnożymy przez 1420 i dzielimy przez 339 . Ponieważ 1420 ÷ 339 = 4.18879056… i 4π / 3 = 4.18879020… , jest to wystarczająco precyzyjne, aby zachować zgodność z przepisami.
Najnowsza wersja Jelly mogła wykonać to zadanie w 14 bajtach z większą precyzją.
Wypróbuj online!
Jak to działa
Wersja niekonkurencyjna używa
×240°
zamiast tego×1420÷339
, który mnoży przez 240 i przekształca produkty w radiany.źródło
Haskell, 40 bajtów
Przykład użycia:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Jak to działa: Dla każdego elementu listy wejściowej: jeśli ma pojedynczy element,
x
oblicz objętość kuli, w przeciwnym razie weźproduct
. Podsumowując.źródło
p=sum.map q
(a potem kazałem użyćp
na liście numerów)sum.map q
jest nienazwaną funkcją, która zależy odq
, więc myślę, że jest w porządku.Pyth,
1918 bajtów1 bajt dzięki Dennisowi
Demonstracja
Format wejściowy to lista list:
Po prostu mnoży wymiary razem, aby obliczyć objętość kostki. Jeśli osiągnie zero, oblicza objętość kuli.
Stała kuli
4/3*pi
obliczana jest w radianach jako 240 stopni..t ... 7
konwertuje dane wejściowe w stopniach na radiany iC\ð
oblicza punkt kodowyð
, który wynosi 240.źródło
Python 2,
8670 bajtówźródło
3.14159265358979323
aby wyrównaćMathematica, 34 bajty
Nienazwana funkcja, która pobiera zagnieżdżoną listę długości i zwraca wolumin jako liczbę rzeczywistą.
Najpierw zamieniamy pojedyncze wartości na objętość odpowiedniej kuli za pomocą
/.{r_}:>{4r^3/3Pi}
. Następnie pomnożymy zawartość każdej listy przez1.##&@@@
. Na koniec obliczamy sumę jako ślad wektora za pomocąTr[...]
.źródło
JavaScript (ES6), 56
Bardziej sensowna
.reduce
wersja jest dłuższa o 1 bajtźródło
4.11879
zamiast4/3*Math.PI
, ponieważ powinno to być wystarczająco dokładne, aby się zakwalifikować.In case your language doesn't have a Pi-constant,
mój język ma stałą PI, więc nie wiem, czy się kwalifikujePython, 49 bajtów
Używa reprezentacji sfer jako
(a,0,0)
. Traktowany jako prostopadłościan ma objętość 0, w którym to przypadku stosuje się objętość kuli. Nie jestem pewien, jak dokładna musi być stała, więc mam nadzieję, że to wystarczy.źródło
MATL , 20 bajtów
Format wejściowy to macierz, w której każdy wiersz opisuje sześcian lub kulę. Kula jest zdefiniowana tylko przez pierwszą liczbę w tym rzędzie; pozostałe dwie liczby są równe zero. Tak więc pierwszym przykładem wyzwania byłoby:
Wykorzystuje bieżącą wersję języka 2.0.2 , która jest wcześniejsza niż to wyzwanie.
Przykłady:
Wyjaśnienie:
źródło
Prolog,
115100 bajtówKod:
Wyjaśnił:
Przykłady:
Wypróbuj online tutaj
Edycja: zapisano 15 bajtów, definiując predykat dyadyczny.
źródło
Perl,
5247 bajtów46 + 1 za
-p
(to było powszechne; daj mi znać, jeśli tutaj jest inaczej, a ja zaktualizuję)Sposób użycia: wstaw do pliku i
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
Z komentarzami:
aktualizacja 47 Podziękowania dla @Dennis za zapisanie niektórych bajtów przy użyciu tej sztuczki .
źródło
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
oszczędza kilka bajtów.$_
kosztowało tyle samo. Nadal nie jest jasne, dlaczego$_
jest resetowany w nowym bloku. Czy$_
blok jest lokalnywhile(<>){}
?$_
jest domyślną zmienną bieżącego zakresu. W bloku END jest niezdefiniowany.CJam,
2421 bajtówSprawdź to tutaj.
Wyjaśnienie
źródło
PowerShell, 67 bajtów
Tutaj dzieje się jakaś czarna magia. Spróbuję przejść przez to płynnie.
Najpierw bierzemy nasze dane wejściowe, oczekiwane np. Jako pojedyncze tablice rozdzielane przecinkami
(1,4,3) (2,2,2) (3) (4,4,4)
, i umieszczamy je w pętli|%{}
.Wewnątrz pętli najpierw sprawdzamy, czy
$_
konkretna tablica, którą bierzemy pod uwagę, ma tylko jeden element i używamy tego do indeksowania w tablicy (zasadniczo krótszej konstrukcji if / else). Jeśli jest to więcej niż jeden element, przypuśćmy, że(1,4,3)
jako dane wejściowe, wykonujemy pierwszą połowę, która polega po prostu na wyplucie tablicy$_
, np(1,4,3)
. W przeciwnym razie tworzymy nową tablicę dynamiczną składającą się z elementu trzykrotnie z(,$_*3)
przybliżeniem 4/3 * Pi. W przypadku danych wejściowych(3)
spowoduje to wynik(3,3,3,4.18879)
.Tak, PowerShell ma stałą Pi, dostępną poprzez wywołanie .NET
[math]::PI
, ale to dłużej i nie chcę jej używać. : pNiezależnie od tego łączymy tablicę wyjściową z gwiazdkami za pośrednictwem
-join'*'
, więc"1*4*3"
. Po całkowitym przejściu przez pętlę mamy teraz kolekcję ciągów. Wszyscy-join'+'
razem dla naszego dodania iiex
wyrażenia do obliczenia wyniku.Uff
źródło
Ruby, 58 znaków
Przykładowy przebieg:
Ruby, 50 znaków
Poprawa pomysł bezczelnie skradzione z edc65 „s JavaScript odpowiedź .
Przykładowy przebieg:
źródło
Japt,
2722 bajtówPobiera dane wejściowe jako tablice rozdzielone spacjami. Wypróbuj online!
Jak to działa
źródło
R , 70 bajtów
Wypróbuj online!
źródło
Pip , 23 bajty
Istnieje kilka sposobów na przekazanie danych wejściowych do tego programu. Może przyjmować każdy prezent jako argument wiersza poleceń trzech liczb oddzielonych spacjami (które będą musiały być ujęte w cudzysłowy:)
pip.py present.pip "1 4 3" "3 0 0"
. Alternatywnie, określ-r
flagę i podaj każdy prezent jako linię standardu składającą się z trzech liczb oddzielonych spacją. Wypróbuj online!W jaki sposób?
źródło
Perl 5, 142 bajtów
Uruchom z
-p
wiersza polecenia i wpisz liczby rozdzielane przecinkiem, tak jak poniżej:5,0,0
lub(5,0,0)
produkuje
523.598820058997
W
pi
Perlu nie ma słowa kluczowego. Jest to w większości przypadków zgodne z określonymi liczbami znaczącymi, jednak nawet gdybym wpisał wszystkie liczby pi, które znam, nie byłoby to bardzo dokładne dla niektórych obliczeń. Więc zostawiłem to z3.1415
. Nie jestem pewien, czy jest to dopuszczalne, czy nie.Kod:
Edytowane dla większej precyzji za radą Dennisa, który jest lepszy w podstawowej matematyce ode mnie, oraz z sugestii Michaela, aby zaoszczędzić bajty przy jednoczesnym zachowaniu precyzji.
źródło
1511
? 2. 3.1415 nie jest odpowiednio zaokrąglony ani wystarczająco precyzyjny. Jeśli moje obliczenia są prawidłowe, błąd nie może być większy niż 0,0000017 . 3.(4/3)*3.1415
można zastąpić jednym pływakiem.1420/339
tego dałoby ci kilka bajtów z rozsądnym przybliżeniem. (jest to 4/3 * 355/113). Różnica między ułamkiem a wartością, którą masz, wynosi -8,49130615e-8Lua,
115104 bajtówProste rozwiązanie, muszę owinąć operację pseudo-trójskładnikową
<condition> and <non-false> or <value if false>
w nawiasach, w przeciwnym razie b sumowałoby się z oboma obszarami.Dane wejściowe muszą być w formie,
array={{1,4,3},{2,2,2},{3},{4,4,4}}
a wynik można zobaczyć wykonującprint(f(array))
.źródło
05AB1E ,
1816 bajtówWypróbuj online.
Wyjaśnienie:
źródło
R,
3836 bajtówUżywa domyślnych argumentów do przełączania między przypadkami: z trzema argumentami oblicza produkt, a z jednym argumentem oblicza formułę kuli.
źródło
f<-
i{}
?(5,0,0)
. Ponadto nie uwzględnia przypadku testowego, w którym jest wiele prezentów, a objętości należy zsumować.sum
(i usunąłem rzeczy, które nie były konieczne zgodnie z sugestią Giuseppe)