Codice utente segnato Golf - Disegno di diamanti [sperimentale]


11

Questa sfida si comporterà più o meno come un tradizionale . L'unica differenza è che invece di assegnare un punteggio alle risposte in base al loro numero di caratteri o byte, gli utenti assegneranno pesi a diversi personaggi nei commenti e vincerà il programma con il peso cumulativo più basso.

Sfida

Il tuo compito è quello di scrivere un programma che prende una stringa e stampa una forma di diamante in cui il primo carattere inizia al centro e i caratteri successivi occupano gli spazi vuoti ortogonali all'insieme di caratteri che sono stati posizionati per ultimi. Spaces ( ) verrà utilizzato per il riempimento.

Ad esempio l'immissione CATprodurrebbe

  T  
 TAT 
TACAT
 TAT 
  T  

e ()produrrebbe

 ) 
)()
 ) 

e  dessertsprodurrebbe

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

e 9produrrebbe 9.

Dettagli

  • Il codice può contenere solo ASCII e newline stampabili . (Vedi perché di seguito.)

  • L'input / output dovrebbe avvenire tramite stdin / stdout o, se non sono possibili, utilizzare alternative simili.

  • Si può presumere che la stringa di input contenga solo ASCII stampabile (incluso lo spazio).

  • Le colonne di spazi iniziali che non contengono alcuna porzione del motivo a diamante non sono consentite nell'output. È consentita qualsiasi quantità e combinazione di spazi trailing space.

  • Opzionalmente potrebbe esserci una nuova riga finale nell'output.

  • Puoi modificare la tua risposta quanto vuoi.

punteggio

Tutto il codice deve essere scritto usando solo le nuove righe e i 95 caratteri ASCII stampabili:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(Purtroppo le schede non sono consentite perché Stack Exchange le rende come spazi nei blocchi di codice.)

A ciascuno di questi 96 caratteri è associato un valore di peso . Per impostazione predefinita, tutti i pesi sono 97.

Il punteggio di un programma è la somma dei valori di peso per ciascuno dei suoi caratteri. Ad esempio, se il programma fosse print(4)e il peso per 4fosse 70, ma invariato per tutto il resto, il punteggio sarebbe 749 = 97+97+97+97+97+97+70+97.

Una volta che l'attività in questa domanda si è stabilizzata quasi per nulla, vince la proposta con il punteggio più basso. Nel caso presumibilmente improbabile di pareggio, le vittorie vanno alla risposta più votata.

Cambiare peso

Ogni utente, indipendentemente dal fatto che abbia risposto o meno, può modificare il peso di uno dei 96 caratteri in un valore univoco compreso tra 1 e 96. A tale scopo, aggiungi un commento a questa domanda del modulo #### W -> C ####, dove W è un numero intero da Da 1 a 96 e C è il personaggio (come se stesso, senza virgolette, senza backtick). Utilizzare \nal posto di C per newline e \sper spazio poiché Stack Exchange comprime 3 spazi di fila. L' print(4)esempio sopra avrebbe avuto il commento #### 70 -> 4 ####.

Ogni utente può fare UN SOLO commento in questo modo e sarà valido solo se sia il carattere che il valore di peso non sono stati usati in un commento precedentemente fatto. Quindi, alla fine, potrebbero esserci 96 #### W -> C ####commenti, tutti di utenti diversi, tutti con pesi diversi assegnati a personaggi diversi.

Gli utenti possono eliminare il proprio commento se lo desiderano, riportando il peso dei loro personaggi su 97 fino a quando loro o qualcun altro non commentano nuovamente. Possono anche modificarli. I commenti che non seguono le regole relative a utenti / pesi / caratteri distinti devono essere eliminati o contrassegnati come "non costruttivi". I commenti generali su regole e altre cose vanno bene, ma dovrebbero essere ridotti al minimo.

Questo frammento di stack è la classifica ufficiale di questa domanda. Calcola automaticamente i punteggi per tutti gli invii raccogliendo i pesi dai commenti ogni volta che viene eseguito. Non gestisce i legami. Puoi anche usarlo per verificare il punteggio di un programma.

Probabilmente dovrai farlo right-click -> Open link in new tabper i link.

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>

Perché questa classifica funzioni, i commenti devono essere nel formato esatto sopra descritto e il codice del programma deve trovarsi nel primo blocco di codice a più righe nella risposta ( <pre><code>...</code></pre>quelli). Non utilizzare l'evidenziazione della sintassi o il codice non verrà letto correttamente. Lo snippet può richiedere un minuto o due prima di essere aggiornato.

Non ho testato a fondo lo snippet ma lo terrò d'occhio mentre questo concorso inizia. Se noti qualche bug, per favore dimmelo. Ecco una versione non minimizzata:

Tieni presente che questo sistema di punteggio è completamente nuovo e sperimentale. Spero che Stack Exchange non si preoccupi del fatto che coinvolga tonnellate di commenti. : P

Sfida correlata: stampare questo diamante


#### 1 -> * ####
Martin Ender,

I commenti possono essere modificati per 5 minuti, quindi consentire loro di essere modificati potrebbe causare il caos totale con le regole di non ripetizione.
Peter Taylor,

@PeterTaylor Ma come posso eventualmente interrompere le modifiche ai commenti? Oltre a ignorare totalmente quelli che vengono modificati. 5 minuti sono abbastanza veloci.
Hobby di Calvin il

1
Questo sistema di punteggio non mi piace affatto (vedi chat), ma se lo utilizzerai, ignorare i commenti che vengono modificati è sicuramente la cosa giusta da fare.
Peter Taylor,

#### 2 ->: ####
Logic Knight,

Risposte:


4

CJam, 144 150 byte

"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~

Ho provato un po 'di codifica ...

Aggiornato perché il peso di bè cambiato.

Un'altra codifica che è solo migliore in teoria (140 byte):

":***(*3:**3*I**:3*****:*3*******: ::::*:***II@3*******: :**I:**:***:*3***3*I3I:3***33:::*I**3I***3***:3:*I*3I"{"*:I3( **@"#1a*~0}%2b126b:c~

5

Python 2, 120 byte

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

Modifica: costo ridotto con alcuni personaggi più economici.




1

J, 45 caratteri

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

Soluzione longish, lo golf con alcuni caratteri economici ...

Provalo online. (Aggiungi stringa di input con virgolette singole.)


1

PHP (131 caratteri)

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

Ottimizzerà una volta che i pesi saranno più chiari.


Il tuo codice potrebbe essere riscritto in questo: 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";}che potrebbe non funzionare. Ma è di 6 byte in meno! Probabilmente potresti prendere qualcosa da qui.
Ismael Miguel,

0

Java, 318 byte

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);}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.