To wyzwanie zachowa się mniej więcej tak, jak tradycyjny golf . Jedyną różnicą jest to, że zamiast oceniać odpowiedzi według liczby znaków lub bajtów, użytkownicy przypiszą wagi do różnych znaków w komentarzach, a program o najniższej skumulowanej wadze wygra.
Wyzwanie
Twoim zadaniem jest napisanie programu, który pobierze ciąg znaków i wydrukuje kształt rombu, w którym pierwszy znak zaczyna się w środku, a kolejne znaki zajmują puste przestrzenie prostopadłe do zestawu znaków, które zostały umieszczone na końcu. Do wypełniania zostaną użyte spacje ( ).
Na przykład Wprowadzanie CAT
przyniosłoby
T
TAT
TACAT
TAT
T
i ()
produkuje
)
)()
)
i desserts
produkuje
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
i 9
produkuje 9
.
Detale
Kod może zawierać tylko drukowalne ASCII i znaki nowej linii. (Zobacz dlaczego poniżej.)
Wejścia / wyjścia powinny odbywać się poprzez stdin / stdout lub, jeśli nie są możliwe, użyj podobnych alternatyw.
Możesz założyć, że ciąg wejściowy zawiera tylko drukowalne ASCII (łącznie ze spacją).
Kolumny wiodących spacji, które nie zawierają żadnej części wzoru diamentu, nie są dozwolone w danych wyjściowych. Dowolna ilość i kombinacja spacji końcowych jest dozwolona.
Opcjonalnie może pojawić się końcowy znak nowej linii.
Możesz edytować swoją odpowiedź tyle, ile chcesz.
Punktacja
Cały kod musi być napisany przy użyciu tylko nowego wiersza i 95 znaków ASCII do wydrukowania:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(Niestety karty nie są dozwolone, ponieważ Stack Exchange renderuje je jako spacje w blokach kodu).
Każdy z tych 96 znaków ma przypisaną wartość wagi . Domyślnie wszystkie wagi mają wartość 97.
Wynik programu jest sumą wartości wagi dla każdego z jego znaków. Na przykład, jeśli program byłby, print(4)
a waga dla niego 4
wynosiła 70, ale dla wszystkich pozostałych pozostała niezmieniona, wynik byłby 749 = 97+97+97+97+97+97+70+97
.
Gdy aktywność w tym pytaniu ustąpi prawie do zera, wygrywa zgłoszenie o najniższym wyniku. W przypuszczalnie mało prawdopodobnym przypadku remisu wygrywa najwyższa głosowana odpowiedź.
Zmiana ciężaru
Każdy użytkownik, bez względu na to, czy odpowiedział, czy nie, może zmienić wagę jednego z 96 znaków na unikalną wartość od 1 do 96. Aby to zrobić, dodaj komentarz do tego pytania formularza #### W -> C ####
, gdzie W jest liczbą całkowitą od Od 1 do 96, a C jest znakiem (jako taki, bez cudzysłowów, bez odwrotnych znaków). Użyj \n
zamiast C do znaku nowej linii i \s
do spacji, ponieważ Stack Exchange kompresuje 3 spacje z rzędu. Powyższy print(4)
przykład miałby komentarz #### 70 -> 4 ####
.
Każdy użytkownik może wypowiedzieć JEDEN komentarz w ten sposób i będzie on ważny tylko wtedy, gdy zarówno znak, jak i wartość masy nie zostały użyte w poprzednio napisanym komentarzu. Tak więc ostatecznie może być 96 #### W -> C ####
komentarzy, wszystkie od różnych użytkowników, wszystkie o różnych wagach przypisanych do różnych znaków.
Użytkownicy mogą usunąć własny komentarz, jeśli chcą, resetując wagę swoich znaków z powrotem do 97, dopóki oni lub ktoś inny nie skomentuje ponownie. Mogą również je edytować. Komentarze niezgodne z regułami dotyczącymi różnych użytkowników / wag / znaków należy usunąć lub oznaczyć jako „niekonstruktywne”. Ogólne komentarze na temat zasad i innych rzeczy są w porządku, ale należy je ograniczyć do minimum.
Ten fragment stosu jest oficjalną tabelą wyników dla tego pytania. Automatycznie oblicza wyniki dla wszystkich zgłoszeń, zbierając wagi z komentarzy przy każdym uruchomieniu. Nie obsługuje więzi. Możesz go również użyć do sprawdzenia wyniku, jaki uzyska program.
Prawdopodobnie będziesz potrzebować right-click -> Open link in new tab
linków.
function compute(){var e=computeScore($("#code").val());$("#score").val(e==-1?"Invalid characters":e)}function computeScore(e){var t=0;for(var n=0;n<e.length;n++){if(weights.hasOwnProperty(e[n])){t+=weights[e[n]]}else{return-1}}return t}function htmlDecode(e){var t=document.createElement("div");t.innerHTML=e;return t.childNodes.length===0?"":t.childNodes[0].nodeValue}function addLeaderboard(){validAnswers.sort(function(e,t){return e.score>t.score});var e=1;var t="";for(var n=0;n<validAnswers.length;n++){var r=validAnswers[n];t+="<tr><td>"+e+"</td><td><a href='"+r.link+"'>"+r.owner.display_name+"</a></td><td>"+r.score+"</td><td>"+r.length+"</td></tr>";if(n+1<validAnswers.length&&validAnswers[n+1].score>r.score){e++}}$("#leaderboard").append(t)}function addAnalytics(){var e="";for(var t in weights){if(weights.hasOwnProperty(t)&&weights[t]!=defaultWeight){e+=(t=="\n"?"\\n":t)+"="+weights[t]+" "}}$("#weights").val(e);var n="";for(var t in usedChars){if(usedChars.hasOwnProperty(t)&&usedChars[t]==false){n+=t=="\n"?"\\n":t}}$("#unusedc").val(n);var r="";for(var t in usedWeights){if(usedWeights.hasOwnProperty(t)&&usedWeights[t]==false){r+=t+" "}}$("#unusedw").val(r);var i="";if(invalidComments.length>0){for(var s=0;s<invalidComments.length;s++){var o=invalidComments[s];i+="<a href='#"+o.link+"'>"+o.owner.display_name+"</a> "}}else{i="none"}$("#comments").html(i);var u="";if(invalidAnswers.length>0){for(var s=0;s<invalidAnswers.length;s++){var a=invalidAnswers[s];u+="<a href='#"+a.link+"'>"+a.owner.display_name+"</a> "}}else{u="none"}$("#answers").html(u)}function checkAnswers(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=answerPattern.exec(n.body);if(r){var i=htmlDecode(r[1]);var s=computeScore(i);if(s==-1){invalidAnswers.push(n)}else{n.length=i.length;n.score=s;validAnswers.push(n)}}else{invalidAnswers.push(n)}}addLeaderboard();addAnalytics()}function checkComments(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=commentPattern.exec(htmlDecode(n.body));if(r){var i=n.owner.user_id;var s=parseInt(r[1]);var o=r[2]=="\\n"?"\n":r[2]=="\\s"?" ":r[2];if(userIDs.hasOwnProperty(i)||!usedWeights.hasOwnProperty(s)||usedWeights[s]||!usedChars.hasOwnProperty(o)||usedChars[o]){invalidComments.push(n)}else{userIDs[i]=true;usedWeights[s]=true;usedChars[o]=true;weights[o]=s}}}$.get(answersURL,checkAnswers)}function refresh(){$.get(commentsURL,checkComments)}questionID=45040;commentsURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/comments?order=asc&sort=creation&site=codegolf&filter=!t)IWLXOkOvAuPe8m2xJrXOknWcw(ZqZ";answersURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/answers?order=desc&sort=activity&site=codegolf&filter=!.FjsvG2LuND(frE*)WTvqQev1.lyu";commentPattern=/^#### (\d+) -> (\\(?:n|s)|[ -~]) ####$/;answerPattern=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/;chars="\n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";validAnswers=[];invalidAnswers=[];invalidComments=[];userIDs={};usedWeights={};usedChars={};weights={};defaultWeight=chars.length+1;for(var i=0;i<chars.length;i++){usedChars[chars[i]]=false;usedWeights[i+1]=false;weights[chars[i]]=defaultWeight}refresh()
*{font-family:Helvetica,Arial,sans-serif}table{border:3px solid green;border-collapse:collapse}button{font-size:100%}th{background-color:green;color:#fff;padding:6pt}td{border:1px solid green;padding:6pt}.large{font-size:140%}.title{font-weight:700;margin:6pt 0}textarea{font-family:"Courier New";white-space:nowrap;overflow:auto}input[readonly]{background-color:#dcdcdc}.analytics{font-size:90%;padding:4pt 0 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div class='large title'>Leaderboard</div><table id='leaderboard'> <tr> <th>Place</th> <th>Submitter</th> <th>Score</th> <th>Program Length</th> </tr></table><br><div class='title'>Compute Score</div><textarea id='code' rows='5' cols='40' placeholder='paste code here...'></textarea><br><button type='button' onclick='compute()'>Compute</button> Score: <input type='text' id='score' readonly><br><br><div class='title'>Analytics</div><div class='analytics'>Assigned weights: <input type='text' id='weights' readonly></div><div class='analytics'>Unused characters: <input type='text' id='unusedc' readonly> (all weight 97)</div><div class='analytics'>Unused weights: <input type='text' id='unusedw' readonly></div><div class='analytics'>Invalid comments (duplicate user/char/weight): <span id='comments'></span></div><div class='analytics'>Invalid answers (illegal characters or no code block): <span id='answers'><span></div><br><button type='button' onclick='refresh'>Refresh</button>
Aby tablica wyników działała, komentarze muszą mieć dokładnie opisany format opisany powyżej, a kod programu musi znajdować się w pierwszym wieloliniowym bloku kodu w odpowiedzi ( <pre><code>...</code></pre>
tych). Nie używaj podświetlania składni, ponieważ kod nie zostanie odczytany poprawnie. Aktualizacja może potrwać minutę lub dwie.
Nie przetestowałem dokładnie tego fragmentu, ale będę mieć go na oku, gdy rozpocznie się ten konkurs. Jeśli zauważysz jakieś błędy, powiedz mi. Oto niezminimalizowana wersja:
Pamiętaj, że ten system punktacji jest całkowicie nowy i eksperymentalny. Mam nadzieję, że Stack Exchange nie będzie miał nic przeciwko temu, że zawiera mnóstwo komentarzy. : P
Powiązane wyzwanie: wydrukuj ten diament
źródło
Odpowiedzi:
CJam,
144150 bajtówPróbowałem kodowania ...
Zaktualizowano, ponieważ
b
zmieniła się waga .Kolejne kodowanie, które jest lepsze tylko w teorii (140 bajtów):
źródło
Python 2, 120 bajtów
Edycja: Niższy koszt w przypadku niektórych tańszych postaci.
źródło
Pyth , 21 bajtów
Wypróbuj online: Pyth Compiler / Executor
źródło
CJam, 31 bajtów
Na razie tylko adaptacja mojej odpowiedzi na Wydrukuj ten diament . Mógłbym go ulepszyć, gdy waga się zmieni.
Sprawdź to tutaj.
źródło
J, 45 znaków
Długie rozwiązanie, gra w golfa z kilkoma tanimi znakami ...
Wypróbuj online. (Dołącz ciąg wejściowy z pojedynczymi cudzysłowami).
źródło
PHP (131 znaków)
http://3v4l.org/9Vvkm
Zoptymalizuje się, gdy wagi będą wyraźniejsze.
źródło
function f($s){for($i=-($l=strlen($s));$i<$l;)echo str_repeat(' ',$I=abs(++$i)),strrev($t=substr($s,$I)),substr($t,1),"\n";}
co może nie działać. Ale jest o 6 bajtów krótszy! Prawdopodobnie możesz coś stąd zabrać.Java, 318 bajtów
źródło