Brakuje wymaganego znaku funta (#) na wyjściowe próbki w pytaniu.
Iszi
5
PowerShell: 71 52 51 41
Dzięki @manatwork za wskazanie ForEach-Objectmożna zastosować zamiast forpętli.
Dzięki @Joey za wskazanie, że mogę użyć -joinwyjścia pętli, zamiast konieczności umieszczania go w zmiennych.
Kod do gry w golfa:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
Uwaga:
Nie ma tu błędu sprawdzania nieprawidłowych danych wejściowych. Skrypt na szczęście pobierze 256, 4096 i 65536 jako dane wejściowe, a następnie wypisze # 100100010000 (który oczywiście nie będzie działał jako RGB).
Niegolfowany, z komentarzami:
# Put a hashtag in front of the output.
'#'+
# Join the nested code into one string.
-join(
# Pipe 1..3 to ForEach-Object to run a loop three times.
1..3|%{
# Take user input and format it as hex, with minimum two digits in output.
"{0:X2}"-f+(read-host)
}
)
Wykonaj pętlę, foreach($i in 1,2,3)aby zmniejszyć ją do 68 znaków.
manatwork
@manatwork Nie sądzę, że jest to odpowiednia składnia dla programu foreachPowerShell. (Przynajmniej nie udało mi się uruchomić niektórych testów). Jednak używając właściwej składni, wbudowanego aliasu i innego skrótu programu PowerShell, który niedawno odkryłem, myślę, że mam coś lepszego - golenie kolejne 12 znaków poza twoją sugestią. (1..3)|%{...}(Wstaw wielokropek z istniejącego skryptu zamiast wielokropka.) Wciąż muszę to w pełni przetestować w skrypcie, ale dziękuję za skierowanie mnie w tym kierunku!
Iszi
Nie mam pojęcia, czy jest to właściwa składnia, czy nie, ale wzmianka o SS64 foreachwspomina o tym i działa dla mnie. (Nie mam pojęcia o wersji. Ta, która została dostarczona z Windows 7.)
manatwork
@manatwork To ciekawe. Chciałbym przekopać się i dowiedzieć się, co jest z tym nie tak (otrzymałem błąd „nieoczekiwany token” w błędach „...”). Możliwe, że artykuł SS64 został napisany dla innej wersji PowerShell - nie jestem pewien. Na razie potwierdziłem, że to (1..3)|%działa i sprowadzam skrypt do 56 znaków. Przeredaguję to w odpowiedzi i na pewno przypisuję ci pomysł. Dzięki jeszcze raz!
Iszi
2
O rany. Formularz ten można uzyskać do 41 za pomocą -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey,
4
bash 22 21 znaków
(Dzięki @manatwork za 1 znak za pomocą \zamiast podwójnych cudzysłowów)
c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d
Wiem, że mogą być 82 znaki, jeśli zostały 020napisane 16, ale wolę to ... A może d+=${c[$b$a 0x10]}pierwszy post.
hexcolor() {
local a b c=({0..9} {a..f}) d=\#
for b ;do
for a in / % ;do
d+=${c[$b$a 0x10]}
done
done
echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f
Podoba mi się ta odpowiedź :) jeszcze kilka i myślę, że mógłbym się na to zgodzić, gdyby nie było nic lepszego.
Quillion
Chłodny! Tylko unpackpytanie: czy możesz zrobić szesnastkową a ... f wielką literę, jak w pytaniu?
manatwork
@manatwork Próbowałem znaleźć sposób na zrobienie tego w środku unpack, ale bez powodzenia. Jednym ze sposobów jest użycie sprintfzamiast unpack, ale jest to dłuższe i całkowicie ortodoksyjne. Innym sposobem jest po prostu zmodyfikowanie łańcucha na wielkie litery: map{uc unpack H2,chr}kosztem trzech znaków.
breadbox
Dziękuję, @breadbox. Te małe trudne packi unpacknigdy nie wejdą w mój styl kodowania. Więc to jest dla mnie niekonwencjonalne.
nie działa dla 1 1 1, który powinien dać wynik # 010101
maniak zapadkowy
Cześć @ratchetfreak. Mi to pasuje. Właśnie przetestowane z gforth. Daje to 1 1 1wyniki #010101. Wszelkie inne wartości 0-255 również działają. Z jakiego środowiska korzystasz?
Darren Stone
2
C (67 znaków bez płyty głównej)
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
wykorzystanie standardowego printf i bitowego twiddlera
Dobra robota! Pokazy Wciąż muszę się wiele nauczyć o golfie!
Iszi
Och, twój pomysł ze zmiennymi też był sprytny; nigdy by mi nie przyszło do głowy. Tak się składa, że jest dłuższy niż mój zwykły ulubiony: -spliti -join.
Możesz zaoszczędzić kilka bajtów, pozbywając się, [byte]ponieważ dane wejściowe otrzymaliśmy jako liczby całkowite, i edytuj dane wyjściowe tak, aby "#$o"- co daje 31 bajtów$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@ TimmyD nie wiem, czy usunięcie [bajtu] działa poprawnie we wszystkich wersjach w wersji, w której testowałem (iirc 2.0 w xp) bez [bajtu] nie było konkatenacji jako szesnastkowe, ale jako ints tj. 72 61 139 to # 7261139 nie # 483d8b "# $ o" wewnątrz cudzysłowów nie jest dosłowne, ale oceniany jest ciekawy, dzięki czemu docenione zostaną komentarze na temat konwersji szesnastkowej
blabb
Najwyraźniej jest to różnica między PowerShell v2 i v3 - musi być coś w tym, jak odpowiednia wersja .NET obsługuje konwersję szesnastkową, ale nie mogę znaleźć dokumentacji na ten temat.
(Uwaga: wypisuje „#” przed odczytem danych wejściowych --- zadanie nie zabrania tego; biorąc pod uwagę trzy liczby na standardowym wyjściu, tworzy prawidłowe wyjście na standardowym wyjściu. Nie przeszkadza to również w znakach nowej linii i jak widać, nie robi tego „dodaj” # poprawnie, gdy uruchomisz „interaktywnie”).
Monituje o 3 do 9 cyfr RGB. Zwraca wartość szesnastkową ze znakiem szesnastkowym GML,$
d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e
Zrób z tego skrypt. Również skompiluj z niezainicjowanymi zmiennymi traktowanymi jako 0.
Przypadkowo skończyło się na tym, że napisałem prawie dokładnie to samo, co ty, zanim zobaczyłem twój. Bardzo fajnie =) Są na tyle blisko, że nie opublikuję mojego, ale możesz zaoszczędzić kilka bajtów na swoim mapowaniu za pomocą:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Nie trzeba też dołączać r=na początku. Nadal liczy się jako funkcja nawet jako funkcja anonimowa, ponieważ można ją wywoływać bez konieczności przypisywania czegokolwiek.
Mwr247,
Ups Oznaczono, że mapa: x=>(x<16?0:'')+(x*1).toString(16)Twoja i moja pierwsza podają obecnie nieprawidłowe wartości dla x>9.
Mwr247,
To obecnie zwraca #7261139zamiast #483D8Bpierwszego przypadku testowego.
Dennis,
0
Python 2, 40 bajtów
s='#';exec's+="%02X"%input();'*3;print s
Odczytuje dane wejściowe z trzech oddzielnych linii. Nadużycia execi mnożenie ciągów.
Odpowiedzi:
Ruby: 19 znaków
Przykładowy przebieg:
źródło
Rubin
Chodziłem bardziej na część „niekonwencjonalną”. ;)
Czcionka (w mojej przeglądarce) jest nieco wysoka, więc wygląda na zniekształconą, ale lepiej wygląda w Courier New:
Przykładowy przebieg:
źródło
q / k (3 znaki)
Niezupełnie niekonwencjonalny, ale dość krótki
Przykład
Aby dokładnie dopasować format wyjściowy w pytaniu, możemy zrobić (dla 9 znaków):
źródło
PowerShell:
71525141Kod do gry w golfa:
Uwaga:
Nie ma tu błędu sprawdzania nieprawidłowych danych wejściowych. Skrypt na szczęście pobierze 256, 4096 i 65536 jako dane wejściowe, a następnie wypisze # 100100010000 (który oczywiście nie będzie działał jako RGB).
Niegolfowany, z komentarzami:
źródło
foreach($i in 1,2,3)
aby zmniejszyć ją do 68 znaków.foreach
PowerShell. (Przynajmniej nie udało mi się uruchomić niektórych testów). Jednak używając właściwej składni, wbudowanego aliasu i innego skrótu programu PowerShell, który niedawno odkryłem, myślę, że mam coś lepszego - golenie kolejne 12 znaków poza twoją sugestią.(1..3)|%{...}
(Wstaw wielokropek z istniejącego skryptu zamiast wielokropka.) Wciąż muszę to w pełni przetestować w skrypcie, ale dziękuję za skierowanie mnie w tym kierunku!foreach
wspomina o tym i działa dla mnie. (Nie mam pojęcia o wersji. Ta, która została dostarczona z Windows 7.)(1..3)|%
działa i sprowadzam skrypt do 56 znaków. Przeredaguję to w odpowiedzi i na pewno przypisuję ci pomysł. Dzięki jeszcze raz!-join
:'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
.bash
2221 znaków(Dzięki @manatwork za 1 znak za pomocą
\
zamiast podwójnych cudzysłowów)lub czytanie STDIN w pętli: 48 znaków:
Dodano 06.10.2015: bash (bardziej niekonwencjonalna metoda)
8483 znakówWiem, że mogą być 82 znaki, jeśli zostały
020
napisane16
, ale wolę to ... A możed+=${c[$b$a 0x10]}
pierwszy post.Kolejne podejście do bashu
Spowoduje to wyświetlenie okna przeglądarki z:
Gdzie można obrócić kółko myszy, aby zmienić wartości (z klawiszem Shift przytrzymanym krok po kroku 15) ...
źródło
printf \#%02X%02X%02X
wystarczy.d+=${c[$b$a 0x10]}
coś seksownego !d+=${c[$b$a 020]}
wykona robotę i będzie ładnie wyglądaćPerl, 31 znaków
Tak krótki program trudno jest niekonwencjonalny, ale myślę, że to działa.
źródło
unpack
pytanie: czy możesz zrobić szesnastkową a ... f wielką literę, jak w pytaniu?unpack
, ale bez powodzenia. Jednym ze sposobów jest użyciesprintf
zamiastunpack
, ale jest to dłuższe i całkowicie ortodoksyjne. Innym sposobem jest po prostu zmodyfikowanie łańcucha na wielkie litery:map{uc unpack H2,chr}
kosztem trzech znaków.pack
iunpack
nigdy nie wejdą w mój styl kodowania. Więc to jest dla mnie niekonwencjonalne.Skrypt akcji 3 | 43 znaki
Wynik:
#483D8B
źródło
Perl 24 znaków
Przepraszamy, nie jest tak seksowny jak używanie
unpack
, ale krótszy!Bardziej niejasna wersja:
Ale jeśli naprawdę wolisz używać
unpack
, możesz:Na przykład, nie jest to krótsza wersja, ale mi się podoba! (Zwróć uwagę na wykorzystanie
rand
do randowania tego :-)źródło
> <>
10360Wykorzystał zmarnowaną białą przestrzeń i przeniósł do niej trochę kodu
Uruchom z danymi z wiersza poleceń:
wyjście: „# FF2448”
źródło
Dalej, 62 znaki
źródło
1 1 1
wyniki#010101
. Wszelkie inne wartości 0-255 również działają. Z jakiego środowiska korzystasz?C (67 znaków bez płyty głównej)
wykorzystanie standardowego printf i bitowego twiddlera
źródło
readf
? Czy nie powinno tak byćscanf
?Dc:
3532 znakówPrzykładowy przebieg:
Dc:
2724 znaków(Ale potrzebuje liczb wejściowych w osobnych wierszach.)
Przykładowy przebieg:
źródło
dc
odpowiedzi na tej stronie.JavaScript, 89 znaków
Konwertuje
72 61 139
do256*(256*(72)+61)+139
i evals niego.źródło
eval('(('+DEC.replace(/ /g,'<<8)+'))
zamiasteval('256*(256*('+DEC.replace(/ /g,')+'))
pozwala zaoszczędzić 5 znaków!PowerShell, 45
Lub, jeśli można go użyć poprzez przesłanie danych, możesz po prostu użyć
co sprowadza się do 42 .
źródło
-split
i-join
.PowerShell 37
zaoszczędzono jeden bajt dzięki TimmyD
źródło
[byte]
ponieważ dane wejściowe otrzymaliśmy jako liczby całkowite, i edytuj dane wyjściowe tak, aby"#$o"
- co daje 31 bajtów$args|%{$o+="{0:X2}"-f$_};"#$o"
R, 16 bajtów
Otóż to. Użyj wbudowanego.
źródło
C,
6773 znaków (65 znaków bez głównego)Nudny program C - bardzo ortodoksyjny.
źródło
Python 2.7 (80 znaków)
Szukam lepszego sposobu obsługi jednocyfrowych wartości szesnastkowych. Jakieś pomysły?
źródło
Befunge-98, 45 znaków
Bleh, zduplikowany kod. No cóż. Prosta implementacja konwersji radix.
Przykładowy przebieg
(Uwaga: wypisuje „#” przed odczytem danych wejściowych --- zadanie nie zabrania tego; biorąc pod uwagę trzy liczby na standardowym wyjściu, tworzy prawidłowe wyjście na standardowym wyjściu. Nie przeszkadza to również w znakach nowej linii i jak widać, nie robi tego „dodaj” # poprawnie, gdy uruchomisz „interaktywnie”).
źródło
Game Maker Language, 175 (Błąd na pozycji 81)
Monituje o 3 do 9 cyfr RGB. Zwraca wartość szesnastkową ze znakiem szesnastkowym GML,
$
Zrób z tego skrypt. Również skompiluj z niezainicjowanymi zmiennymi traktowanymi jako 0.
Źródło
źródło
Gema, 93 znaki
Przykładowy przebieg:
źródło
Burlsque, 12 bajtów (10 bajtów dla małych liter)
Jeśli dozwolone są również małe litery, to 10 bajtów:
Stosowanie:
Jeśli rozpaczliwie potrzebujesz dużych liter, dodaj
ZZ
:Jeśli nie otrzymasz liczb całkowitych jak w ciągu, przejdź do:
Wyjaśnienie:
Spróbuj online tutaj .
Premia:
Aby go przekonwertować, użyj tego:
źródło
PowerShell, 28 bajtów
Skrypt testowy:
Wynik:
źródło
Python 3.3 @ 60 znaków
Nie mogłem się oprzeć:
źródło
Clojure 76 znaków
Może to być późno, ze względu na kompletność:
Przykładowe wywołania:
źródło
Mathematica, 40 znaków
źródło
Common Lisp, 39 znaków
Przeczytaj trzy liczby całkowite, zwróć ciąg.
źródło
JavaScript ES6, 63 bajty
źródło
x=>(x<16?0:'')+x.toString(16)
r=
na początku. Nadal liczy się jako funkcja nawet jako funkcja anonimowa, ponieważ można ją wywoływać bez konieczności przypisywania czegokolwiek.x=>(x<16?0:'')+(x*1).toString(16)
Twoja i moja pierwsza podają obecnie nieprawidłowe wartości dlax>9
.#7261139
zamiast#483D8B
pierwszego przypadku testowego.Python 2, 40 bajtów
Odczytuje dane wejściowe z trzech oddzielnych linii. Nadużycia
exec
i mnożenie ciągów.Przykładowe użycie:
źródło
Python (55 znaków)
źródło