Yorumları ezoterik kodumdan ayrıştır


30

Bu haftanın başlarında, ezoterik dillerin yorum için nasıl biçimlendirileceğini öğrendik . Bugün bunun tersini yapacağız. Bazı iyi yorumlanmış ezoterik kodları ayrıştırıp sadece kodu döndürerek yorumları çözümleyen bir program veya işlev yazmanız gerekiyor. Önceki meydan okumadan bazı örnekler kullanarak, iyi yorumlanmış kodun neye benzediği şudur:

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

İşte kodu çıkarmak için yapmanız gerekenler. İlk olarak, yorum karakterini ( #), önündeki boşluğu ve yorum karakterinden sonraki her şeyi kaldırın .

a               
 bc             
   d            
    e           
     fgh        
        ij      
          k     
           l    
            mn  
              op

Ardından, her bir satırı yukarı doğru tek bir satıra daraltın. Çünkü Örneğin, bikinci hatta ikinci sütunda ise biz o kadar daraltmak kez, bu hat üzerinde ikinci sütunda olacak biri . Benzer şekilde, cbirinci satırın üçüncü sütununa dyerleştirilecek ve dördüncü sıraya yerleştirilecektir. Bunu her karakter için tekrarlayın ve şunu elde edin:

abcdefghijklmnop

Önemli not: Önemsiz bir çözüm sadece yorumları kaldırmak, her alanı kaldırmak ve her satıra katılmaktır. Bu geçerli bir yaklaşım değil ! Orijinal kodun içinde boşluklar olabileceğinden, bunlar bu yaklaşımla ortadan kaldırılacaktır. Örneğin, bu tamamen geçerli bir girdidir:

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

Ve ilgili çıktı şöyle olmalıdır:

hello  world!

Meydan okuma:

Yorumlanmış kodu girdi olarak alan ve kodundan çıkarılmış tüm yorumları içeren kodu veren veya veren bir program veya işlev yazın. Bir satır son satırına izin verilse de , kodu herhangi bir boşluk bırakmadan çıkarmalısınız . Yorum karakteri her zaman olacaktır #ve yorumlar başlamadan önce her zaman fazladan bir boşluk olacaktır. #olacak değil girdinin yorum bölümünde görünebilir. Meydan okumayı daha basit tutabilmek için işte ele almanız gerekmeyen bazı girişler :

  • Kodun aynı sütunda iki karakterinin olmayacağını varsayabilirsiniz. Örneğin, bu, bu kuralı ihlal eden bir girdidir:

    a  #A character in column one
    bc #Characters in columns one and two
    
  • Tüm yorum karakterlerinin aynı sütunda göründüğünü de varsayabilirsiniz. Örneğin, bu giriş:

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

    bu kuralı ihlal ediyor. Bu aynı zamanda #kod bölümünde olmayacağı anlamına gelir .

  • Son olarak, kod bölümlerini baştaki veya sondaki boşluklarla işlemeniz gerekmez. Örneğin,

      Hello,          #
             World!   #
    

Girişin yalnızca yazdırılabilir ASCII karakterleri içerdiğini de varsayabilirsiniz.

Örnekler:

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!

İstediğiniz makul formatta girdi alabilirsiniz, örneğin bir dizi listesi, yeni satırları olan tek bir dize, 2. karakter listesi, vb. Bayt cinsinden en kısa cevap!


Bir sonraki karakterden daha düşük karakter içeren kodu kabul etmemize gerek var mı?
wizzwizz4 13:16

Test senaryosunu boş satırda yalnızca iki boşluk bırakarak ( hello world!gösterdiğiniz gibi) ekleyebilir misiniz ? Ayrıca, şunu #belirtirsiniz : " girişin yorum bölümünde görünmeyecek. ", Ancak kod snippet'inin kendisinde de olabilir mi?
Kevin Cruijssen

@KevinCruijssen Düzenlemelerimi görün
DJMcMayhem

@ wizzwizz4 Sorunuzu anladığımdan emin değilim
DJMcMayhem

@DJMcMayhem Örnek: sonra do {stuff} while (condition);sırayla açıklama ile . do while (condition); #Explainything{stuff} #Explainything
wizzwizz4 13:16

Yanıtlar:


18

Jöle , 8 7 bayt

»/ṣ”#ḢṖ

Çevrimiçi deneyin!

Nasıl çalışır

»/ṣ”#ḢṖ  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
Bu sadece ... vay.
Jonathan Allan,

3
Şu an çok jöle duyuyorum.
MonkeyZeus,

Bunu telefonunuza nasıl hacklediniz?
simbabque 13:16

2
@simbabque Sabır ve çok fazla kopya-yapıştırma.
Dennis,

Her zaman 9'lu demir kullanıyorum, belki yeşil olduğunda bir atıcı kullanmayı öğrenmenin zamanı gelmiştir ...
Magic Octopus Urn

13

Python 2, 48 43 bayt

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

5 baytlık golf oynamak için @xnor'a teşekkürler!

İdeone üzerinde test et .


1
Bence yapabileceğini düşünüyorum map(max,*x)çünkü maxherhangi bir sayıda tartışmayı alıyor ve Noneküçük.
xnor

Doğru, mapböyle kullanılabileceğini hep unutmuşum ... Teşekkürler!
Dennis,

1
`...`[2::5]Hile nasıl çalışıyor?
smls

1
@smls `...`eşdeğerdir repr(...), yani singleton dizeleri listesi ['a', 'b', 'c']için dizgeyi alırsınız "['a', 'b', 'c']". Son olarak, [2::5]ilk iki karakteri keser ( "['") ve kalan dizenin her beşinci karakterini alır.
Dennis,

5

JavaScript (ES6), 97 75 60 bayt

22 bayta golf atılmasına yardımcı olduğu için @Neil'e teşekkürler

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

Giriş bir satır dizisidir.

  • a dizi girişi
  • p önceki öğe
  • c Geçerli öğe
  • m eşleşme dizesidir
  • o mahsup edildi

96 bayt sayıyorum? Ayrıca, mregexp bayrağı $da boşlukta olduğu gibi gereksizdir ( bir noktanız var mıydı?) (p, c). Sonunda sanırım replacedaha kısa sürecek [...p].map().join.
Neil

97 benim için, hem el kitabından hem de kullanıcı lengthlistesinden, belki yeni satırı saymadın, ancak yalnızca yanlışlıkla noktalı virgül eklediğim için
ASCII-yalnızca

Şimdi anlıyorum - ;gerekli olmayanı kopyalamamıştım (JavaScript'te ASI var).
Neil

Evet, üzgünüm, Chromium konsolun işlev çağrısını işlev gövdesinin dışına koyduğundan emin oldum (bir kez kötü yazılmış bir lambda koymuş))
ASCII-sadece

Vay canına, replaceçok yardımcı olacağını bilmiyordum , bu çok hoş!
Neil

4

Perl, 35 34 32 bayt

İçin +1 içerir -p

STDIN'e giriş ver

eso.pl

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

Finalden sonra bir boşluk olduğuna dikkat edin ;. Kod gösterildiği gibi çalışır, ancak \0istenen puanı almak için değişmez karakterle değiştirilir .


Çok güzel kod. Yani $a|=...oldukça iyi, yapılır bunu yaptıklarını dışarı rakama biraz zaman aldı! Yine de bir soru: *_=akabaca eşdeğer gibi görünüyor $_=$a, neden bu?
Dada

*_=a_globals ve aglobals isimlendiren çok karanlık bir glob ödevidir. Yani ne kadar çok bir kopya değil $ahiç $_ama (global) o noktadan itibaren $ave $_aslında aynı değişkendir. Hepsi 1 byte tasarruf etmek ...
Ton Hospel

Tamam, açıklama için teşekkürler! (ve '$ \ `sayesinde güzel bir gelişme)
Dada

3

Python 2, 187 bayt

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

Yarın daha çok golf oynayacağım okulum var;)


1 forazaltılabilir 1for. Ayrıca, listenin toplamı (5. satırda) negatif olamazsa, <1bunun yerine kontrol edebilirsiniz ==0. Mutlu okul günü! : D + 1.
Yytsi


2

CJam , 12 bayt

2 bayt tasarrufu için Sp3000'e teşekkürler.

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

Dizelerin bir listesini (her satır için bir tane) alan ve onu tek bir dize ile değiştiren adsız bir blok.

Çevrimiçi deneyin!

açıklama

:.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 bayt

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

Girdi olarak dizelerin bir listesini alır. Temelde onun Jelly cevabında Dennis ile aynı yaklaşımı kullanır.

Yorum ve açıkladı

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

f =: magic over maxes

Orta adımlar:

   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? 

Test durumu

   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 bayt

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

Dizeleri bir dizi olarak girdi alır.

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 bayt

,FSe)s\#ch

