Golf punktowany przez użytkownika - losowanie diamentów [eksperymentalne]

11

To wyzwanie zachowa się mniej więcej tak, jak tradycyjny . 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 CATprzyniosłoby

  T  
 TAT 
TACAT
 TAT 
  T  

i ()produkuje

 ) 
)()
 ) 

i  dessertsprodukuje

        s        
       sts       
      strts      
     strerts     
    streserts    
   stressserts   
  stressesserts  
 stressedesserts 
stressed desserts
 stressedesserts 
  stressesserts  
   stressserts   
    streserts    
     strerts     
      strts      
       sts       
        s        

i 9produkuje 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 4wynosił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 \nzamiast C do znaku nowej linii i \sdo 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 tablinkó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):&nbsp;<span id='comments'></span></div><div class='analytics'>Invalid answers (illegal characters or no code block):&nbsp;<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

Hobby Calvina
źródło
#### 1 -> * ####
Martin Ender
Komentarze mogą być edytowane przez 5 minut, więc ich edytowanie może spowodować całkowite spustoszenie dzięki regułom braku powtórzeń.
Peter Taylor
@PeterTaylor Ale jak mogę przerwać edytowanie komentarzy? Poza tym całkowicie ignoruję te, które są edytowane. 5 minut mija dość szybko.
Calvin's Hobbies
1
W ogóle nie podoba mi się ten system punktacji (patrz czat), ale jeśli zamierzasz go używać, ignorowanie edytowanych komentarzy jest zdecydowanie słuszne.
Peter Taylor
#### 2 ->: ####
Logic Knight

Odpowiedzi:

4

CJam, 144 150 bajtów

"x*3:*3:3*::33:3:::333*::333*3::***3::**::33:3::3*:::::*3:3:3:**33*333333::33*:*333:*3*3**:**3:**:3*3:33*3:3*:333**:3**33:*3:::*:3*::3"'3/'b*3b127b:c~

Próbowałem kodowania ...

Zaktualizowano, ponieważ bzmieniła się waga .

Kolejne kodowanie, które jest lepsze tylko w teorii (140 bajtów):

":***(*3:**3*I**:3*****:*3*******: ::::*:***II@3*******: :**I:**:***:*3***3*I3I:3***33:::*I**3I***3***:3:*I*3I"{"*:I3( **@"#1a*~0}%2b126b:c~
jimmy23013
źródło
5

Python 2, 120 bajtów

T=raw_input()
L=len(T)
r=[b[::-1]+b[1:]for b in [T[-b:]+' '*(L-b)for b in range(1,L+1)]]
for b in r[:-1]+r[::-1]:print b

Edycja: Niższy koszt w przypadku niektórych tańszych postaci.

Logic Knight
źródło
2

CJam, 31 bajtów

lW%_,:I(S*\+I*I/2%{_W%1>+z}2*N*

Na razie tylko adaptacja mojej odpowiedzi na Wydrukuj ten diament . Mógłbym go ulepszyć, gdy waga się zmieni.

Sprawdź to tutaj.

Martin Ender
źródło
1

J, 45 znaków

(({~((]*]<#@[)>:@(+/~)@:|@i:@(2-#)))@(' '&,))

Długie rozwiązanie, gra w golfa z kilkoma tanimi znakami ...

Wypróbuj online. (Dołącz ciąg wejściowy z pojedynczymi cudzysłowami).

randomra
źródło
1

PHP (131 znaków)

function f($s){for($i=-($l=strlen($s));$i<$l;$I=abs(++$i)){$t=substr($s,$I);echo str_repeat(' ',$I).strrev($t).substr($t,1)."\n";}}

http://3v4l.org/9Vvkm

Zoptymalizuje się, gdy wagi będą wyraźniejsze.

Stephen
źródło
Twój kod może zostać przepisany na to: 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ć.
Ismael Miguel
0

Java, 318 bajtów

class N{public static void main(String[]a){char[]s=new java.util.Scanner(System.in).nextLine().toCharArray();int l=s.length,m=l-1,$=0,b;String t="";for(;$<l;$++,t+='\n')for(b=0;b<l+$;b++)t+=b+$<m?' ':s[b>m?m-b+$:b+$-m];for($=l-2;$>-1;$--,t+='\n')for(b=0;b<l+$;b++)t+=b+$<m?' ':s[b>m?m-b+$:b+$-m];System.out.print(t);}}
Ypnypn
źródło