Na podstawie pytania Ile dodatnich liczb całkowitych <1 000 000 zawiera cyfrę 2? . Szukam najbardziej kreatywne rozwiązania, aby policzyć wszystkie liczby całkowite od X
do Y
zawierający Integer Z
. Z
może wynosić od 0 do Y
.
Każda znaleziona liczba całkowita liczy się tylko raz, nawet jeśli liczba całkowita Z
pojawia się częściej. Na przykład:
Z = 2
123 counts 1
22222 also counts 1
Zacznę od bardzo prostego algorytmu napisanego w Javie (ponieważ wszyscy go kochają):
public class Count {
public static void main(String[] args) {
int count = 0;
for (int i = Integer.parseInt(args[0]); i <= Integer.parseInt(args[1]); i++) {
if (Integer.toString(i).contains(args[2])) {
count++;
}
}
System.out.println(count);
}
}
jeśli uruchomisz to z
java -jar Count.jar 0 1000000 2
otrzymujesz to w wyniku:
468559
Ponieważ ten problem nie jest trudny do rozwiązania, to tylko konkurs popularności . Najpopularniejsza odpowiedź opublikowana do 28 lutego wygrywa!
popularity-contest
counting
Obl Tobl
źródło
źródło
N
może być123
i pasowałoby tylko, jeśli istnieje podciąg 123?Odpowiedzi:
bash (20)
Stosowanie
źródło
Funciton
Jak zwykle, ponieważ wysokość linii dodana przez StackExchange rozkłada linie, rozważ uruchomienie
$('pre').css('line-height',1)
w konsoli przeglądarki, aby to naprawić.W przeciwieństwie do moich innych odpowiedzi Funciton, ta nie używa deklaracji funkcji. To tylko program. Wykorzystuje jednak wyrażenie lambda - funkcję, którą dodałem do Funciton w grudniu :)
Oczekuje danych wejściowych w postaci trzech liczb całkowitych dziesiętnych (może być ujemnych) oddzielonych spacjami (tj
x y z
.). W rzeczywistościz
może być dowolnym ciągiem; na przykład może być tylko znak minus (−
, U + 2212), aby policzyć liczbę liczb ujemnych w przedziale :)źródło
DO#
Przykład
źródło
.Range
akceptuje(int start, int count)
, nie(start, end)
. ZawszeAPL (29)
Jest to funkcja, która przyjmuje
Z
jako lewy argument, a interwał[X,Y]
jako prawy argument:źródło
Python 2.7
Potrzeba prędkości
Wyjaśnienie
Realizacja
Próbny
Porównanie
@Dennis
@arshajii
źródło
key
może być dowolną liczbą całkowitą , nie cyfrową, pomiędzylo
ihi
.Python 2.7
Rozwiązanie wykorzystujące wyrażenia regularne:
źródło
re.findall
w jednej__import__('re').findall('\d...
bash -
32311714 znaków + długość X, Y i ZDzięki devnull za sugestie
seq
!np. X = 100, Y = 200, Z = 20
np. X = 100, Y = 200, Z = 10
np. X = 0, Y = 1000000, Z = 2
źródło
echo
Po co korzystać, kiedy można użyćseq
i zmniejszyć długość o 4 znaki? (1 dla długości polecenia, 2 dla możliwości pominięcia nawiasów klamrowych i 1 dla zastąpienia..
jednym spacją)xargs
iwc
- a także działa znacznie szybciej!PHP
Nic oryginalnego, właśnie świętuje mój pierwszy post tutaj.
Wejście
Wynik
źródło
Scala:
args(0).toInt to args(1).toInt count (_.toString contains args(2))
źródło
Rubin
To świetny przykład zastosowania redukcji!
Wejście:
Wynik:
źródło
Python golf - 61
Python non-golf
źródło
Java8
Korzystając z nowych rzeczy IntStream, staje się to zasadniczo jedna linijka, jeśli zignorujesz obowiązkowe rzeczy Java Framework:
Można go uruchomić tutaj , chociaż musiałem zakodować wartości.
źródło
FA#
To rozwiązanie używa
IndexOf
do przeszukiwania ciągu, a następnie odrobiny szarpania liczb, aby przekonwertować wynik na 1, jeśli znaleziono, i 0, jeśli nie znaleziono, a następnie sumuje wynik:I można to nazwać tak:
źródło
Wyrażenie regularne
Poniższe policzą cyfry 1 do 49.
źródło
R 23
2527znakiPo prostu wybierz odpowiednie narzędzie do pracy. Proste użycie grep w R, nic szczególnego.
Oto, co robi:
grep
wszystkie wystąpienia2
w wektorze0
do10e6
i policz liczbę wyników za pomocąlength
.length(grep(2,0:100000,value=TRUE))
Wynik:
[1] 468559
Z trasy można napisać funkcję, która przyjmuje liczby jako dane wejściowe, tak jak pokazano w przykładzie.
Teraz możesz wywoływać
count
za pomocą x, y i z, jeśli nie jest ustawione (to jest domyślnie), wartości dla x, y i z wynoszą odpowiednio 0, 1000000 i 2. Kilka przykładów:lub
lub
Niektórzy uważają, że czas ma znaczenie, użycie tej funkcji w R zajmuje około 1 sekundy.
źródło
JavaScript (ES6), 63
Stosowanie:
Bez golfa:
źródło
Rubin
Zasadniczo wziąłem odpowiedź Pabla i częściowo zagrałem w golfa (38 znaków, jeśli upuścisz niepotrzebne białe znaki), co jest niezbyt dobrym przykładem użycia
select
.Wybiera każdy indeks w zakresie,
(x .. y)
który zawieraz
. Ten wynik pośredni jest niestety przechowywany w tablicy, której rozmiar jest następnie zwracany.Wygląda całkiem nieźle zarówno pod względem składniowym, jak i semantycznym, chociaż ta
i[z]
część nie wydaje się mieć sensu.Działa, ponieważ
x
iy
tak naprawdę są łańcuchami, a nie liczbami! Tak więc każdyi
jest również łańcuchem ii[z]
oczywiście sprawdza, czy łańcuchz
jest zawarty wi
.źródło
Python 2.7, 70 znaków
Krótszy, 65 znaków
źródło
range(0,y+1)
jeślirange(y+1)
robi to samo. Możesz też usunąć większość tychKorzystanie z Ruby
Enumerable#grep
:źródło
T-SQL
Jeśli mogę założyć, zmienne
@X
,@Y
i@Z
są dostępne:Z (dowolnie dużą;) istniejącą tabelą liczb - 65
Z rekurencyjnym CTE - 127
Jeśli zmienne należy zdefiniować jawnie:
Dodaj 58 do obu odpowiedzi - Tabela liczb: 123, Rekurencyjna CTE: 185
Nie mam pojęcia, ile pamięci może zużywać rekurencyjne CTE, ale z pewnością nie wygra żadnych konkursów prędkości. Przykład wyszukiwania 2 w 0 do 1000000 zajmuje 8 sekund w moim systemie.
Oto SQL Fiddle, jeśli ktoś chce się nim bawić. Uruchomienie zapytania 1000000 trwa ponad 30 sekund.
źródło
Rebol
Przykład użycia w konsoli Rebol (REPL):
źródło
PowerShell
Dwa rozwiązania, oba
4037 znaków.Dla wszystkich wersji PowerShell:
PowerShell V3 i nowsze mają
sls
alias dlaSelect-String
. Wymaga@
to wymuszenia tablicy, jeśli tylko jedna wartość przejdzie przez potok.źródło
Partia
Trochę bardziej czytelny -
Ładne i proste. Używa manipulacji ciągiem, aby sprawdzić, czy zmienna
!b!
jest taka sama jak sama bez danych wejściowych trzeciego użytkownika,%3
(!b:%3=!
).źródło
Matematyka
Pierwszy sposób: ciągi znaków
x, y, z
są konwertowane na ciągi. Jeśli ciąg liczb całkowitych nie jest wolnyz
, jest liczony.Przykłady
Drugi sposób: listy cyfr
Przykłady
źródło
GolfScript
Próbowałem poprawić swoje umiejętności gry w golfa, więc pomyślałem, że spróbuję tego z tym pytaniem. Oto, co wymyśliłem:
Można to podzielić w następujący sposób:
Mimo że jest to GolfScript, celem było raczej uczynienie go stosunkowo wydajnym, a nie kompaktowym, więc jestem pewien, że ktoś może wskazać różne sposoby jego poprawy.
Demonstracja : Zauważ, że zmniejszyłem Y w wersji demo, aby mogła zakończyć się w <5 sekund.
źródło
PHP - 112
Brak widocznych pętli, ale trochę obciążająca pamięć!
Stosowanie
php script.php 0 1000000 2
źródło
ECMAScript od 3 do 6
(javascript, JScript itp.)za pomocą wyrażenia regularnego:
awaria:
using indexOf:
awaria:
to ciało funkcyjne jest o jeden znak mniejsze niż florenta, więc przy użyciu
=>
notacji funkcji ES6 suma wyniesie 62 znakiPrzykładowe wywołanie:
f(0,1e6,2)
Przykład użycia:
alert( f(0,1e6,2) );
JSFiddle tutaj
PS: obie powyższe funkcje zwracają zmienną lokalną
r
.Dlatego przeciekając zmienną wynikową
r
do zasięgu globalnego, można ponownie zapisać 10 znaków:Przykładowe zastosowanie:
alert( f(0,1e6,2)||r );
źródło
Delfy - 120
Trochę za dużo jak na mój gust, sprawdzę, czy uda mi się trochę oderwać.
źródło
Python 2.7 - 50 znaków
Trochę oszczędności na istniejących odpowiedziach w języku Python.
Korzystanie z następujących sztuczek:
z+x
inn
”W akcji:
źródło
k [28 znaków]
Stosowanie
źródło
$:[z]
ją($z)
.