Burada dene!

Jelly Limanı cevabı

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

1

C # 157 122 Bayt

Milk sayesinde 35 baytlık golf attı - yemin etsem daha önce denedim.

Girişi 2 boyutlu karakter dizisi olarak alır.

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 bayt:

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');}

Bunun Trim()yerine çalışmamalı mıyım TrimEnd()? Daha da iyisi, sana kullanarak bayt bir çok kurtarabilir miyiz s [0] çıkış var olarak ve kullanma return new string(s[0],0,i)nerede ison kod karakterin endeksidir. Bu fikir foryerine iki döngü gerektirebilir foreach, daha çok düşüneceğim ve bugün daha sonra gerçek kodu yazmaya çalışacağım.
süt

Trim()Geçerli olamayacağına inanıyorum ki baştan itibaren kırpacağım. Ayrıca başlangıçta s [0] 'ya yüklüyordum ve i;sonunda bayt eklediğine inanıyorum ki döngünün dışına int kullandım (geri
dönüşde

1

Pyth, 11 bayt

PhceCSMCQ\#

STDIN'deki bir dizge listesinin girişini alan ve bir dizge basan bir program.

Çevrimiçi deneyin

Nasıl çalışır

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 bayt

: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,...$,,

Giriş sonunda yeni bir satır gerektirir.
Bunu biraz daha golf oynayabileceğime eminim, ama şimdilik işe yaradığı için mutluyum.



0

Jöle , 27 bayt

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

TryItOnline'da test edin

En katı belirtimi kullanır - yorum karakterinden önceki fazlalık boşluk bir bayt pahasına kaldırılır.

Giriş, dizelerin bir listesidir.


@ Golfçü Erik - belki öyleyse, ama bana burada bana verdiği ezme gördün mü ?
Jonathan Allan,


0

TSQL, 216 175 bayt

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('%_#%',@))

Keman


0

Javascript, 56 34 bayt, rakipsiz

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

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

@ N̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳'nin belirttiği gibi, ilave alanlar için hazır değilim


"Ekstra alanlar için hazırlan" davasını
geçmedi

0

Dyalog APL , 22 bayt

İlham .

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

(

⎕UCS karakter gösterimi

¯2↓ hepsi hariç son ikisi

⍳∘35↑ parantez dışında olan ilk 35 ("#") konumuna kadar, alınan

parantez dışında olan

) yani...

⌈⌿ sütunlu azami

arasında

⎕UCS Unicode değerleri

TryAPL çevrimiçi!


Kaç bayt
saat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.