Napisz pełny program lub funkcję, która przyjmuje dodatnią liczbę całkowitą N
jako dane wejściowe przez STDIN / wiersz poleceń / ARGV lub argumenty funkcji i wypisuje podwójny węzeł ASCII odpowiadający N
STDOUT.
Podwójny węzeł ASCII wygląda następująco:
__ __ __ __ __ __
/ \/ \/ \/ \/ \/ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\ \/\ \/\ \/\ \/\ \/\ \/
/\ \/\ \/\ \/\ \/\ \/\ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\__/\__/\__/\__/\__/\__/
Powyższe dotyczy N = 6
Oto jeszcze kilka podwójnych węzłów dla innych wartości N
:
Jeśli N = 1
wyjściowy podwójny węzeł wygląda następująco:
__
/ \
| /\ |
| \/ |
\ \/
/\ \
| /\ |
| \/ |
\__/
Bo to N = 2
jest
__ __
/ \/ \
| /\/ /\ |
| \/ /\/ |
\ \/\ \/
/\ \/\ \
| /\/ /\ |
| \/ /\/ |
\__/\__/
Bo to N = 3
jest
__ __ __
/ \/ \/ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\ \/\ \/\ \/
/\ \/\ \/\ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\__/\__/\__/
i podobnie, wzorzec trwa i każda większa wartość N
.
Szczegóły :
- Dane wejściowe są zawsze dodatnimi liczbami całkowitymi większymi niż
0
.
- Końcowy znak nowej linii jest opcjonalny
- W każdej linii nie powinno być ani spacji końcowych, ani wystarczającej liczby spacji końcowych, aby długość każdego wiersza wynosiła
4*N + 2
.
- Nigdy nie powinno być żadnej wiodącej przestrzeni, która nie jest częścią określonego wzorca.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Seria liderów
Przekształcam to w serię wyzwań artystycznych ASCII, dodając w ten sposób tabelę liderów serii (fragment autorstwa Martina). Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
# Language Name, N bytes
gdzie N jest rozmiarem Twojego zgłoszenia. Jeśli poprawisz swój wynik, możesz zachować stare wyniki w nagłówku, przekreślając je. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
/* Configuration */
var QUESTION_IDs = [50484, 50521, 50625, 51123, 51222]; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!.FjwQBrX2KXuFkv6p2lChi_RjzM19";
/* App */
var answers = [], page = 1, currentQ = -1;
function answersUrl(index) {
return "http://api.stackexchange.com/2.2/questions/" + QUESTION_IDs.join(";") + "/answers?page=" + index + "&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 (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>((?!>).)*<\/s>|((?!>).)+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^\n,]+)(?=,)/;//
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
if (!pass) console.log(a);
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function getAuthorId(a) {
return a.owner.user_id;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var users = {};
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
var question = QUESTION_IDs.indexOf(a.question_id);
var size = parseInt((headline.match(SIZE_REG)||[0])[0]);
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
var userId = getAuthorId(a);
if (!users[userId]) users[userId] = {name: user, nAnswer: 0, answers: []};
if (!users[userId].answers[question]) {
users[userId].answers[question] = {size: Infinity};
users[userId].nAnswer++;
}
if (users[userId].answers[question].size > size) {
users[userId].answers[question] = {size: size, link: a.share_link}
}
});
var sortedUsers = [];
for (var userId in users)
if (users.hasOwnProperty(userId)) {
var user = users[userId];
user.score = 0;
user.completedAll = true;
for (var i = 0; i < QUESTION_IDs.length; ++i) {
if (user.answers[i])
user.score += user.answers[i].size;
else
user.completedAll = false;
}
sortedUsers.push(user);
}
sortedUsers.sort(function (a, b) {
if (a.nAnswer > b.nAnswer) return -1;
if (b.nAnswer > a.nAnswer) return 1;
return a.score - b.score;
});
var place = 1;
for (var i = 0; i < sortedUsers.length; ++i) {
var user = sortedUsers[i];
var row = '<tr><td>'+ place++ +'.</td><td>'+user.name+'</td>';
for (var j = 0; j < QUESTION_IDs.length; ++j) {
var answer = user.answers[j];
if (answer)
row += '<td><a href="'+answer.link+'">'+answer.size+'</a></td>';
else
row += '<td class="missing"></td>';
}
row += '<td></td>';
if (user.completedAll)
row += '<td class="total">'+user.score+'</td>';
else
row += '<td class="total missing">'+user.score+'</td>';
row += '</tr>';
$("#users").append(row);
}
}
body { text-align: left !important}
#leaderboard {
width: 500px;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
td.total {
font-weight: bold;
text-align: right;
}
td.missing {
background: #bbbbbb;
}
<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="leaderboard">
<h2>Leaderboard</h2>
<p>
Missing scores are shown as grey cells. A grey total indicates that the user has not participated in all challenges and is not eligible for the overall victory yet.
</p>
<table class="_user-list">
<thead>
<tr><td></td><td>User</td>
<td><a href="https://codegolf.stackexchange.com/q/50484/31414">#1</a></td>
<td><a href="https://codegolf.stackexchange.com/q/50521/31414">#2</a></td>
<td><a href="https://codegolf.stackexchange.com/q/50625/31414">#3</a></td>
<td><a href="https://codegolf.stackexchange.com/q/51123/31414">#4</a></td>
<td><a href="https://codegolf.stackexchange.com/q/51222/31414">#5</a></td>
<td></td><td>Total</td>
</tr>
</thead>
<tbody id="users">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
Jak dotąd seria
1. Podwójny węzeł
2. Flow Snakes
3. Chińskie świątynie
4. Znaki zodiaku
5. Losowe diamentowe tilings
Odpowiedzi:
CJam, 55 bajtów
Bardzo mnie to poraziło nerda ... w końcu wymyśliłem 55 bajtów ISO 8859-1:
lub ta alternatywa :
Początkowo próbowałem to zrobić jako zwykły ASCII, ale sprowadziłem go tylko do 58 bajtów :
i znowu alternatywa :
Wyjaśnienie:
Chodzi o to, aby zakodować unikalne części (lewą krawędź, prawą krawędź i wzór środkowy) w wygodny sposób, powtórzyć środkową część w razie potrzeby i złożyć je razem. Kod okazał się pod wieloma względami podobny do odpowiedzi Dennisa; Nie próbowałem go skopiować, ale wypróbowałem wiele różnych podejść (w tym wykorzystując więcej symetrii i powtórzeń) i to właśnie działało najlepiej.
Łączę lewą i prawą krawędź w następujący sposób:
Środkowy wzór ma 4 kolumny, ale są one powtarzane N-0,5 razy, tj. Jedno powtórzenie jest przecinane na pół. Dla wygody użyłem tego wzoru:
i usunąłem pierwszą połowę pierwszego powtórzenia.
Więc dołączyłem do części i zakodowałem je w formie transponowanej, ponieważ łatwiej jest z nimi pracować w ten sposób. Pierwszy i trzeci program kodują ten ciąg:
(bez nowych linii), czyli transpozycja środkowych + krawędzi. Drugi i czwarty program („alternatywy”) kodują ten ciąg:
znowu, bez nowych linii, a to jest transpozycja krawędzi + środek.
Oto jak działa ta wspólna część kodu:
Następnie implementacja różni się nieznacznie. W pierwszym i trzecim programie mamy:
W drugim i czwartym (alternatywnym) programie mamy:
źródło
1>W<
skrócić. Okazuje się, że musiałem tylko obrócić tablicę przed jej zakodowaniem i użyć2>
...CJam,
1039283696657 bajtówWypróbuj online w interpretatorze CJam .
Pomysł
Wzór staje się o wiele bardziej oczywisty, gdy transponujemy wiersze z kolumnami (wypełnione spacją po prawej stronie).
Na przykład dla danych wejściowych 3 daje to:
Pierwsze dwa i ostatnie dwa rzędy są wyjątkowe, ale pozostałe powtarzają ten sam wzór w kółko.
Zatem dla wejścia N wszystko, co musimy zrobić, to powtórzyć
N razy zamień pierwszy rząd na
ostatni wiersz z
i na koniec transponuj wiersze z kolumnami.
Kod
źródło
JavaScript ( wersja robocza ES7 ),
169163160158 bajtówEdycja: -6 za pomocą ciągu szablonu, aby wyeliminować pewne powtórzenia z ciągu wzoru.
Edycja: -3 przez zmianę z
slice(0,-2)
naslice(2)
przez zmianę kolejności łańcucha wzorca.Edycja: -2 przez zapętlenie
b
zamiasta
i zmniejszeniea
ciągu do 4 za pomocą modulo.Skomentowano:
źródło
.split(0)
się('__ 0 '+(r='\\/0/\\/ 0\\/ /0 ')+r+'0\\/ /0__/\\')
.0
go przekażesz, zobaczysz8
.``
i${...}
dokładnie robią?${}
jest oceniane jako wyrażenie javascript.Perl,
134129Pobiera parametr wiersza polecenia:
źródło
JavaScript ( ES6 ), 165
166Elementy węzłów:
Bez golfa
Grał w golfa
źródło
0
do niego, a dostaniesz czteronożnego pająka.C ++,
1530639479To wyglądało na zabawne wyzwanie, które nieco odbiegałem od briefu.
Nie jestem pewien, jak mierzyć bajty wielkości mojej aplikacji, ale spróbuję to rozgryźć i zaktualizować swoją odpowiedź.
Moja aplikacja może być mniejsza, ale zapętla się zarówno w x, jak i y, i trochę to lubię: D
źródło
Python 2,
156151147141139 139edycja 1: edytowane w celu użycia input () zamiast funkcji.
edycja 2: użyto str.join i dodano do var c, aby usunąć zbędne znaki.
edycja 3: usunięto niepotrzebne sekwencje specjalne ciągów znaków.
edycja 4: użyto ~ -n zamiast a = n-1
To była dobra zabawa w programowaniu, mój pierwszy golf w golfa!
zapisz go w zewnętrznym edytorze tekstu jako n.py, aby usunąć ostatni znak nowej linii, aby zmniejszyć rozmiar pliku o 1 bajt, uruchom moduł i wprowadź swój numer.
źródło
input ()
jest uważane za w porządku podczas czytania ze STDIN.a=n-1
oszczędziłeś na pisaniu*(n-1)
dwa razy, ale robisz*~-n
.Python 2,
139133129 bajtówTen po prostu buduje i drukuje linia po linii.
Oto kod w postaci bez golfa:
Edycja: Zmieniłem język na Python 2, aby był zgodny z moją odpowiedzią dla # 3 (i oszczędza również 6 dodatkowych bajtów)
źródło
w=(3*' ||')[i] -> w=' |'[i&2]
i' '+s[1:-1]+' ' -> ' %s '%s[1:-1]
pracuję (pierwszy to ciąg z dwiema spacjami, a potem rura, ale SE działa w górę)' ||'[i%4]
, ale jest to jeszcze krótsze (także z dwoma spacjami).C, 159 bajtów
Z białymi znakami i kilkoma innymi ulepszeniami w zakresie czytelności:
Jest to przede wszystkim oparte na szablonie. Szablon
t
zawiera wszystkie 9 możliwych kolumn wyniku, co oznacza, że koduje 9 * 9 = 81 znaków lub 80 bez końcowego znaku nowej linii.Ponieważ we wzorze jest tylko 6 różnych znaków (w tym znaki nowego wiersza), spakowałem je w jeden znak szablonu, co oznacza, że szablon można zapisać w 40 znakach. Istnieje zatem 6 * 6 = 36 możliwych par znaków, które są kodowane jako znaki ASCII od 48 do 73. Tłumaczenie z powrotem na oryginalny znak jest podane w małej tabeli odnośników
m
.Reszta logiki polega głównie na powtarzaniu czasów wzoru
n
, co oznacza przeskakiwanie o 4 znaki w szablonie, przy jednoczesnym prawidłowym wysyłaniu początkowej i końcowej części każdego wiersza.źródło
PHP 5.5.3,
488, 466źródło
=
i.=
.Prolog (SWI), 285 bajtów
(Z białymi znakami):
Próbowałem kilku sposobów rąbania strun, ale żaden nie wydawał się pokonać tej naiwnej metody kolumn.
źródło
JavaScript (ES6),
158154148137 bajtówEdycja: Zapisano 11 bajtów dzięki @ Bálint.
źródło
/(..)(.{4})/g
ma 13 bajtów, tyle samo co/(..)(....)/g
...Java,
339330 bajtówMoje pierwsze rozwiązanie zawierało tak wiele „statycznych” słów kluczowych, że krótsze było uczynienie metod i atrybutów niestatycznymi i uruchomienie kodu w konstruktorze.
źródło
PowerShell,
228207181133 bajtówPrzypomnienie - PowerShell nie czeka automatycznie na standardowe wejście. Musisz coś wpakować, np
3|%{...}
źródło
SmileBASIC, 149 bajtów
Każdy łańcuch zawiera wzór
AACCBBDD
, który jest rozszerzony, tworząc część zastosowane n-krotnie, a następnie 2 pierwsze znaki są usunięte. (Usunięcie postaci od początku było krótsze niż od końca)AABB(CCBB)*DD
CCBB
źródło