Witamy w szlifierce.
Twoim zadaniem jest przekształcenie dużych kamieni w małe skały poprzez ich zmielenie.
Weź wkład dużego kamienia wielkości n > 3
i zmiel go.
Kontynuuj mielenie skał, wrzucając je do młynka, aż rozmiar wszystkich skał będzie 2
.
skały są zawsze mielone na równe, nawet połówki. Jeśli wynik szlifowania jest nieparzysty, weź wynik - 1.
W miarę postępów drukuj dane wyjściowe każdego szlifowania.
Przykłady
wkład: 5
wydajność: 22
Rezultatem są dwie skały wielkości 2
wkład: 50
wydajność:
2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222
wynikiem jest 16 kamieni wielkości 2
wkład: 30
wydajność:
1414
6666
22222222
wynikiem jest 8 kamieni wielkości 2
To jest golf golfowy, więc wygrywa najkrótszy kod! Baw się dobrze i powodzenia!
code-golf
math
arithmetic
jacksonecac
źródło
źródło
Odpowiedzi:
TSQL,
6159 bajtówWypróbuj to
źródło
COW,
297291 bajtówWypróbuj online!
Kod drukuje każdą liczbę w osobnym wierszu i oddziela iteracje dodatkowym nowym wierszem. Drukuje również samą pierwszą iterację, a następnie nową linię. Zatem wejście 5 dałoby wynik, który wygląda jak
5 2 2
oprócz znaków nowej linii zamiast spacji. Przykładowe dane wyjściowe dla50
podano poniżej.Drzewo objaśnień:
Przykładowe dane wyjściowe dla wejścia 50:
źródło
05AB1E ,
1211 bajtówWypróbuj online!
Wyjaśnienie
źródło
Python 2,
5553 bajtówPodziel się przez 4 i przesuń w lewo przez 1, aby uzyskać specjalną dywizję
źródło
Haskell,
75 71 60 5047 bajtówWypróbuj online! Edycja: Ponieważ wyjściem może być teraz lista zawierająca dane wejściowe, można zapisać
1013 bajtów.Stosowanie:
Oryginalna 60-bajtowa wersja:
Wypróbuj online! Dzięki Christian Sievers za wskazanie krótszej formuły.
Stosowanie:
źródło
z<-2*div n 4
.JavaScript (ES6)
645957 bajtówźródło
f=
ale jest tylko na demoPython 2,
4847 bajtówźródło
s=s/4*2
będzie działał dla 1 bajtu zapisu.Java, 85 bajtów
Testowanie i nie golfista
Uwaga: nie wiem dlaczego, Ideone wciąż podaje błąd wewnętrzny, więc testowanie go jest problemem. Aby przetestować, po prostu skopiuj / wklej i uruchom w standardowym środowisku Java IDE. (Działa tam, upewniłem się o tym;))
źródło
n=n/4*2
sztuczka. :)C #,
888683 bajtówZaoszczędzono 3 bajty dzięki Skorm
Zapisano kolejny bajt, zmieniając
while
dofor
pętli, która zawiera deklaracje zmiennychZaoszczędzono 1 bajt dzięki Yodle
Anonimowa funkcja, która zwraca ciąg znaków złożony z wyniku każdego mielenia.
Pełny program z niepoznaną metodą i przypadkami testowymi [przed ostatnią edycją!]:
źródło
for(i=0;i++<c;)
for (i = 0; i++ < c;)
n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
CJam , 21 bajtów
Wypróbuj online! (Jako zestaw testowy.)
Wyjaśnienie
źródło
Pyth,
181613 bajtów*
\n
to nowa liniaObjaśnienie:
Wypróbuj tutaj
źródło
MATL , 13 bajtów
Wypróbuj online!
źródło
PHP,
726764 bajtówPobiera argument z wiersza poleceń. Uruchom z
-r
.źródło
Galaretka ,
13 1211 bajtówTryItOnline!
Uwaga: OP stwierdził, że dane wejściowe mogą również znajdować się w danych wyjściowych.
W jaki sposób?
Wersja bez danych wejściowych wyświetlanych dla 12 bajtów:
:4Ḥḟ0x2µÐĿḊG
źródło
Perl,
403530 + 1 = 31 bajtówUruchom z
-n
flagą-4 bajty dzięki @Dada
Wypróbuj online!
Perl automatycznie odczytuje dane wejściowe do zmiennej,
$_
gdy-n
jest ustawiona.$.
jest specjalną zmienną ustawioną1
na początku programu przez interpretera, więc mogę go użyć jako podstawy do podwojenia. Przy każdej iteracjiwhile
pętla przesuwa$_
się nieco w dół i wykonuje logiczne ORAZ względem swojej negatywnej minus jeden, aby anulować jeden bit.źródło
perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'
(może to można pograć jeszcze bardziej, nie spędziłem na tym dużo czasu).PowerShell 3+,
5854 bajtówDzięki TimmyD za uratowanie mnie 4 bajtów!
Nieznacznie niepolecany (formatowanie)
Wyjaśnienie
Używam tego samego podziału przez 4, pomnóż przez 2 lewę, jak wiele innych odpowiedzi, ale napotkałem problem. PowerShell konwertuje liczby na zmiennoprzecinkowe, jeśli jest to potrzebne podczas podziału, a do gry w golfa jest to denerwujące, ponieważ
$v/4*2
staje się czymś niefortunnym[int]($v/4)*2
. Obejrzałem to za pomocą bitshiftingu do podziału-shr
.Aby obliczyć, ile razy wydrukować iterację, po prostu biorę,
(2^$i)-1
która działa ładnie i ma dodatkowy efekt polegający na pominięciu wartości wejściowej. Próba pomnożenia tylko przez 2 była problematyczna, ponieważ rozpoczęcie od 0 utrudnia zwiększenie wartości za pomocą just$i*=2
a rozpoczęcie od 1 wymaga zbyt dużej korekty, aby uzyskać poprawną liczbę.Ponieważ PowerShell nie ma do tego operatora, a chciałem tego uniknąć
[Math]::Pow()
, ponownie polegałem na przesunięciu bitów dla moich mocy 2.źródło
Python 2, 47 bajtów
Ponieważ OP powiedział, że tablica 1D zawierająca dane wejściowe jest w porządku, wymyśliłem tę funkcję rekurencyjną, która niestety wiąże się tylko z obecnym zwycięzcą Pythona.
źródło
f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[])
za 46Perl, 47 bajtów
Tym razem brak opcji wiersza poleceń (wyjątkowo w Perlu). Podstawową ideą jest to, że ponieważ wszystkie skały na danym etapie mają ten sam rozmiar, po prostu rejestrujemy rozmiar (cal
$a
) i liczbę (cal$_
), zamiast rejestrować całą listę. Nie mogłem znaleźć sposobu na pozbycie się przestrzeni (lub+
) późniejsay
; możesz przenieść2*
ale nie zostanie on poprawnie przeanalizowany, jeśli nastąpi po nim nawias otwierający.Nie mogę się oprzeć wrażeniu, że można to poprawić, ale nie widzę, jak to zrobić.
źródło
die
wyraźnie wydaje się nieoptymalny. Ale wciąż musimy sposób na sprawdzenie, czy musimy się zatrzymać, czy nie -> rozwiązaniem jest użycie czasu zamiastfor
:while$a>1
. Ale musimy znaleźć zamiennik$_
: każda zmienna zunifikalizowana może to zrobić: zastąpić1<<$_
przez1<<++$x
. Więc teraz$_
można go używać, możemy następnie użyć-n
i zastąpić każdy$a
z$_
, a pierwsza instrukcja staje się$_>>=1
. Ponieważ mamy-n
,$.
jest ustawiony, więc możemy zastąpić1<<++$l
z$.*=2
.perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'
(39 bytes). Then notice that$_>>=1
is done twice, so we can try to get rid of one (the first one). Trying to get rid of it, I gotsay$_ x($.*=2)while($_>>=1)/2>1
(put both of them inside thewhile
condition). But the result is wrong ($_
can be odd), and trying to make sure it's even, I end up withwhile$_=$_>>1&~1
. So the code is nowsay$_ x($.*=2)while($_=$_>>1&~1)
.Vim
6154 bytesTryItOnline!
Unprintables:
Luckily vim automatically truncates on x/2.
źródło
JavaScript,
71635958 BytesWell, I came up with this javascript solution. Totally new at golfing, but I foudn this a fun challenge
Saved 4 bytes thanks to Titus suggestion using a for loop.
ungolfed basis:
Golfed version
I'm open for suggestions how to improve it / learn golfing
input tester
Show code snippet
źródło
for
loop:for(o=i=30;i>2;console.log(...)){...}
. And with combining the two grinding assigments to one, you can remove the braces:i=i/4<<1;
(-5). Not sure ifi=i/4*2;
will do the same.BASH, 81 bytes
źródło
Swift, 84 Bytes
Ungolfed
źródło
Befunge, 45 bytes
Try it online!
Explanation
źródło
Javascript, 106 bytes
First code golf, thought I'd have a go. (It's not very good).
Unminified:
źródło