Różnica BCD
Biorąc pod uwagę liczbę całkowitą n, przekonwertuj ją na BCD ( dziesiętny kodowany binarnie ), zastępując każdą cyfrę dziesiętną jej 4-cyfrową reprezentacją binarną
234 -> 0 0 1 0 0 0 1 1 0 1 0 0
Następnie obróć listę cyfr binarnych, aby znaleźć największe i najmniejsze liczby, reprezentowane przez tę listę bez innych zmian.
max: 1 1 0 1 0 0 0 0 1 0 0 0 (the entire list rotated left 6 times)
min: 0 0 0 0 1 0 0 0 1 1 0 1 (the entire list rotated right 2 times)
Przekształć te liczby z powrotem na dziesiętne, traktując listę bitów jako zwykłą wartość binarną i odejmij najmniejszą od największej:
1 1 0 1 0 0 0 0 1 0 0 0 -> 3336
0 0 0 0 1 0 0 0 1 1 0 1 -> 141
3336 - 141 -> 3195
Wynik jest różnicą największych i najmniejszych znalezionych liczb.
Przypadki testowe:
234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825
źródło
Max@#-Min@#&
zapisuje bajt. dobrze?Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&
89 bajtów ORAZ wydajnych. cholera, ten bajt!1-9,10-99,100-999...
oto kilka różnych powiększeń: imgur.com/RXLMkcoGalaretka , 13 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 3 ,
115108 bajtówdzięki Jonathanowi Frechowi za -7 bajtów
Wypróbuj online!
źródło
PowerShell , 153 bajty
Wypróbuj online!
Głupie długie wywołania .NET do konwersji do / z pliku binarnego naprawdę powiększają się tutaj. ;-)
Bierzemy dane wejściowe jako
$args
,char
zawijamy je w ciąg, a następnie rzutujemy na -array. Pętlimy każdą cyfrę,convert
wprowadzając cyfrętoString
do podstawy2
(tj. Zamieniając cyfrę na liczbę binarną), a następnie.padLeft
robiąc z niej czterocyfrową liczbę binarną. Ta wynikowa tablica ciągów znaków jest następnie edytowana-join
w pojedynczy ciąg znaków i ponownie rzutowana jakochar
tablica przed zapisaniem$b
.Następnie zapętlamy
$b
, co zapewnia, że zapętlimy wystarczająco dużo razy, aby uwzględnić każdy obrót. W każdej iteracji odklejamy pierwszy znak,$x
a pozostałe znaki,$y
używając wielu przypisań. Następnie łączymy je z powrotem,$b=$y+$x
aby przesunąć pierwszy element do końca, tj. Skutecznie obracając tablicę o jeden. Który jest-join
ed na ciąg znaków, który służy jako wejście doconvert
rozmowy, aby wyłączyć z podstawy ciąg binarny2
w produktInt64
. Następniesort
wszystkie te liczby wynikowe przechowujemy w$c
. Wreszcie bierzemy największe[-1]
i odejmujemy najmniejsze[0]
. Pozostaje to w potoku, a dane wyjściowe są niejawne.źródło
Ohm v2 , 15 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6),
11810099 bajtówEdycja: Zapisano 11 bajtów dzięki @RickHitchcock. Zaoszczędzono 1 bajt dzięki produktom @ETH. Objaśnienie:
0x1
Prefiks powoduje, że dane wejściowe są ponownie analizowane jako liczba szesnastkowa, której dane binarne są takie same jak BCD pierwotnego numeru z 1 prefiksem (myślę, że jest to bardziej golfowe niż jakikolwiek inny sposób wypełniania do wielokrotności 4 cyfr) . Z wyłączeniem prefiksu, który jest zmieniany z 1 na 0, powstały ciąg jest następnie obracany w każdej możliwej pozycji i przekształcany z binarnego z powrotem na dziesiętny. Na koniec odejmowane jest maksimum i minimum.źródło
.join``
w którym to przypadku potrzebujesz potrójnych backticks itp.n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)].map(_=>`0b${s=s.slice(1)+s[0]}`)))`max`-g`min`
slice
też kolejny !m=>Math[m]
Sztuką jest wielki. Być może zmienić(+`0x1${n}`)
na('0x1'+n-0)
lub podobny?Python 2 ,
115113 bajtówWypróbuj online!
źródło
Pyth , 29 bajtów
Wypróbuj tutaj! lub Sprawdź zestaw testowy.
źródło
Łuska , 18 bajtów
Wypróbuj online!
Powinien istnieć krótszy sposób konwersji cyfry na 4-bitową reprezentację binarną ...
Wyjaśnienie
źródło
APL (Dyalog) , 31 bajtów
Pełna treść programu. Monity o numer z STDIN. Wyświetla wynik do STDOUT.
Wypróbuj online!
⍞
monit o wiersz tekstu z STDIN⍎¨
wykonać (ocenić) każdy (znak)(
…)⊤
Kodować (anti-base) w następującym systemie liczbowym:4/2
cztery binarne bity⍉
transponować,
ravel (spłaszczyć)b←
Przechowywać wb
(na b inary)⊂
załącz (abyśmy wykorzystali całą listę dla każdego obrotu)(
…)⌽¨
Obróć (w lewo) o każdą z następujących kwot:≢b
długośćb
⍳
I ndices tego2⊥¨
dekoduj każdy z base-2.(
…)
Zastosuj do tego następującą milczącą funkcję⌈/
maks. (redukcja)-
minus⌊/
min (redukcja)źródło
APL (Dyalog) ,
3734 bajtówWypróbuj online!
źródło
Galaretka , 21 bajtów
Wypróbuj online!
źródło
Rubin ,
9691 bajtówWypróbuj online!
źródło
Mathematica,
11099 bajtówWypróbuj online!
źródło
Python 3, 141 bajtów
Wypróbuj online
źródło
Retina ,
9689 bajtówWypróbuj online!Nieco wolno, więc link zawiera tylko mały przypadek testowy. Edycja: Zapisano 7 bajtów dzięki @MartinEnder. Wyjaśnienie:
Prefiks trzy
@
s do każdej cyfry. (Reprezentują one0
s BCD, ale są bardziej golfowe.)Zmień
@
s na_
s (reprezentujące1
s BCD).Napraw ostatnią cyfrę BCD.
Wygeneruj wszystkie obroty.
Posortuj je w porządku rosnącym.
Przekształć je w jednoargumentowe.
Odejmij pierwszą od ostatniej liczby, ignorując liczby pośrednie i przekonwertuj na liczbę dziesiętną.
źródło
%
konwersji binarnej na jednoargumentową i można zaoszczędzić kilka dodatkowych bajtów, używając innych znaków niż0
i1
dla binarnych: tio.runHaskell , 130 bajtów
Wypróbuj online!
Wyjaśnienie / Niegolfowany
Ponieważ mamy zamiar użyć
foldl1((+).(2*))
do konwersji z systemu binarnego na dziesiętny, to równie dobrze możemy nie używaćmaximum
, aminimum
raczejfoldl1 max
(albo same zmin
odpowiednio) i użyć krótkiejr = foldr1
.Teraz zdefiniujmy operator,
f#x
który konwertujex
na BCD, generuje wszystkie obroty, redukuje je za pomocąf
i konwertuje na dziesiętny:Teraz jest tylko kwestia użycia tego operatora raz
max
i raz zmin
i odejmowania ich wyników:źródło
PHP,
156153 bajtówWypróbuj online!
źródło
Japt
-x
, 20 bajtówWypróbuj online!
Wprowadź jako tablicę cyfr.
Wyjaśnienie:
źródło
-x
flagi, aby zapisać 2 bajty.Pyth, 24/26 bajtów
Pobiera dane wejściowe jako cytowany ciąg. 26 bajtów, jeśli musi przyjmować dane wejściowe jako liczbę całkowitą; dodać
dz
w takim przypadku.Przypadki testowe (wprowadzane jako ciągi, 24 bajty)
Przypadki testowe (wprowadzane jako liczby, 26 bajtów)
źródło
J, 43 bajty
Wypróbuj online!
Czasami milczący styl utrudnia. Ale prawdopodobnie istnieje sposób, aby to zrobić w sposób milczący, który jest o wiele bardziej zwięzły niż ten.
"."0@":
Wydaje mi się, że pamiętam lepszy sposób na dzielenie liczb na cyfry inne niż, ale nie mogę sobie tego przypomnieć ...Wyjaśnienie
Wyprzedzające i usuwające 8 ma zapewnić, że obecna jest odpowiednia liczba zer (J przekształci tablice tak, aby były wielkościami ich elementu o maksymalnej długości, a 8 to 4 cyfry dwójkowe, więc zostanie użyte).
źródło
APL (NARS), 34 znaki, 68 bajtów
jakiś mały test:
źródło
Perl 5 ,
979189 + 2 (-F
) =999391 bajtówWypróbuj online!
źródło