Całkiem proste wyzwanie dzisiaj:
Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą N i wypisuje lub zwraca posortowaną listę unikatowych liczb, które pojawiają się w tablicy mnożenia, której mnożniki wierszy i kolumn mieszczą się w zakresie od 1 do N włącznie.
Lista może być sortowana w kolejności rosnącej (od najmniejszej do największej) lub malejącej (od największej do najmniejszej) i może być wyprowadzana w dowolnym rozsądnym formacie.
Najkrótszy kod w bajtach wygrywa!
Przykład
Gdy N = 4, tabliczka mnożenia wygląda następująco:
1 2 3 4
-----------
1| 1 2 3 4
|
2| 2 4 6 8
|
3| 3 6 9 12
|
4| 4 8 12 16
Unikalne liczby w tabeli to 1, 2, 3, 4, 6, 8, 9, 12, 16
. Te są już posortowane, więc
1, 2, 3, 4, 6, 8, 9, 12, 16
może być dokładnym wynikiem dla N = 4. Ale ponieważ sortowanie można odwrócić i istnieje pewna swoboda w formatowaniu, będą to również prawidłowe dane wyjściowe:
[16,12,9,8,6,4,3,2,1]
1
2
3
4
6
8
9
12
16
16 12 9 8 4 3 2 1
Przypadki testowe
N=1 -> [1]
N=2 -> [1, 2, 4]
N=3 -> [1, 2, 3, 4, 6, 9]
N=4 -> [1, 2, 3, 4, 6, 8, 9, 12, 16]
N=5 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 20, 25]
N=6 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 36]
N=7 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49]
N=8 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 32, 35, 36, 40, 42, 48, 49, 56, 64]
N=9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81]
N=10 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100]
N=11 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 88, 90, 99, 100, 110, 121]
N=12 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 84, 88, 90, 96, 99, 100, 108, 110, 120, 121, 132, 144]
źródło
Odpowiedzi:
Pyth, 8 bajtów
Wypróbuj online.
Objaśnienie:
SQ
przyjmuje obliczoną listę input (Q
) i tworzy listę[1, 2, ..., Q]
.^SQ2
zabiera ze sobą kartezjański produkt z tej listy - wszystkie możliwe kombinacje produktów.*M
mnoży wszystkie te pary razem, tworząc wszystkie możliwe wyniki w tablicy mnożenia iS{
czyni ją wyjątkową i sortuje ją.źródło
M
. +1Python 2,
6151 bajtówDzięki xnor za skrócenie składni.
źródło
set(...)
Może być tylko zbiorem poglądowy{...}
. Również funkcje są tutaj domyślnie dozwolone, więc możesz po prostu pisaćlambda n:...
.f=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1)))
.APL,
1816 bajtówJest to nienazwana funkcja monadyczna. Dane wyjściowe są w porządku rosnącym.
Wyjaśnienie:
Naprawiono problem i zapisano 2 bajty dzięki Thomasowi Kwa!
źródło
CJam,
1412 bajtówNajnowsza wersja z ulepszeniami zaproponowanymi przez @aditsu:
To anonimowa funkcja. Wypróbuj online , z kodem wejściowym / wyjściowym potrzebnym do przetestowania.
@Martin zaproponował inne bardzo eleganckie rozwiązanie (
{,:)_ff*:|$}
) o tej samej długości. Użyłem tego od aditsu, ponieważ był znacznie bardziej podobny do mojego oryginalnego rozwiązania.Główną różnicą w stosunku do mojego oryginalnego rozwiązania jest to, że utrzymuje to
0
wartość w oryginalnej sekwencji, co oszczędza 2 bajty na początku. Można by pomyśleć, że to nie pomoże, ponieważ trzeba usunąć0
wartość z wyniku. Ale sednem idei @ aditsu jest0^
koniec, co stanowi pewną różnicę0
. To usuwa0
, a jednocześnie, ponieważ jest to operacja zestawu, eliminuje duplikaty elementów z zestawu rozwiązań. Ponieważ już wcześniej potrzebowałem 2 bajtów, aby wyeliminować duplikaty, usunięcie0
jest w zasadzie darmowe.Wyjaśnienie:
źródło
{2m*::)::*_&$}
,{)2m*::*_&$0-}
{,:)_ff*:|$}
{)2m*::*0^$}
Oktawa, 22 bajty
źródło
Julia, 24 bajty
Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę liczb całkowitych.
Nie golfowany:
źródło
MATLAB, 24 bajty
źródło
zsh,
8656 bajtówdzięki @Dennis za zapisanie 30 (!) bajtów
Wyjaśnienie / niepoznany:
To nie działa w Bash, ponieważ Bash nie rozwija się
{1..$1}
- po prostu interpretuje to dosłownie (więca=5; echo {1..$a}
wypisuje{1..5}
zamiast1 2 3 4 5
).źródło
Rubinowy,
5048 bajtówNie golfowany:
Użycie pętli zagnieżdżonej do pomnożenia każdej liczby z każdą inną liczbą do n, a następnie posortowanie tablicy.
50 bajtów
Stosowanie:
źródło
R, 39 bajtów
Odczytuje liczbę całkowitą ze STDIN i zapisuje listę rozdzielaną spacjami do STDOUT.
Tworzymy tabliczkę mnożenia jako macierz za pomocą
outer
, domyślnie spłaszczamy do wektora i sortujemy za pomocąsort
, wybieramy unikatowe elementy za pomocąunique
i drukujemy przestrzeń ograniczoną za pomocącat
.źródło
Mathematica, 25 bajtów
źródło
K, 17 bajtów
Nie ma tu wiele do powiedzenia. Sortuj (
t@<t:
) unikalne elementy (?
) spłaszczonego (,/
) pomnożonego kartezjańskiego produktu własnego (t*\:t:
) od 1 do N włącznie (włącznie1+!
).W akcji:
źródło
Haskell,
5554 bajtówPrzykład użycia:
f 4
->[1,2,3,4,6,8,9,12,16]
.nub
usuwa zduplikowane elementy z listy.Edycja: @Zgarb znalazł zbędne
$
.źródło
J,
2120 bajtówDzięki @Zgarb za -1 bajt!
Moja pierwsza odpowiedź J! Wskazówki dotyczące gry w golfa są mile widziane, jeśli jest coś do gry w golfa.
To jest funkcja monadyczna; bierzemy zewnętrzny produkt przez pomnożenie listy
1..input
z samym sobą, spłaszczamy, bierzemy unikalne elementy i sortujemy.źródło
Kotlin, 70 bajtów
Wersja bez golfa:
Przetestuj za pomocą:
źródło
Shell + wspólne narzędzia, 41
Lub alternatywnie:
Bash + coreutils, 48
Konstruuje rozwinięcie nawiasu wewnątrz rozszerzenia arytmetycznego:
\$[{1..n}*{1..n}]
rozwija się do rozszerzeń arytmetycznych,$[1*1] $[1*2] ... $[1*n] ... $[n*n]
które są oceniane i przekazywaneprintf
, które drukuje jeden na linię, do której jest przesyłany potokowosort
.Ostrożne korzystanie z cytatów, ucieczek i
eval
zapewnienie, że rozszerzenia pojawią się w wymaganej kolejności.Lub alternatywnie:
Pure Bash, 60
źródło
Pyth, 10
Wypróbuj online lub uruchom pakiet testowy
źródło
Minkolang 0,14 ,
252218 bajtówPamiętałem, że bardzo wygodnie wdrożyłem produkty kartezjańskie przed opublikowaniem tego pytania !
Wypróbuj tutaj. (Wyjścia w odwrotnej kolejności.)
Wyjaśnienie
źródło
JavaScript (ES6),
9290 bajtówWyjaśnienie
Test
źródło
Perl 6 , 27 bajtów
Przykładowe użycie:
źródło
Haskell, 51 bajtów
Strasznie nudne. Tylko filtruje listę
[1..n*n]
do elementów postacia*b
za
ib
w[1..n]
. Używaniefilter
daje tę samą długośćPrzez jakiś czas próbowałem wygenerować listę produktów z czymś bardziej sprytnym, takim jak
concatMap
lubmapM
, ale uzyskałem tylko dłuższe wyniki. Bardziej wyrafinowana kontrola członkostwa pojawiła się przy 52 bajtach, 1 bajt dłużej, ale być może można ją skrócić.źródło
(*)<$>..<*>..
jak tenJAVA - 86 bajtów
Bez golfa
źródło
Pyth, 11 bajtów
Jest to podobne do odpowiedzi Julii. Dzięki @Maltysen
źródło
PHP,
74,7370 bajtówNie golfowany:
Poprzedni:
while(($j=$i++)<$n)for(;$j++<$n;)$a[]=$i*$j;$a=array_unique($a);sort($a);
Nie 100% pewności, co zrobić
$a
z danymi wyjściowymi, ale zawiera tablicę z odpowiednimi liczbami.$n
to numer, za pomocą którego$_GET['n']
,register_globals=1
źródło
TeaScript ,
3735 znaków; 40 bajtówZaoszczędzono 2 bajty dzięki @Downgoat
TeaScript to JavaScript do gry w golfa.
Wypróbuj online!
Bez golfa i wyjaśnienia
źródło
r
zamiastA.r
do generowania zakresówC, 96 bajtów
Spowoduje to wydrukowanie liczb w kolejności malejącej. Sugestie są mile widziane, ponieważ wydaje się to dalekie od optymalnych.
źródło
JavaScript (ES6), 86 bajtów
Chcesz go skrócić (może spróbujesz zagnieżdżać pętle).
źródło
Perl 5, 91 bajtów
do uruchomienia przez przekazanie argumentu w wierszu poleceń. Brakuje wielu deklaracji z ograniczeniami i ostrzeżeniami.
źródło
Python,
124102 bajtówWięcej pythonowych!
źródło
l.append(i*j)
w tej samej linii co warunek warunkowy. Myślę, że ostatecznie ma to 102 bajty.+=
zamiastappend
.list(set(l))
nie ma gwarancji, że zostanie rozwiązana.Perl 5, 67 bajtów
źródło