Jest to bajtowe wyzwanie, w którym musisz przekonwertować temperaturę wejściową w jednej z trzech jednostek (Celsjusza, Kelvina i Fahrenheita) na dwie pozostałe.
Wkład
Otrzymasz temperaturę jako liczbę, a następnie jednostkę (oddzieloną spacją). Temperatura może być liczbą całkowitą lub liczbą zmiennoprzecinkową (23 vs 23,0 lub 23,678).
Możesz przesłać funkcję lub pełny program, który odczytuje ciąg rozdzielony spacjami z argumentu STDIN / ARGV / function lub najbliższego odpowiednika i wypisuje dane wyjściowe do STDOUT lub najbliższego odpowiednika.
Wydajność
Wynikiem powinna być temperatura przekonwertowana na dwa pozostałe formaty, oddzielone znakiem nowej linii, a po nim odpowiedni znak jednostki w każdym wierszu (opcjonalnie oddzielony spacją). Kolejność dwóch jednostek nie ma znaczenia.
Dokładność wyjściowa
- Przeliczona liczba powinna być dokładna do co najmniej 4 miejsc po przecinku bez zaokrąglania.
- Końcowe zera lub miejsca dziesiętne są opcjonalne, o ile pierwsze 4 miejsca dziesiętne (bez zaokrąglania) są dokładne. Możesz również pominąć 4 zera i / lub przecinek dziesiętny, na wypadek gdyby rzeczywista odpowiedź zawierała 4 zera po przecinku.
- Nie powinno być żadnych zer wiodących
- Dowolny format liczb jest dopuszczalny, o ile spełnia powyższe trzy wymagania.
Reprezentacja jednostki
Jednostką temperatury może być tylko jedno z poniższych:
C
dla CelsjuszaK
dla KelvinaF
dla Fahrenheita
Przykłady
Wkład:
23 C
Wydajność:
73.4 F
296.15 K
Wkład:
86.987 F
Wydajność:
303.6983 K
30.5483 C
Wkład:
56.99999999 K
Wydajność:
-216.1500 C
-357.0700 F
To jest golf golfowy, więc wygrywa najkrótszy wpis w bajtach! Wesołego golfa!
Tabela liderów
<script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 50740</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
źródło
23C\n73.4F\n296.15K
? czy musi zostać pominięty format wejściowy?2/3
=>0.666666666666
czy dokładność do 4 cyfr? (Powiedziałbym TAK). A może tak powinno być0.6667
?0.666666666666
jest poprawny. Egzekwuję precyzję opartą na braku zaokrąglania. taka0.6666
jest alternatywa.Odpowiedzi:
CJam,
77656059555452 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Python 3,
118116 bajtówK -> F -> C -> K
Dwukrotnie wykonuje konwersje w kolejności obrotowej .źródło
'FCK'[u]
.JavaScript ( ES6 ), 127
130 132bajtówCzekając na niesamowitą odpowiedź w języku esolanguage, nie znalazłem tu wiele do gry w golfa.
Przy użyciu ciągu szablonu 3 nowe znaki są znaczące i zliczane.
Uruchom snippet w przeglądarce Firefox, aby przetestować.
źródło
Pip,
5857 bajtówPobiera dane wejściowe z argumentów wiersza polecenia.
Sformatowane i lekko nie golfowe:
Wyjaśnienie:
Ogólna formuła konwersji między jednostką 1 a jednostką 2 jest
temp2 = (temp1 - offset1) * mult2 / mult1 + offset2
. Przesunięcia mogą być do zera absolutnego lub do dowolnej innej dogodnej temperatury; użyjmy 0 ° C.Zbudujemy listy tych wartości i zindeksujemy je w oparciu o jednostkę, z którą mamy do czynienia. Pip nie ma tablic asocjacyjnych / skrótów / słowników, dlatego musimy przekonwertować znaki na liczby całkowite. Może będą pomocne wzorce z wartościami ASCII.
To wygląda obiecująco. Jeszcze jeden użyteczny fakt: zawijają się wskaźniki w Pipie. Więc tak naprawdę nie potrzebujemy
%3
tak długo, jak indeksujemy do czegoś o długości 3. Definiowanieo:[32 0 273.15]
i używanie(o (Ab)%7)
załatwi sprawę. (A
pobiera wartość ASCII znaku.(l i)
Składnia służy do indeksowania w iterabach, a także do wywołań funkcji).Do mnożników potrzebujemy tylko dwóch liczb 9 i 5. Ponieważ liczby są takie same jak ciągi znaków w Pip, a zatem są indeksowalne, uzyskanie mnożnika jest tak proste jak
95@Ab
(przy użyciu innej metody indeksowania,@
operatora).Korzystając z funkcji programowania tablic Pip, możemy zapisać postać nad naiwną metodą:
Na koniec dodaj przesunięcie dla nowej jednostki, połącz spację i symbol nowej jednostki na końcu i wydrukuj.
Robimy to dla każdego
t
w"CFK" RM b
, konwertując w ten sposób na każdą jednostkę oprócz oryginału.Przykładowe wywołanie:
(Aby uzyskać więcej informacji na temat Pip, zobacz repozytorium ).
źródło
dc, 102 bajty
Jestem prawie pewien, że można bardziej zagrać w golfa, ale oto początek:
dc ledwo ocenia tę ocenę. W szczególności obsługa ciągów znaków DC nie jest tak naprawdę wystarczająca. Ale wszystko, co musimy zrobić, to rozróżnić „C”, „F” i „K”. Na szczęście dc analizuje „C” i „F” jako cyfry szesnastkowe 12 i 15. A dla „K” pozostawia po prostu 0 na stosie.
Wydajność:
źródło
C, 160 bajtów
To czyta ze standardowego. Nie określono precyzji wydruku, więc drukuje wszystko, co
printf()
wydaje się drukiem, czyli w większości więcej niż 4 cyfry.Wersja bez golfa:
Kilka wyjaśnień / uwag:
f
id
zawiera mnożniki i przesunięcia w celu konwersji Celsjusza na dowolną inną jednostkę (w tym samą Celsjusza, aby uniknąć szczególnych przypadków).u
jest jednostką wejściową,u / 5 - 13
odwzorowujeC
na 0,F
na 1 iK
na 2.int
zmiennej zamiastchar
zmiennej do odbieraniascanf()
danych wejściowych. Jest to niedopasowanie typu, które da prawidłowe wyniki tylko na małych komputerach endianowych (co obecnie jest prawie każdym z nich).źródło
float v,f[]={1,1.8,1,0,32,273.15};u;main(j){scanf("%f %c",&v,&u);for(u=u/4&3,v-=f[u+3],v/=f[u];j++<3;printf("%f %c\n",f[u]*v+f[u+3],"CFK"[u]))u++,u%=3;}
. Zyskałem trochę przy mniejszej liczbie zmiennych, przenosząc kod. Nowym założeniem jest argc = 1 (j = 1).u = u/4 & 3
.Python 2, 168 bajtów
Zobaczyłem rozwiązanie Python 3, gdy miałem to opublikować, ale cokolwiek, po prostu ćwiczę golfa.
Nie golfowany:
źródło
Perl,
85 8076Przetestuj mnie .
źródło
PHP,
161153http://3v4l.org/CpvG7
Byłoby miło zagrać w golfa jeszcze dwie postacie, aby dostać się do pierwszej dziesiątki ...źródło
\n
i zmienił się w prawdziwe nowymi liniami, przekształcony w pełnym programie (odbierającym dane przez GET, np:http://localhost/my_file.php?t=<temperature>
) i zastąpiono$u!=K
z$u^K
i$u!=F
z$u^F
. Jeśli$u
jestK
, uruchomienie$u^K
zwróci pusty ciąg znaków, który jest wartością fałszowania. Również twoja przestrzeń wewnątrz podziału została zamieniona naC^c
(po prostu wyglądać fajnie).Python 2, 167
To moja pierwsza próba na CodeGolf.
źródło
Pyth, 126 bajtów
To wydaje mi się bardzo długie ... no cóż.
źródło
R,
150144141 bajtówWcięte, z nowymi liniami:
Stosowanie:
Dzięki @AlexA. & @MickyT. !
źródło
as.double()
zamiastas.numeric()
.switch
oświadczenie może być wykonanec(x,x-273.15,5*(x-32)/9)[i]
dla 4 znakówas.double(a[1])
zscan(t=a[1])
.JavaScript,
206193187175162159156Dziękuję Optimizer i Ismael Miguel za pomoc w grze w golfa.
źródło
if
else
do?:
if ... return; return ?:
zreturn ?: ?:
a=prompt().split(" "),e=273.15,f=1.8;alert([...]
za=prompt(e=273.15,f=1.8).split(" "),alert([...]
. Możesz także usunąć spacje za urządzeniem. Również usunięciereturn
i przesunięcie funkcjialert
wewnątrz znacznie zredukowało! I zamiast ustawieniaa
, po prostu użyjapply()
metody z podziałem. Ale tutaj przejść:(function(b,c){alert(c=="F"&&((b-32)/f+"C\n"+((b-32)/f+e+"K"))||(c=="C"?b*f+32+"F\n"+(b+e+"K"):b*f-459.67+"F\n"+(b-e+"C")))}).apply(e=273.15,prompt(f=1.8).split(" "))
! 166 bajtów ( -21 bajtów). Zadzwoń do mnie na czacie, jeśli masz wątpliwości.Mathematica, 66
Mam nadzieję, że tym razem poprawię.
Przykład
źródło
Excel, 239 bajtów
112 bajtów służy do oddzielenia wartości i jednostki. Czy ktoś zna lepsze rozwiązanie?
źródło