Analizza i commenti dal mio codice esoterico


30

All'inizio di questa settimana, abbiamo imparato come formattare le lingue esoteriche per i commenti. Oggi faremo il contrario. Ho bisogno che tu scriva un programma o una funzione che analizzi un codice esoterico ben commentato e analizzi i commenti, restituendo solo il codice. Utilizzando alcuni esempi della sfida precedente, ecco come appare un codice ben commentato:

a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth

Ecco cosa devi fare per estrarre il codice. Innanzitutto, rimuovi il carattere di commento ( #), lo spazio prima di esso e tutto dopo il carattere di commento.

a               
 bc             
   d            
    e           
     fgh        
        ij      
          k     
           l    
            mn  
              op

Quindi, comprimi ciascuna riga verso l'alto in una singola riga. Ad esempio, poiché si btrova nella seconda colonna della riga due, una volta compresso, sarà nella seconda colonna della riga uno . Allo stesso modo, cverrà inserito nella terza colonna della riga uno e dverrà inserito nella quarta. Ripeti questo per ogni personaggio e ottieni questo:

abcdefghijklmnop

Nota importante: sembra che la banale soluzione sia semplicemente rimuovere i commenti, rimuovere ogni spazio e unire ogni riga. Questo non è un approccio valido! Poiché il codice originale potrebbe contenere spazi, questi verranno eliminati con questo approccio. Ad esempio, questo è un input perfettamente valido:

hello         #Line one
              #Line two
       world! #Line three

E l'output corrispondente dovrebbe essere:

hello  world!

La sfida:

Scrivi un programma o una funzione che accetta il codice commentato come input e genera o restituisce il codice con tutti i commenti analizzati. È necessario generare il codice senza spazi finali, sebbene sia consentita una nuova riga finale. Il carattere del commento sarà sempre #e ci sarà sempre uno spazio extra prima dell'inizio dei commenti. #sarà non visualizzato nella sezione commento dell'ingresso. Per semplificare la sfida, ecco alcuni input che non devi gestire:

  • Puoi presumere che il codice non avrà due caratteri nella stessa colonna. Ad esempio, questo è un input che viola questa regola:

    a  #A character in column one
    bc #Characters in columns one and two
    
  • Puoi anche supporre che tutti i caratteri di commento vengano visualizzati nella stessa colonna. Ad esempio, questo input:

    short       #this is a short line
          long        #This is a long line
    

    viola questa regola. Questo significa anche che #non sarà nella sezione del codice.

  • Infine, non è necessario gestire sezioni di codice con spazi iniziali o finali. Per esempio,

      Hello,          #
             World!   #
    

Si può anche supporre che l'input contenga solo caratteri ASCII stampabili.

Esempi:

Input:
hello         #Line one
              #Line two
       world! #Line three

Output:
hello  world!

Input:
E                                                   #This comment intentionally left blank
 ac                                                 #
   h s                                              #
      ecti                                          #
          on is                                     #
                one c                               #
                     haracte                        #
                            r longer                #
                                     than the       #
                                              last! #

Output:
Each section is one character longer than the last!

Input:
4          #This number is 7
 8         #
  15       #That last comment is wrong.
    16     #
      23   #
        42 #

Output:
4815162342

Input:
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6

Output:
Hello world, how are you?

Input:
Prepare                               #
        for...                        #
                        extra spaces! #

Output:
Prepare for...          extra spaces!

Puoi inserire input in qualsiasi formato ragionevole che ti piace, ad esempio un elenco di stringhe, una singola stringa con newline, un secondo elenco di caratteri, ecc. Vince la risposta più breve in byte!


Dovremo accettare il codice con caratteri inferiori a quello successivo?
wizzwizz4,

Potresti aggiungere il test case con la riga vuota con solo due spazi (come quello hello world!che hai mostrato)? Inoltre, dichiari: " #non verrà visualizzato nella sezione dei commenti dell'input ", ma può verificarsi nello snippet di codice stesso?
Kevin Cruijssen,

@KevinCruijssen Vedi le mie modifiche
DJMcMayhem

@ wizzwizz4 Non sono sicuro di aver capito la tua domanda
DJMcMayhem

@DJMcMayhem Esempio: do {stuff} while (condition);con la spiegazione in ordine do while (condition); #Explainythingquindi {stuff} #Explainything.
wizzwizz4,

Risposte:


18

Gelatina , 8 7 byte

»/ṣ”#ḢṖ

Provalo online!

Come funziona

»/ṣ”#ḢṖ  Main link. Argument: A (array of strings)

»/       Reduce the columns of A by maximum.
         Since the space is the lowest printable ASCII characters, this returns the
         non-space character (if any) of each column.
  ṣ”#    Split the result at occurrences of '#'.
     Ḣ   Head; extract the first chunk, i.e., everything before the (first) '#'.
      Ṗ  Pop; remove the trailing space.

2
Questo è solo ... wow.
Jonathan Allan,

3
Sono così gelatinoso adesso.
MonkeyZeus,

Come si fa a hackerarlo nel telefono?
simbabque,

2
@simbabque Pazienza e molto copia-incolla.
Dennis,

Metto sempre usando un ferro da stiro 9, forse è il momento che ho imparato a usare un putter quando sono sul green ...
Magic Octopus Urn

13

Python 2, 48 43 byte

lambda x:`map(max,*x)`[2::5].split(' #')[0]

Grazie a @xnor per giocare a golf con 5 byte!

Provalo su Ideone .


1
Penso che tu possa fare semplicemente map(max,*x)perché maxaccetta un numero qualsiasi di argomenti ed Noneè piccolo.
xnor

Bene, dimentico sempre che mappuò essere usato così ... Grazie!
Dennis,

1
Come funziona il `...`[2::5]trucco?
smls

1
@smls `...`è equivalente a repr(...), quindi per l'elenco di stringhe singleton ['a', 'b', 'c'], ottieni la stringa "['a', 'b', 'c']". Infine, [2::5]taglia i primi due caratteri ( "['") e prende ogni quinto carattere della stringa rimanente.
Dennis,

5

JavaScript (ES6), 97 75 60 byte

Grazie a @Neil per aver aiutato a giocare a golf con 22 byte

a=>a.reduce((p,c)=>p.replace(/ /g,(m,o)=>c[o])).split` #`[0]

L'input è una matrice di linee.

  • a è l'input di array
  • p è l'elemento precedente
  • c è l'elemento corrente
  • m è la stringa di corrispondenza
  • o è offset

Conto 96 byte? Inoltre, il mflag regexp non è necessario (ce l'hai $in un punto?) Così come lo spazio (p, c). Infine, penso replaceche funzionerà più breve di [...p].map().join.
Neil,

97 per me, sia dal manuale che dallo lengthscript utente, forse non hai contato la nuova riga, ma solo perché ho accidentalmente incluso il punto
solo ASCII il

Vedo ora - non avevo copiato quello ;che non è richiesto (JavaScript ha ASI).
Neil,

Sì, scusa, ce l'ho fatta per assicurarmi che la console Chromium metta la chiamata di funzione fuori dal corpo della funzione (ce l'aveva una volta su una lambda scritta male)
ASCII il

Oh wow, non avevo capito che replacesarebbe stato di grande aiuto, è davvero bello!
Neil,

4

Perl, 35 34 32 byte

Include +1 per -p

Dare input su STDIN

eso.pl

#!/usr/bin/perl -p
y/ /\0/;/.#/;$\|=$`}{$\=~y;\0; 

Si noti che c'è uno spazio dopo la finale ;. Il codice funziona come mostrato, ma sostituiscilo \0con il carattere letterale per ottenere il punteggio richiesto.


Codice molto bello. È $a|=...piuttosto ben fatto, mi ci è voluto un po 'per capire cosa stavi facendo! Una domanda però: *_=asembra essere approssimativamente equivalente a $_=$a, perché?
Dada,

*_=aè un incarico glob molto oscuro che alias i _globi e i aglobi. Quindi non è tanto una copia $aa $_ma da quel momento in poi (globale) $ae $_sono in realtà la stessa variabile. Tutto per salvare 1 byte ...
Ton Hospel

Ok, grazie per la spiegazione! (e bel miglioramento grazie a `$ \`)
Dada,

3

Python 2, 187 byte

def f(x,o=""):
 l=[i[:i.index("#")-1]for i in x]
 for n in range(len(l[0])):
  c=[x[n]for x in l]
  if sum([1for x in c if x!=" "])<1:o+=" "
  else:o+=[x for x in c if x!=" "][0]
 print o

Ho intenzione di giocare a golf ancora domani ho scuola;)


1 forpuò essere ridotto a 1for. Inoltre, se la somma dell'elenco (alla riga 5) non può essere negativa, puoi semplicemente controllare <1invece di ==0. Buona giornata a scuola! : D +1.
Yytsi,


2

CJam , 12 byte

Grazie a Sp3000 per aver salvato 2 byte.

{:.e>_'##(<}

Un blocco senza nome che accetta un elenco di stringhe (una per ogni riga) e lo sostituisce con una singola stringa.

Provalo online!

Spiegazione

:.e>  e# Reduce the list of strings by elementwise maximum. This keeps non-spaces in
      e# favour of spaces. It'll also wreak havoc with the comments, but we'll discard
      e# those anyway.
_'##  e# Duplicate and find the index of '#'.
(<    e# Decrement that index and truncate the string to this length.

2

J, 30 byte

(#~[:<./\'#'~:])@(>./&.(3&u:))

Prende un elenco di stringhe come input. Fondamentalmente usa lo stesso approccio di Dennis nella sua risposta Jelly.

Commentato e spiegato

ord =: 3 & u:
under =: &.
max =: >./
over =: @
maxes =: max under ord
neq =: ~:
arg =: ]
runningMin =: <./\
magic =: #~ [: runningMin ('#' neq arg)

f =: magic over maxes

Passaggi intermedi:

   p
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6
   maxes p
Hello world, how are you? #Comment 6
   magic
#~ ([: runningMin '#' neq arg)
   3 neq 4
1
   '#' neq '~'
1
   '#' neq '#'
0
   '#' neq maxes p
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
   runningMin 5 4 2 5 9 0 _3 4 _10
5 4 2 2 2 0 _3 _3 _10
   runningMin '#' neq maxes p
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
   0 1 0 1 1 0 # 'abcdef'
bde
   'abcdef' #~ 0 1 0 1 1 0
bde
   (maxes p) #~ runningMin '#' neq maxes p
Hello world, how are you? 
   (#~ [: runningMin '#' neq arg) maxes p
Hello world, how are you? 
   ((#~ [: runningMin '#' neq arg) over maxes) p
Hello world, how are you? 
   (magic over maxes) p
Hello world, how are you? 

Caso di prova

   f =: (#~[:<./\'#'~:])@(>./&.(3&u:))
   a
Hello                     #Comment 1
      world               #Comment 2
           ,              #Comment 3
             how          #Comment 4
                 are      #Comment 5
                     you? #Comment 6
   $a
6 36
   f a
Hello world, how are you?

2

Javascript (ES6), 63 byte

a=>a.reduce((p,c)=>p+/(.+?)\s+#/.exec(c)[1].slice(p.length),'')

Accetta input come una matrice di stringhe.

F=a=>a.reduce((p,c)=>p+/(.+?)\s+#/.exec(c)[1].slice(p.length),'')

input.oninput = update;
update();

function update() {
  try {
    output.innerHTML = F(input.value.trim().split`
`);
  } catch(e) {
    output.innerHTML = 'ERROR: INVALID INPUT';
  }
}
textarea {
  width: 100%;
  box-sizing: border-box;
  font-family: monospace;
}
<h2>Input:</h2>
<textarea id="input" rows="8">
a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth
</textarea>
<hr />
<h2>Output:</h2>
<pre id="output">
</pre>



1

Pyke, 15 10 byte

,FSe)s\#ch

Provalo qui!

Risposta Port of the Jelly

,          -     transpose()
 FSe)      -    map(min, ^)
     s     -   sum(^)
      \#c  -  ^.split("#")
         h - ^[0]

1

C # 157 122 byte

Golfato di 35 byte grazie a @milk - anche se lo giuro, l'ho provato prima.

Accetta l'input come una matrice di caratteri 2D.

string f(char[][]s){int i=0;foreach(var x in s)for(i=0;x[i]!=35;i++)if(x[i]!=32)s[0][i]=x[i];return new string(s[0],0,i);}

157 byte:

string g(char[][]s){var o=new char[s[0].Length];foreach(var x in s)for(int i=0;x[i]!=35;i++)if(x[i]!=32|o[i]<1)o[i]=x[i];return new string(o).TrimEnd('\0');}

Non dovrebbe Trim()funzionare invece di TrimEnd()? Ancora meglio, penso che puoi salvare molti byte usando s [0] come output var e usando return new string(s[0],0,i)dove si itrova l'indice dell'ultimo carattere del codice. Quell'idea potrebbe richiedere due forloop anziché il foreach, ci penserò più e proverò a scrivere il codice reale più tardi oggi.
latte

Trim()taglierà anche dall'inizio, che credo non sarebbe valido. Inizialmente stavo anche eseguendo il caricamento in s [0] e avevo int i;al di fuori del ciclo (per riutilizzarlo nel ritorno) che credo alla fine abbia aggiunto byte
pinkfloydx33

1

Pyth, 11 byte

PhceCSMCQ\#

Un programma che accetta l'input di un elenco di stringhe su STDIN e stampa una stringa.

Provalo online

Come funziona

PhceCSMCQ\#  Program. Input: Q
       CQ    Transpose Q
     SM      Sort each element of that lexicographically
    C        Transpose that
   e         Yield the last element of that, giving the program ending with ' #' and some
             parts of the comments
  c      \#  Split that on the character '#'
 h           Yield the first element of that, giving the program with a trailing space
P            All but the last element of that, removing the trailing space
             Implicitly print

1

sed, 126 byte

:a;N;$!ba;s,#[^\n]*\n,#,g;s,^,#,;:;/#[^ ]/{/^# /s,^# *,,;t;H;s,#.,#,g}
t;/#[^ ]/!{H;s,#.,#,g};t;g;s,\n#(.)[^\n]*,\1,g;s,...$,,

Richiede una nuova riga alla fine dell'input.
Sono sicuro di poterlo giocare un po 'di più, ma sono contento che funzioni per ora.



0

Gelatina , 27 byte

żḟ€” ;€” Ḣ€
i€”#’©ḣ@"ç/ḣ®ṪṖ

Provalo su TryItOnline

Utilizza le specifiche più rigorose: lo spazio extra prima che il carattere di commento venga rimosso al costo di un byte.

L'input è un elenco di stringhe.


@Erik il giocatore di golf - forse è così, ma hai visto lo schiacciamento che mi ha dato qui ?
Jonathan Allan,


0

TSQL, 216 175 byte

golfed:

DECLARE @ varchar(max)=
'hello         #Line one
              #Line two
       world! #Line three'

DECLARE @i INT=1,@j INT=0WHILE @i<LEN(@)SELECT @=stuff(@,@j+1,len(x),x),@j=iif(x=char(10),0,@j+1),@i+=1FROM(SELECT ltrim(substring(@,@i,1))x)x PRINT LEFT(@,patindex('%_#%',@))

Ungolfed:

DECLARE @ varchar(max)=
'hello         #Line one
              #Line two
       world! #Line three'

DECLARE @i INT=1,@j INT=0
WHILE @i<LEN(@)
  SELECT @=stuff(@,@j+1,len(x),x),@j=iif(x=char(10),0,@j+1),@i+=1
  FROM(SELECT ltrim(substring(@,@i,1))x)x
PRINT LEFT(@,patindex('%_#%',@))

Violino


0

Javascript, 56 34 byte, non concorrenti

q=>q.split(/\n/).map(x=>/ (.?) #./.exec(x)[1]).join()

q=>q.replace(/^ *| *#.*$\n?/gm,'')

Come ha sottolineato @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, non sono preparato per spazi extra


Non passa il caso "Prepara spazi extra"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

Dyalog APL , 22 byte

Ispirazione .

(⎕UCS¯2↓⍳∘35↑⊢)⌈⌿∘⎕UCS

(

⎕UCS rappresentazione del personaggio di

¯2↓ tutti tranne gli ultimi due

⍳∘35↑ fino alla posizione della prima 35 ("#"), in quella che è al di fuori della parentesi, presa da

ciò che è al di fuori della parentesi

) vale a dire ...

⌈⌿ i massimi colonnari

di

⎕UCS i valori Unicode

ProvaAPL online!


Quanti byte?
acrolith,
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.