Wygeneruj siatkę 7 na 7, wypełnioną liczbami losowymi. Jednak w komórkach z nieparzystym numerem wiersza i kolumny (zaczynającym się od 0) należy użyć sumy otaczających komórek. Oto mały przykład z siatką 3 na 3 (pogrubiona kwadratowo):
2 2 2
2 16 2
2 2 2
A oto przykład siatki 7 na 7:
6 5 4 3 7 2 5
6 43 3 50 8 43 8
4 7 8 8 9 3 1
4 36 1 43 6 40 5
3 3 6 1 4 7 5
4 35 3 45 9 42 1
2 6 8 6 8 5 3
Zasady
Liczby, które nie są sumami, muszą zawsze zawierać się między 1 a 9 włącznie.
Siatka musi być generowana losowo. Dla każdej sumy każda cyfra musi mieć równe szanse pojawienia się, niezależnie od tego, w której komórce się znajduje.
Liczby muszą być wyrównane. Oznacza to, że pierwsza lub ostatnia cyfra każdej liczby w kolumnie musi być ustawiona pionowo. (Możesz założyć, że środkowe liczby będą zawsze składały się z dwóch cyfr).
Otaczające komórki obejmują przekątne. Dlatego każdy kwadrat sumy będzie miał osiem liczb, które należy dodać.
Wygrywa najkrótszy kod, ponieważ jest to golf golfowy .
źródło
Odpowiedzi:
APL,
53 49 43 42 40 3936Udało mi się powielić J
;.
w APL i wykorzystałem podejście Garetha , oszczędzając 13 znaków.Przykładowy przebieg:
Wyjaśnienie:
∘.∨⍨9⍴0 1
generuje trochę maski.×∘?∘9¨
mnoży każdy bit przez losową wartość od 1 do 9 włącznie, generując zamaskowaną siatkę liczb losowych.3,⌿3,/
używa czegoś, co można określić tylko jako hackery, aby zwrócić wszystkie nakładające się pola 3 na 3 w zamaskowanej tablicy. Są one również spłaszczane w procesie.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
iteruje tablicę, przypisując każdy element do⍵
. Dla każdej iteracji zajmuje piąte (środkowe, pamiętając, że indeksowanie APL jest oparte na 1) i zwraca swój znak. W takim przypadku jest to równoważne z testowaniem, czy liczba jest większa niż 0. Jeśli to zwraca 1 (dla wartości true), zwróć ten element. W przeciwnym razie zwróć sumę elementów w spłaszczonym polu 3 na 3. Wykorzystuje:⋄
operator trójskładnikowy, który jest odpowiednikiem?:
wielu języków.źródło
J,
63615955525149473937 znakówDzięki Zmienności za uratowanie 10 postaci.
Objaśnienie (każdy krok będzie miał różne liczby losowe ...):
Wygeneruj maskę do generowania liczb losowych (używa
$
:Teraz mamy haczyk . To jest właściwie szczęśliwy wypadek, kiedy traciłem wcześniejszą wersję. Miał być transponowany
|:
i OR+.
z oryginałem. To miało sens, ponieważ używałem wówczas zer i jedynek, ale teraz mam dziewiątki i zera. Tak się składa, że działa w ten sam sposób, co GCD+.
. Szczęśliwie dla mnie. :-)Teraz, kiedy mamy siatkę 9 i 0, chcemy wygenerować losowe liczby.
?
generuje liczbę losową od 0 do (ale nie wliczając) podanej liczby. Dana lista wygeneruje w ten sposób jedną liczbę losową dla każdego członka listy. Tak więc w tym przypadku wygeneruje liczbę od 0 do 8 dla każdego 9 w tabeli i liczbę zmiennoprzecinkową od 0 do 1 dla każdego 0.Ale chcemy liczb od 1 do 9, a nie od 0 do 8. Więc dodajemy 1.
To bardzo miłe, ale straciliśmy zera, które chcę, więc pomnożymy je przez oryginalną maskę po przekształceniu wszystkich dziewiątek w jedynki. Robię to poprzez sprawdzenie, czy wartość jest większa niż 1. To daje nam:
(1&<*1+?)
.Tutaj dzieje się kilka rzeczy:
&
) 1 z<
czasownikiem.Tak więc wszystko razem
(1&<*1+?)
generuje liczby losowe i zeruje wszystkie liczby, które były generowane przez zera w oryginalnej siatce.Następny kawałek to (moim zdaniem zresztą :-) sprytny kawałek.
Cut
;.
czasownik ma formę,x u;._3 y
która tnie dane wejściowe na pola opisane przezx
, a następnie stosujeu
do nich czasownik . W tym przypadku mamy3 3(4&{++/*0=4&{)@,;._3
.3 3
Opisuje pola, które chcemy - 3x3.(4&{++/*0=4&{)@,
Jest pociąg czasownik, który opisuje to, co chcemy zrobić, aby każdym polu.Aby zademonstrować
;.
czasownik, użyję<
do wyświetlenia każdego pola:Niektóre rzeczy do zauważenia:
0
na środku pole.Teraz musimy albo przekazać wartość na środku z powrotem (jeśli jest niezerowa), albo zsumować liczby w polu 3x3 (jeśli środek jest zerowy).
Aby to zrobić, potrzebujemy łatwego dostępu do centralnego numeru.
,
pomaga tutaj. Okazuje siatkę 3x3 do listy 9 pozycji z numerem centrum pod numerem 4.4&{
użyje{
wyciągnąć wartość środkową, a następnie porównać je z 0:0=4&{
. Zwraca0
lub1
za prawdziwe lub fałszywe, które następnie pomnożyć przez sumę+/
. Jeśli w centrum było zero, mamy teraz wymaganą sumę. Jeśli tak nie było, mamy zero, więc na zakończenie dodajemy wartość środkową4&{+
.To daje czasownikowi pociąg
(4&{++/*0=4&{)@,
źródło
?
. Zmienię wyjaśnienie, aby odzwierciedlić najnowszą wersję.Ruby (135 znaków)
Próbka wyjściowa
Awaria
To nie jest zbyt oczywiste, jak to działa, więc oto szybki podział. UWAGA: Prawdopodobnie możesz pominąć niektóre z tych kroków i szybciej przejść do krótszych wersji, ale myślę, że jest to wystarczająco edukacyjne, aby zobaczyć różne sposoby golenia znaków, szczególnie poprzez wykrywanie wzorców w literałach, aby zamieniać 2-cyfrowe liczby na 1-cyfrowe wersje .
Wersja naiwna
W przeciwieństwie do innych rozwiązań Ruby, które opierają się na dwuwymiarowej tablicy, możesz (ostatecznie) uzyskać krótszą wersję, zaczynając od tablicy jednowymiarowej i pracując z wartościami przesunięcia, ponieważ wzorce się powtarzają.
Kluczową zasadą jest to, że pracujemy na pozycjach indeksu 8, 10, 12, po prostu przesuniętych o wielokrotności 14. Pozycje 8, 10 i 12 są środkami sumowanych siatek 3x3. Na wyjściu próbki 34 to pozycja 8, 42 to pozycja 8 + 14 * 1 itd. Zastępujemy pozycję 8 34 pozycjami przesuniętymi od pozycji 8 o
[-8,-7,-6,-1,1,6,7,8]
- innymi słowy34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Ta sama zasada obowiązuje dla wszystkich wartości[8 + 14*i, 10 + 14*i, 12 + 14*i]
, ponieważ wzorzec się powtarza.Optymalizacja
Po pierwsze, kilka szybkich optymalizacji:
3.times { ... }
obliczaćj + 14*i
” pozycje[8,10,12,22,24,26,36,38,40]
.offsets
Tablica jest użyta tylko raz, aby zastąpić zmienną dosłownym.do ... end
się{...}
i przełączyć okolice drukowanie$> << foo
. (Jest tu sztuczka z udziałemputs nil
i() == nil
.)Kod po tym ma 177 znaków:
Przy następnej redukcji zwróć uwagę, że
inject
tablica przesunięć nie musi być w porządku. Możemy mieć[-8,-7,-6,-1,1,6,7,8]
albo inne zamówienie, ponieważ dodawanie jest przemienne.Więc najpierw połącz pozytywne i negatywne
[1,-1,6,-6,7,-7,8,-8]
.Teraz możesz skrócić
do
To skutkuje
który ma 176 znaków.
Przesuń o 8 i przejdź do różnic
Dwuznakowe wartości literalne wydają się być możliwe do skrócenia, więc weź
[8,10,12,22,24,26,36,38,40]
i przenieś wszystko w dół8
, aktualizującj
na początku pętli. (Należy pamiętać, że+=8
unika się konieczności aktualizacji wartości przesunięcia1,6,7,8
.)Jest to 179, co jest większe, ale
j+=8
faktycznie można je usunąć.Pierwsza zmiana
do szeregu różnic:
i kumulatywnie dodaj te wartości do wartości początkowej
j=8
. To ostatecznie obejmie te same wartości. (Prawdopodobnie moglibyśmy przejść bezpośrednio do tego, zamiast przejść najpierw o 8).Zauważ, że dodamy również wartość fikcyjną
9999
na końcu tablicy różnic i dodamyj
na końcu , a nie na początku pętli. Uzasadnieniem jest to,2,2,10,2,2,10,2,2
że okropnie zbliża się do bycia tymi samymi 3 liczbami powtarzanymi 3 razy, a obliczającj+difference
na końcu pętli, ostateczna wartość9999
nie wpłynie na wynik, ponieważ nie maa[j]
wywołania, w którymj
jest jakaś wartość ponad10000
.Z tą tablicą różnic
j+=8
jest teraz po prostuj=8
oczywiście, ponieważ w przeciwnym razie wielokrotnie dodawaliśmy8
zbyt wiele. Zmieniliśmy również zmienną blokową zj
nal
.Ponieważ
9999
element nie ma wpływu na wynik, możemy go zmienić10
i skrócić tablicę.To jest 170 znaków.
Ale teraz
j=8
wygląda to trochę niezgrabnie i możesz uratować 2 postacie, przesuwając w[2,2,10]
dół o 2, aby wygodnie uzyskać postać,8
której możesz użyć do przypisania. To też musij+=l
się staćj+=l+2
.To jest 169 znaków. Okrągły sposób wyciskania 7 znaków, ale jest fajny.
Ostatnie poprawki
values_at
Połączenie jest rzeczywiście rodzaju zbędne i możemy inline takieArray#[]
połączenie. Więcstaje się
Możesz również zauważyć, że
flat_map
+j+e/j-e
+inject
można zredukować do bardziej bezpośredniego sumowania z inicjałem0
w tablicy.To daje ci 152 znaki:
Wreszcie:
map.with_index
może zostaćeach_slice
.135 :
źródło
each
zmap
jednej bajt.Python, 132
To technicznie nie spełnia zasad, ponieważ ostatnie cyfry każdego numeru są wyrównane, a nie pierwsze. Ale pomyślałem, że i tak podzielę się:
Przykładowe dane wyjściowe:
źródło
Mathematica, 108
Dla ładniejszego wyjścia
Column/@
można go zastąpićTableForm@
kosztem 2 znaków.źródło
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
daje czystszy wynik i zapisuje kilka znaków, jeśli liczysz Transpozycja jako pojedynczy znak, który jest w Mathmatica. Btw, szablon OneLinerSubmission Wolfram liczy 106 znaków, 105 z transpozycją jednego znaku.:>
jest jednym symbolem, chociaż znajduje się w obszarze prywatnego użytku Unicode. Można nawet usunąć transpozycję, ponieważ zasada sumowania ważności obowiązuje nawet po transpozycji. Ale wydaje się,Grid
że nie wyrównuje wpisów bez dalszych opcji (v8)Grid
wyśrodkowuje liczby w kolumnach. Technicznie nie spełniłoby to wyzwania, ale wygląda lepiej niż wyświetlenie listy w wyświetlanej tabeli.Part
iTuples
. Publikowanie wkrótce.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 znaków)Uwaga: Zawiera dosłowną zakładkę, którą Markdown może złamać.
Sprytny kawałek należy do Garetha: zobacz jego rozwiązanie J.
Demo online
źródło
R: 114 znaków
W pierwszym wierszu utwórz tablicę 7 na 7 wypełnioną losowo wybranymi liczbami od 1 do 9 (równomierny rozkład z zastępowaniem, stąd
r=T
skrótreplace=TRUE
). Drugi wiersz, oblicz sumy 3 na 3 siatki, odejmij środek i zastąp go wynikiem. Trzeci wiersz wypisuje wynikową siatkę (domyślnie kolumny macierzy i macierzy są wyrównane do prawej).Przykładowe dane wyjściowe:
źródło
J,
6765 bajtówNaiwne i pełne odpowiedzi rozwiązanie w J. To prosta realizacja zadania.
Najpierw tworzę tablicę liczb całkowitych 7 x 7 między 1 a 9. W rzeczywistości J? czasownik generuje liczby aż do argumentu, dlatego musimy zwiększać każdy element,>: w J
Przygotowuję maskę do zerowania komórek nieparzystych wierszy / kolumn, pary indeksów nieparzystych wierszy / kolumn:
Czasownik z katalogu {łączy elementy z atomów znajdujących się na liście w ramkach
aby utworzyć katalog, tabelę 3x3 powyższych par
Następnie przygotowuję tabelę wskaźników wierszy / kolumn, które zostaną użyte do wyboru każdej z podtablic 3x3.
Dla każdej pary w macierzy m tworzę parę trojaczków, wyśrodkowanych wokół każdej liczby m pary:
Te pary trojaczków są używane przez czasownik J From {, który może zaznaczyć wiele wierszy i kolumn jednocześnie. 0 1 2/2 3 4 oznacza, że wybieram wiersze 0, 1 i 2 razem z kolumnami 2, 3 i 4, wybierając w ten sposób drugą podtablicę 3x3 u góry.
Na koniec mogę użyć tablicy 7x7 i masek do wykonania zadania: Najpierw używam m jako maski, aby ustawić odpowiednie elementy na 0:
Następnie biorę wszystkie pod-tablice 3x3 za pomocą s jako selektora i znajduję ich sumy:
Następnie ponownie umieszczam te liczby w tablicy początkowej.
Wypróbuj online!
źródło
APL (Dyalog Unicode) ,
323130 bajtów SBCS-1 bajt dzięki @jslip
Wypróbuj online!
źródło
∧/¨~
->⍱/¨
Ruby, 207
Najpierw przedstawię moje rozwiązanie (jak zawsze):
źródło
Ruby, 150 znaków
jeśli uzasadnienie lewego uzasadnienia jest właśnie takie, które
ljust
musiałoby zostać zastosowane ... no nie. Uwielbiam możliwości formatowania Ruby.Nie używać
Array.new(7){...}
.(0..6).map{...}
jest zarówno krótszy, jak i bardziej czytelny, a Ty możesz przypisać zakres za darmo.Linia nr 3 inspirowana rozwiązaniem Doorknob .
źródło
GolfScript, 87 znaków
Tam jest za dużo zamków ... (patrz online )
źródło
J, 58/64/67 znaków
Chociaż specyfikacja wymaga wyrównania liczb do lewej, nie ma wymogu używania zapisu dziesiętnego, więc myślę, że jest to poprawny wynik:
Jeśli dopuszczalne jest wyrównanie do prawej zamiast wyrównania do lewej, mamy 58 znaków
J
":
(format) ma trzy tryby formatowania:Najbardziej gadatliwym, ale także najbardziej wszechstronnym i jedynym, który jest w stanie wygenerować wynik, jak w przykładzie, jest
8!:2
formatowanie obce, które przyjmuje łańcuch formatujący jako lewy argument. Również 67 znaków :Oto format pudełkowy:
źródło
Perl, 117 znaków
Jest to jeden z tych skryptów Perla, w których wszystkie oprócz jednej pętli for zostały zwinięte w
map
wywołania, dzięki czemu wszystko można zrobić w jednym poleceniu. Zmienne globalne również pojawiają się w tym dokumencie. Myślę, że próbuję tu powiedzieć, że ten program jest trochę obrzydliwy.Czekaj, robi się coraz gorzej: w skrypcie jest znany błąd! Ma jednak mniej niż 1 na milion szansy na wyzwolenie, więc jeszcze nie udało mi się go naprawić.
źródło
Matematyka , 106/100
Zanim go zobaczyłem, wymyśliłem coś bardzo podobnego do kodu ssch. Pożyczam jego pomysł użycia
Column
. Tylko z ASCII, 106 :Ze znakami Unicode (używanymi przez ssch), 100 :
źródło
Excel VBA, 74 bajty
Natychmiastowa funkcja VBE, która wysyła do
[B2:H9]
.Przykładowe dane wyjściowe
źródło
PowerShell,
149148 bajtów-1 bajt dzięki @AdmBorkBork. To jest spoko!
Wyjaśnienie:
źródło
$a
zadanie w pareny i przesuwając następny wiersz w górę, aby utworzyć jedną dużą linię -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Oto dwa kroki. Miałem kilka prób kapsułkowania w jednej rurze. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
jest całkowicie wypełniona przed następnym przykład rurociągu. Powinien działać (przynajmniej dla mnie).Mathematica
142 151 172179Kod
Stosowanie
źródło
0
s; zasady mówią 1-9Julia 0,6 , 127 (89) bajtów
Wypróbuj online!
89 bajtów przy użyciu natywnego wyświetlania, co może być dopuszczalne, jeśli można wydrukować dodatkowe wiersze:
źródło
Java 10,
262260248239 bajtów-12 bajtów dzięki @ceilingcat .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
var
zamiastString
i+=Math.random()*9+1;
zamiast=(int)(Math.random()*9+1);
. To naprawdę przydatne, aby odwiedzić wszystkie moje stare odpowiedzi, haha! : D