Te numery Shotgun to sekwencja o dość prostej definicji, ale jakiejś ciekawej strukturze. Zacznij od liczb naturalnych:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Teraz weź wszystkie liczby według wskaźników podzielnych przez 2 , zgrupuj je w pary i zamień liczby w każdej parze:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Teraz zrób to samo z indeksami podzielnymi przez 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
A następnie dla 4 , 5 , 6 i tak dalej:
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Po k takich kroków pierwsze liczby k + 1 zostaną naprawione. Możemy więc zdefiniować nieskończoną sekwencję liczb Strzelby jako granicę pozwalającą k przejść do nieskończoności. Pierwsze 66 liczb to:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Ciekawostka: pomimo tego, że uzyskano ją przez permutację liczb naturalnych, sekwencja nie zawiera liczb pierwszych.
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n > 0
, znajdź n
numer Strzelby. Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i zwrócić wynik lub wydrukować go do STDOUT (lub najbliższej alternatywy).
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach).
Liderów
Otrzymuję więcej odpowiedzi, niż myślałem, a także kilka osób konkurujących w tym samym języku. Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
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
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=47338;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
10
,21
,25
i30
nie pojawiają się też, na przykład.k
iteracjik
element th w tablicy jest transponowany do2k
pozycji th i nie zostanie dotknięty ponownie aż do2k
iteracji, kiedy to zostanie transponowany do4k
pozycji ad ad infinitum. Liczba pierwsza nie zostanie transponowana, dopóki nie nadejdzie jej kolej, że tak powiem, więc wszystkie liczby pierwsze zostaną przesunięte do przodu. Ale możemy z łatwością sporządzić listę niewinnych ofiar, po prostu drukując pierwszy element do transpozycji w iteracji 2 i każdej nieparzystej iteracji. Lista obejmuje: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...Odpowiedzi:
Pyth, 19
22Dość naiwna implementacja odpowiedzi na skrypt golfowy @ PeterTaylor .
Wypróbuj online tutaj
Używa tych samych sztuczek, aby przekształcić pętlę while w fold, tak jak robi to inny program Pyth poniżej.
Naiwna kopia algorytmu @ Sp3000 przetłumaczona na Pyth.
Możesz spróbować online tutaj
Wykorzystuje redukcję (nazwa pytona dla fold) do emulacji pętli while. Wymienia to,
range(input, 2)
co działa w Pythrange(2, input)[::-1]
. Pozostałe Pyth związane golfs polega na zastosowaniunot
zamiast<2
i przy użyciuy
„s tryb podwojenia wartości argumentów liczbowych ukryte.źródło
> <>,
5245 bajtówStrona Esolangs dla> <>
Istnieje wiele elementów do kopiowania i przenoszenia, dzięki kilku potrzebnym modułom i mnożeniom. Logika jest dokładnie taka sama jak w moim rozwiązaniu Python .
Pobiera dane wejściowe za pośrednictwem punktu kodowego ze STDIN, np
"!" = 33 -> 75
.źródło
-v
liczy się jako trzy: /Python 2, 58 bajtów
Podobnie jak większość innych odpowiedzi, pomysł polega na pracy wstecz.
Nazwijmy krok
k+1
kroki
, aby po krokui
wszystkie wielokrotnościi
zostały zamienione. Potrzebujemy dwóch prostych obserwacji:n
w tablicy jest zamieniana tylko na etapie,i
jeślin
jest podzielna przezi
,n/i mod 2
. Jeśli jest to 1, jesteś niższą liczbą (i zamienisz się), w przeciwnym razie jesteś wyższą liczbą (i zamienisz się).To daje nam algorytm do pracy wstecz. Spróbujmy z 6, zaczynając od ostatniego kroku (kroku
i = 6
):Teraz wiemy, że liczba pochodzi z pozycji 12. Następnie:
Teraz wiemy, że wcześniej pochodziło z 16 lat. Wreszcie:
Ponieważ jest to pierwszy krok (pamiętaj
k+1
), skończyliśmy, a liczba, która kończy się na pozycji 6, pierwotnie pochodziła z pozycji 14, tj. Szósta liczba strzelb to 14.A teraz wyjaśnienie w języku Python:
źródło
i-1
jako~-i
while
. Dobra robota, Sp3000.u+G**H!%GHty%/GH2rhQ2Q
Haskell, 68 bajtów
Prawdopodobnie dalsza gra w golfa, szczególnie w pierwszym rzędzie. Definiuje funkcję,
s
która przyjmujen
i zwracan
numer strzelby.Wyjaśnienie
Funkcja pomocnika
#
przyjmuje dwie liczbyn
ik
zwracak
liczbę th z listy zdefiniowanej przez zastosowanie operacji zamiany par na każdąn
liczbę. Na przykład zastosowanie go do pierwszych 20 liczb z wynikiemn = 4
daje:Wynik
s n
jest uzyskiwany przez zmniejszenie („zwijanie”) listy[2..n]
przez funkcję drugiego rzędu(.).(#)
, która przyjmuje liczbęm
i funkcjęf
(początkowo funkcję tożsamościid
), i zwraca funkcję, która przyjmujek
i zwracaf (m # k)
. Na przykład w przypadku,n = 4
gdy lista[2,3,4]
jest zredukowana do funkcji, która przyjmujek
i zwracaid (4 # (3 # (2 # k)))
.id
Jest potrzebna tylko dla przypadku bazowegon = 1
, w którym lista jest pusta. Na koniec przekazujemy tej funkcji dane wejściowek = n
, uzyskującn
numer strzelby.źródło
CJam, 32 bajty
Wystarczy postępować zgodnie ze specyfikacją do rzeczy. Uruchamianie instrukcji na większym zestawie, aby nie wpływać na n- tą liczbę.
Wypróbuj online tutaj
źródło
Rubin, 92 bajty
Mój pierwszy golfowy wysiłek. Nie opiera się na żadnej innej odpowiedzi.
Teraz, gdy spojrzałem na niektóre inne, zauważyłem, że większość po prostu definiuje funkcję, a nie kompletny program, który przyjmuje dane wejściowe i generuje dane wyjściowe. OP poprosił o pełny program z wejściem i wyjściem. Czy zwyczajowo ignoruje się takie wymagania?
84 bajtów
Po przeanalizowaniu innych odpowiedzi i stwierdzeniu, że możliwe jest iteracyjne rozwiązanie.
źródło
ARGV
do$*
magicznej globalnej. 2. Jestto_s
to niepotrzebne. 3. Zamiast przypisywaćd
don
w osobnej linii, po prostu zróbd=n=...
golenie znaku. Dobra robota dla twojego pierwszego golfa! :)n+=
linii są niepotrzebne, a oba wystąpienia==0
można bezpiecznie zmienić na<1
.Python 2,
9779 znakówOkreśla poprawną wartość dla każdego indeksu, rekurencyjnie ścigając liczbę do tyłu. Algorytm został odkryty niezależnie.
edycja: teraz drukuje tylko
n
liczbę th zamiast pierwszychn
liczb. Oczywiście podejście iteracyjne byłoby krótsze, ale nie chcę kopiować kodu Sp3000.źródło
g(i,i)
część za szczególnie denerwującą ...print
instrukcję.Haskell, 79 bajtów
Zastosowanie:
p 66
które wyjścia145
Niewiele do wyjaśnienia: funkcja
#
rekurencyjnie oblicza liczbę strzelby w pozycjii
krokus
.p n
zwraca liczbę w pozycjin
krokun
.źródło
k, 41 bajtów
{{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]}
{...}
lambda, x i y są domyślnymi 1. i 2. argumentem$[b;t;f]
operator trójskładnikowy ocenia odpowiednio b, a następnie odpowiednio t / fb!a
modulo b_
piętro, rzutuje wynik podziału na liczbę całkowitą%
podział{...}/[x;y]
napełnij {...} znakiem x i zastosuj na liście y, jest równoważne f [f [.. f [f [x; y0]; y1]; .. yn-1]; yn]|
rewers!
iota, wygeneruj listę od 0 do n-1źródło
Common Lisp,
11391(iteracyjnie: 91)
(oryginał, rekurencyjny: 113)
Przykład
W wersji rekurencyjnej:
Testy
Kontrole i miary dla wersji iteracyjnej:
źródło
Mathematica,
5349 bajtówZdecydowałem się na golfa w mojej referencyjnej implementacji. Jest
∣
to symbol Unicode dla „dzieli” i liczy 3 bajty. W przeciwnym razie używa tego samego algorytmu, jak wszyscy inni.Definiuje nienazwaną funkcję, która przyjmuje
n
jako pojedynczy parametr i zwracan
numer strzelby.źródło
GolfScript, 27 znaków
Wyjaśnienie
Jeśli
f(i, n)
jest to wartość w pozycjin
poi-1
transformacji, mamygdzie
^
oznacza bitowe xor; dane wejściowen
chcemy obliczyćf(n, n)
.Konwersja funkcji rekurencyjnej na pętlę jest nieciekawa; interesujący jest sposób, w jaki
można przepisać. Bardziej oczywistym podejściem jest stwierdzenie, że tak musi być
dla niektórych
g
. Oczywiścieg
zmienia się pomiędzy1
i-1
, ponieważ pozycje zamieniają się naprzemiennie w górę i w dół; ponieważg(1) = 1
(ponieważ1
zamienia się na2
) mamygdzie
**
oznacza potęgowanie. Ostateczne oszczędności pochodzą z przepisania tego jakoSekcja
źródło
u-G*H^_!%GH/GHrhQ2Q
Jeśli nie chcesz tego publikować samodzielnie, powiedz mi / dodaj go do odpowiedzi CW.CJam, 24 bajty
Demo online
Jest to część mojej odpowiedzi w GolfScript , zapożyczając pętlę od odpowiedzi Martina CJam i wykorzystując
divmod
operatora CJam . ( Powiedziałem, że to się przyda!).źródło
Julia,
6157 bajtówTworzy to nienazwaną funkcję, która przyjmuje pojedynczy argument
n
i zwracan
numer strzelby. Aby to nazwać, nadaj mu nazwę, npf=n->(...)
.Przykłady:
Obecnie jest to oparte na niesamowitej odpowiedzi Pythona na @ Sp3000 . Wrócę do tego wkrótce, ponieważ musi być krótszy sposób na zrobienie tego w Julii niż to, co tutaj zrobiłem. Wszelkie uwagi są mile widziane, jak zawsze.
źródło
GML, 76 bajtów
Informacje o GML
źródło
CJam,
2827 bajtówJest to więc trochę zawstydzające ... zanim to opublikowałem, spróbowałem zagrać w golfa i dostałem do 30 bajtów w CJam. Żadna z istniejących odpowiedzi jeszcze tego nie pokonała. W międzyczasie udało mi się również zgolić jeszcze trzy bajty. W komentarzu jest krótsze rozwiązanie Pyth, ale w odpowiedzi nie opublikowano nic krótszego, więc oto jest. Może inspiruje to ludzi APL / J, aby spróbowali nieco bardziej (lub ktoś faktycznie opublikował rozwiązanie Pyth), zanim będę musiał zaakceptować własną odpowiedź. ;)
Sprawdź to tutaj.
Wyjaśnienie
źródło
J,
3432 bajtySpróbuję zagrać w golfa jeszcze trochę i dodam jakieś wyjaśnienie później.
Wypróbuj online tutaj.
źródło
TI-Basic 83/84, 40 bajtów
Informacje o TI-Basic
źródło
Ruby,
5747 bajtówJest to zasadniczo SP3000 roztwór Pythona (z sugestią w XNOR ) przeliczeniu na Ruby. Prawdopodobnie mógłbym zagrać w golfa w kilku miejscach.
źródło