Kredyt
Moje podziękowania dla listowego pytania Rand Al'Thora za inspirację do tego wyzwania golfowego.
tło
Charakter tego wyzwania opiera się na algorytmie wspomnianym przez Rand w jego „A Triangle Formed of Three Letters”:
- Zacznij od ciągu 10 liter, z których każda to X, Y lub Z.
- Pod każdym rzędem utwórz następny rząd w następujący sposób. Jeśli dwie sąsiednie litery są takie same, napisz pod nimi tę samą literę; jeśli się różnią, napisz pod nimi trzeci list.
Powtórzyłbyś wtedy poprzedni krok, aż będziesz miał jedną literę w dziesiątym rzędzie.
Wyzwanie
Zamierzamy obrócić matematycznie powyższy algorytm:
- Zacznijmy od sekwencji 10 cyfr, każda oddzielona spacją, z których każda ma 1, 2 lub 3.
- Pod każdym rzędem utwórz następny rząd w następujący sposób. Jeśli dwie sąsiednie cyfry są takie same, napisz pod nimi tę samą cyfrę; jeśli są różne, wpisz trzecią cyfrę pod nimi.
- Powtarzaj poprzedni krok, aż uzyskasz jeden końcowy numer.
Tak więc, postępując zgodnie z tym algorytmem, jeśli 1 2 3 3 1 3 1 3 1 2
na przykład zaczynasz od wiersza , generowany jest następujący trójkąt:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
Jestem również ciekawy, jaka jest suma wszystkich cyfr w trójkącie liczbowym, więc dodaj wszystkie te cyfry i umieść tę sumę w jedenastym rzędzie, z wyrównaniem do prawej do ostatniej cyfry w pierwszym rzędzie. Nasz trójkąt liczbowy będzie więc wyglądał następująco (spacje w moim przykładzie są reprezentowane poniżej przez .
znak, aby pokazać formatowanie).
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Twoim wyzwaniem jest napisanie kodu, który może zaczynać się od wprowadzonego ciągu / tablicy / etc. z dziesięciu cyfr, jak w moim przykładzie, a następnie zastosuj algorytm, aby wygenerować dziesięć wierszy, które utworzą trójkąt liczbowy, a następnie jedenasty wiersz, który wyświetli sumę wszystkich cyfr z wyrównaniem do prawej.
Testowanie
Testowanie tego ciągu można wykonać przy użyciu losowo wygenerowanego ciągu dziesięciu wybranych przez Ciebie cyfr lub wygenerowanego z fragmentu poniżej ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
Zasady
- Obowiązują zasady gry w golfa, więc najmniejsza liczba bajtów wygrywa wyzwanie. W przypadku dwóch zgłoszeń o tym samym niskim wyniku, zwycięzca zostanie nagrodzony na podstawie liczby głosów oddanych.
- To, czego właściwie oczekujemy, to 11 wierszy o długości 19 znaków ... Sposób renderowania ostatecznego wyniku zależy wyłącznie od Ciebie: macierz, konsola, wyjście pliku, STDOUT itp., Więc użyj dowolnej metody wyjściowej, która Ci się podoba pracuj na swoją korzyść. Jedyną regułą w wynikach jest to, że mamy 11 wierszy z 19 znakami w każdym wierszu w formacie podobnym do powyższego ...
- Jeśli to pomaga Twojemu kodowi, użyj dowolnego separatora cyfr ... Pamiętaj tylko, że czytelność może być czynnikiem przyczyniającym się.
- Żadnych głupich luk .
- Zakodowane na stałe wejście nie jest dozwolone. Celem tego kodu jest to, że można go używać do uzyskiwania różnych wyników za każdym razem przy różnych danych wejściowych.
1 1 1 1 1 1 1 1 1 1
Na przykład kodowanie całkowicie neguje cały sens algorytmu.
Zobacz, co wszyscy wymyślą!
Odpowiedzi:
05AB1E ,
3226 bajtówWyjaśnienie
Wypróbuj online!
źródło
Mathematica,
104979094 bajtówWyjaśnienie
Dzieli dane wejściowe na długość 2, offset 1 partycje.
Pobiera każdą partycję i oblicza odpowiednie dane wyjściowe.
W grę wchodzi sztuczka. Dodałem dwie liczby, wziąłem mod 3 i odjąłem ten wynik od 3. To daje pożądaną liczbę. (np. 3 - ((2 + 1) mod 3) = 3)
Powtarza powyższy proces dziewięć razy, podając wszystkie iteracje jako wynik.
Sformatuj każdą iterację w wierszach i umieść całą rzecz w jednej kolumnie (wyrównanie do środka), tworząc trójkąt.
Weź sumę wszystkich liczb.
Połącz trójkąt z sumą i wyrównaj do prawej całość (trójkąt jest już wyrównany, więc jego wyrównanie nie zostanie zmienione).
źródło
JavaScript (ES6),
143142 bajtyZapisano 1 bajt dzięki @Neil
Próbowałem łączyć różne części, ale skończyło się to 5 bajtami dłużej:
źródło
3-((x+y)%3)
pomóc w zmniejszeniu tego kodu?p^c||p
jest już nieco krótszy :-)i?p^(p=c)||p:c
czego możesz użyći&&p^(p=c)||c
?Rubin,
134101 bajtówKorzystanie z sztuczki modulo JHM.
Zobacz na eval.in: https://eval.in/649993
źródło
CJam ,
4440 bajtówWypróbuj online!
Wyjaśnienie
źródło
Python 2, 164 bajty
Stosunkowo proste iteracyjne rozwiązanie.
Wypróbuj online
źródło
PHP, 143 bajtów
źródło
JavaScript (ES6),
11210096 bajtówPobiera tablicę jako dane wejściowe i rekurencyjnie tworzy trójkąt oddzielony przecinkami.
źródło