OOo CODE temasını tercüme et


46

OOo CODE ile yazılmış bir programın girişi göz önüne alındığında , temsil ettiği BF kodunu çıkarın.

İşte o KOD'un nasıl çalıştığının kısa bir açıklaması:

  • İlk önce, alfabetik olmayan tüm karakterler kaldırılır (aralıkta olmayan her şey A-Za-z).

    Örneğin, programı alın PROgRam reVERsES giVeN iNPut sEqUENcE(tam olarak beklediğiniz şeyi yapan esolangs wiki sayfasında verilen bir örnek). Bu ilk adımdan sonra, şimdi sahibiz PROgRamreVERsESgiVeNiNPutsEqUENcE.

  • Daha sonra, kalan tüm karakterleri 3 gruba ayırın PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE. 1 veya 2 karakterden oluşan bir izleyen grup varsa, atın.

  • Aşağıdaki tabloya dayanarak her 3 harften oluşan grubu BF komutuna dönüştürün:

    ooo  >
    ooO  <
    oOo  [
    oOO  ]
    Ooo  -
    OoO  +
    OOo  .
    OOO  ,
    

    Yani, bir grubun ilk harfi küçük harf, ikincisi büyük harf ve üçüncüsü küçük harf ise, komuta çevrilir [.

    Örneğimizde, bu nihayet ,[>,]<[.<]+girdilerini tersine çeviren BF programı haline geldi .

Bu olduğundan, bayttaki en kısa kod kazanır.

Test durumları:

<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+

26
OOo cevabı olan birini bekliyorum ...
Glorfindel 19

17
@ Glorfindel: Mecburiyete memnun oldum .
nneonneo,

Yanıtlar:


127

oOo, 1569 1515 bayt

Yapılmak zorunda. Burada dene .

golfed:

oooooooooOoOoooooooooooooooOoOooooooOOOoOoooooooOoOOoOOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOoooOoOOoOOoOOoOOoOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooooooOoOoooOOooOooOoOOooOoOoOooooOooOooOooOooOooOooOooOooOooOooOOoOoooooooooooooooooooooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooOooOooOooOooOooOooOooOooOOoOooooooooooooOoOoooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOooOooOooOooOooOooOooOoOoooooOooooooooooooooooOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOooOooOoOoooooOoooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOooooooOOooOoOooooOoOooooOooooOooooOooOOoooooOoooOOooOoOoooooooOoOooOooOOoooOOooOOoooOOooOOooooooOOooOoOooooOoOooooooooooooOoOOoOOoOOoOoOoooOOoOOoOOoOOoOoooOoooOOooOooOooOoOooooooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOooooOoOOoOooOooOOoooooOoooOOooOoOoOoooOOooOOooooooOOooOoOooooOoOooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOoooOOooOOoooOOOoOooooooooooooOOooOoOoooOOooOooOooOooOooOOooooOOooooOOoooOOoOOooooooooooooooooooooooooOoOooooooOOOoOO

Brainfuck'a çevrilmiştir (netlik için çizgi çubuklarıyla):

>>>+>>>>>+>>,[>>++++++++[<++++++++>-]<+<[->-[>]<<]<[->+>[->+<]>+>>+++++[<+++++>-
]<++<[->-[>]<<]<[->+>[->+<]>+>+++++++<[->-[>]<<]<[->+>[->+<]>+>>+++++[<+++++>-]<
++<[->-[>]<<]<[->>[-]<<]<[-<<<<<<<<<<<+>>>>>>>>>>>>>>[-]<<<<]]<[->>>[-]<<<<]]<[-
<<<<<<<<<+>>>>+>>>>>>>>[-]<<<<]]<[->>>[-]<<<<]<<<<<<<[>[>>>>>++++++[<+++++++>-]<
++<<<[>[>[<->-]<[>>++<<-]<->]<[>+>[>-<<->-]<[>>+<<-]<-]<->]<[>+>>>>++++[<++++>-]
<<<[>>>+++++[<++++++>-]<+<[>++<<->-]<[-]<->]<[>+>[<->-]<[>>++<<-]<-]<-]+>>>>.[-]
<<<<<-<-<-]]>>>>>>>>+>>,]

Açıklama ile Ungolfed:

this progrAm Translates ooo codE tO brainfUCK cOde. i guesS sINcE ThE ExAMpLE
tEXt WAs SeLf-doCUmENtINg, I ShOUlD PrOBaBLy Make This SElf-DOcUmeNtInG too.

oh, I shoUld menTIon ThaT i WRotE tHe OriginAl BrainFuCk code EnTirElY By haNd.
If you waNt TO sEE tHE bRAiNfUck cODe, RUn THiS PrOGrAm wiTh itSElf AS iNPuT!

baSiCaLly, thiS proGram seTS up MemOrY As fOlLoWs: the fIrSt thrEe Bytes aRe
"ValId" FLags (V0, v1, V2), theN tHErE'S a BArRIeR (A 1) fOLlOweD bY tHree
"vaLue" bIts (b0, b1, b2). THe rEst Of THe aRrAy Is basiCaLly juSt ScratcH
sPacE. tO Save SpAce, i'm slIdINg THe POiNTeR fOrwaRD bY OnE In EAcH ItEratIon
uNTil THe POiNteR hItS the baRrieR, at whiCH poInt ThE ProGrAm Prints out tHe
ConvERteD chArACteR.

tHe ProgrAm eXteNsiVelY usEs tHe cLevEr "gReaTEr-Than" comparison operator
described by dheeraj ram aT
hTtp://sTAckOveRflOw.cOm/QUeSTioNs/6168584/BrAinfuck-comparE-2-nUmbeRS. i hAppEn
tO reAlLY lIKe tHiS iMplemEntAtiOn bEcaUse It iS boTh cOMpAct and nestablE,
wHich is critical for my bf code tO wOrk pROpeRly.

I seT up ThE ReQUisItE sTructure, then pErForm A BunCh oF neSteD cOMpaRisOns
ThaT loOk rOugHlY like tHis:

    if(in >= 65 /* capital a */) {
        if(In <= 90 /* CApITaL Z */) {
            vI = 1
            Bi = 1
        } ELsE {
            iF(in >= 97 /* lOWeRCaSE a */) {
                IF(iN <= 122 /* LoWErCAsE z */) {
                    vi = 1
                }
            }
        }
    }

At thE End OF tHEsE coMpaRisOnS, if the V (valid) Bit iS Set, the ProgRAm sTePs
the poiNtER rIghTwaRDs. if IT hiTS the barRIer, It Then gOeS into A big sEt of
nEstED condiTionALs tHaT test the AcCumUlaTEd vaLUe bITs, anD ConSTruct thE
CorReSpondInG character to pRiNT oUT. tHEn It ReseTS bACk TO tHE iNitiAl stATe.

fInaLly, It Reads anotheR iNPuT ChARaCTeR aNd goES bACk TO lOOpINg.

SO tHere You hAVe iT - An Ooo To BrainFuCK cOnvErtER writtEn in OOo (aNd
BrAinfUCk, bY ExtensiON!). siNcE i havE a Few moRe chARacterS to sPAre In This
progRaM, HeRe's A coUPle oF StrESs teST paTTernS:

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

İlginç meydan okuma için teşekkürler!


1
aman tanrım ... Bu epik! Aferin.
Rɪᴋᴇʀ

11
... VAY. Etkilendim. Meraklı için: goo.gl/vbh3h9 ( çevrimiçi olarak deneyin tam bağlantısı açık nedenlerden dolayı çok uzundu).
Doorknob

1
Golf oynadı / optimize edildi. Yeni deneme linki: goo.gl/ISjwLB
nneonneo

7
BU SİTEDE HİÇ KAZANMADIĞIM EN İYİ ŞEY
9

15
@Texenox Bu durumda, Programming Puzzles ve Code Golf'a hoş geldiniz! Eminim aklınıza gelen "gördüğüm en iyi şey" için
tartışacağını söyleyen

15

CJam, 36 35 bayt

l{el_eu-},'_f<0+3/W<2fb"><[]-+.,"f=

Burada test et.

açıklama

l               e# Read input.
{el_eu-},       e# Discard all characters that don't change in a lower/upper case
                e# transformation, i.e. non-letters.
'_f<            e# Compare with '_' to determine case as 0 or 1.
0+              e# Append a zero.
3/              e# Split into chunks of 3.
W<              e# Discard last chunk.
2fb             e# Convert each chunk from base 2.
",.+-][<>"f=    e# Select the corresponding character for each chunk.

Bir değer ekleyin ve son parçayı atın: zeki!
Luis Mendo

Ahh, bu gerçekten zekice
Adnan,

9

JavaScript (ES6), 94 93 91 85 84 83 bayt

@ Dev-null sayesinde 1 bayt kaydedildi

x=>x.replace(/[a-z]/gi,c=>(a+=c<'a'|0)[2]?b+="><[]-+.,"['0b'+a-(a="")]:0,a=b="")&&b

Bunun birçok çeşidini denedim, ama bu en kısa gibi görünüyor. Ayrıca boş girişte de çalışır!

Nasıl çalışır

Öncelikle, girişteki x.replace(/[a-z]/gi,c=>her harfi aldığımızı görüyoruz c. Biz set ave bkarşı ""fonksiyon saniyede geçmiş herhangi bir parametreyi yok sayar beri, işlev çağrısı diğer ucunda. aşu anda hangi karakteri yaptığımıza karar vermek için bir ikili string bkaydedecek ve sonucu kaydedecektir.

Şimdi kafa karıştırıcı kısmı için: birincisi, ile (a+=+(c<'a')), bir ekleme 0için aeğer cbüyük harf olduğu; 1aksi takdirde. Bu ifade yeni değerini döndürür a, bu yüzden indeks 2'deki karakterin olup olmadığını kontrol ederek üç uzunluğa ulaşıp ulaşmadığını kontrol edebiliriz [2]?. Olmazsa, sadece fonksiyonu ile sonlandırırız :0.

Eğer aşimdi uzunluğunda üç karakter, bu arasındaki ikili sayıdır 000ve 111. Bunu, basamağa ekleyerek "0b", ardından motoru bir sayı olarak ayrıştırmaya zorlayarak ondalık sayıya dönüştürebiliriz '0b'+a-0.

Ancak, yine ade boş dizgiye sıfırlamamız gerekiyor . Biz sadece yapamaz '0b'+(a="")-0o ayrıştırılmış dize adildir anlamına gelecektir çünkü 0b. Neyse ki, bir sayı olarak ayrıştırıldığında, boş dize 0 olur, böylece 0ile değiştirebiliriz (a="").

Şimdi bizim numarasına sahip ve sadece o dizinde karakteri ekleyebilirsiniz "><[]-+.,"için b. Değiştirme tamamlandıktan sonra, &&bonu işlevden döndürmek için kullanırız . (Eh, sonucu .replaceboş değilse , bu yalnızca boş girişte olur ve boş dizgeyi yine de döndürür.)


Güzel bir bayt ile kaydet: '0b'+a-0vs +`0b${a}`ve+("0b"+a)
andlrc 22

Yani replacesonuçta kazanır!
Neil

@Neil Yea seni takip ettiğim için üzgünüm match...
andlrc

Son sürümün önde gelen harf olmayanlarla sorunları var mı?
Neil

@Neil Haklısın. Neyse ki, çalışmayandan bir numara kullanarak çalışma sürümünün bir baytını atmayı başardım.
ETHProductions

8

05AB1E , 35 32 bayt

Kod:

á0«3÷\)vyS).uïJC",.+-][<>"Sr@?)\

Martin Büttner'den çok zekice bir numara kullanarak, bu cevabından . Açıklama:

á0«                               # Remove all non-alphabetic characters and append a zero
   3÷\                            # Split into pieces of 3 and discard the last one
      )v                          # Wrap everything into an array and map over it
        yS).uï                    # Is uppercase? Converts AbC to [1, 0, 1]
              JC                  # Join and convert from binary to int
                ",.+-][<>"        # Push this string
                          S       # Split the string
                           r@     # Reverse the stack and get the character from that index
                             ?    # Pop and print without a newline
                              )\  # Wrap everything into an array and pop

Çevrimiçi deneyin!

CP-1252 kodlamasını kullanır .


8

Retina , 79 75 71 70 bayt

1 byte tasarruf için randomra teşekkürler.

i`[^a-z]

M!`...
m`^
;
+`(.*);(.)
$1$1$2;
T`l
.+
$.&
T`d`_><[]\-+.,
¶

Çevrimiçi deneyin!

açıklama

i`[^a-z]

Mektup olmayan her şeyi kaldırarak başlıyoruz.

M!`...

Bu, (örtüşmeyen) 3 karakterli tüm eşleşmeleri döndürerek dizgiyi üç karakterlik parçalara böler. Bu, tamamlanmamış izleyen parçaları otomatik olarak atar.

m`^
;

;Her satıra a bağımlı . Base-2 dönüşümü için bunu bir marker olarak kullanacağız. Konu açılmışken, biz sadece büyük harfler olarak tedavi edeceğiz 1ve harfleri küçük harf 0.

+`(.*);(.)
$1$1$2;

Bu komik bir temel-2 unary dönüşüm yapar. Her adımda soldaki karakterleri iki katına ;çıkarır ve ;birini sağa taşırız. Bu neden işe yarıyor? Küçük harf 0ve büyük harf olarak yorum yapacağımızı unutmayın 1. Bir mektubu ne zaman işleme koyarsak, şu ana kadar toplam (soldaki) toplamı iki katına çıkarırız - çift küçük harfler 2*0=0tam anlamıyla yok sayılabilir ve büyük harfler çift sayıyı temsil eder, bu yüzden iki katına çıkar. ne istiyoruz. Ardından geçerli harfi, temsil eden 0veya 1buna karşılık gelen çalışan toplama ekleriz .

T`l

Tüm küçük harfleri / sıfırları kaldırın.

.+
$.&

Her satırı eşleştirin ve o satırdaki (ondalık) karakter sayısıyla değiştirin. Bundan dolayı ;, tek sayıyı ondalık eşdeğeri + 1'e çevirir.

T`d`_><[]\-+.,

İlgili komutla 1-8'in yerine geçen harf çevirisi.

Satır beslemelerini çıkarın.


Üç karakterden oluşan parçalara ayırmanın akıllıca bir yolu. Bunu daha önce kullandın mı?
ETHProductions

@ETHproductions Sanırım var ama nerede olduğundan emin değilim. Ben düşünce olabilir codegolf.stackexchange.com/a/69518/8478
Martin Ender

Yeni eklenen Retina fikirlerime 70 byte ve biraz daha kısa .
randomra

@randomra ah için güzel bir fikir ;. Bunu sonra düzenlerim.
Martin Ender

7

MATL , 38 32 bayt

'><[]-+.,'jt3Y2m)3ZCtAZ)92<!XBQ)

Çevrimiçi deneyin!

'><[]-+.,'      % push string with BF commands
j               % read input as a string
t               % duplicate
3Y2             % predefined literal: string 'A...Za...z'
m               % true for elements of input string that are letters
)               % index into input string to keep only letters
3ZC             % 2D array whose columns are non-overlapping slices of length 3.
                % The last column is padded with zeros if needed
tA              % duplicate. True for columns that don't contain zeros 
Z)              % keep those columns only. This removes padded column, if any
92<             % 1 for upper case letters, 0 for lower case letters in the 2D array
!               % transpose so each group of 3 is a row
XBQ             % convert each row from binary to decimal and add 1
)               % index into string containing the BF commands. Implicitly display

5

Japt, 37 36 bayt

Uo"%l" f'.³ £",><[]-+."gX®c ¤gJÃn2Ãq

Çevrimiçi test edin!

Nasıl çalışır

Uo"%l" f'.³ £  ",><[]-+."gX®   c ¤  gJÃ n2Ã q
Uo"%l" f'.³ mX{",><[]-+."gXmZ{Zc s2 gJ} n2} q

Uo"%l"      // Get rid of all non-letter chars in U.
f'.³        // Take each set of three chars in U.
mX{      }  // Map each item X in this group to:
XmZ{     }  //  Map each letter Z in X to:
Zc s2 gJ    //   Take the char code of Z as a binary string, and take the first char.
            //   This maps each character to 1 if it's UC, or 0 if it's lc.
        n2  //  Interpret the result as a binary number.
",><[]-+."g //  Get the item at this index in this string.
q           // Concatenate the result and implicitly output.

4

JavaScript (ES6), 111 95 bayt

s=>s.match(/[A-Z]/gi).map(c=>+(c<'a')).join``.match(/.../g).map(g=>'><[]-+.,'['0b'+g|0]).join``

Basitçe harfleri kaldırır, büyük harfleri 1s'ye ve küçük harfleri 0'lara dönüştürür, üçlü gruplara ayırır, 1 veya 2'nin sondaki bir grubunu yok sayar ve grupları çözer.

Düzenleme: @ dev-null sayesinde 16 bayt kaydedildi, ancak kod boş dizgiyi geçtikten sonra çalışmaz.


@ dev-null Ugh, match(/.../g).map().joinyaklaşımı denedim ama bayt sayısını yanlış saydım ve bana hiçbir şey kaydetmedi. Yine de ilk maçtaki bahşiş için teşekkürler.
Neil,

4

Python 3, 91 bayt

b=1
for c in input():
 b=-~c.isalpha()*b+c.isupper()
 if b>7:print(end="><[]-+.,"[b-8]);b=1

Hmm ... biraz uzun görünüyor, özellikle de ikinci satır. b=[b,2*b+(c<'a')][c.isalpha()]olsa biraz daha kötü.


2
Sonu böyle kullanmak gerçekten zekice. Bunu daha önce hiç görmedim.
Morgan Thrapp

3

Pyth, 40 bayt

jkm@"><[]-+.,"id2f!%lT3cm?rId0Z1f!rIT2z3

Burada dene!

Sonucu bir dizge yerine karakter listesi olarak çıkartabilirsem 2 bayt kurtarılabilir.

açıklama

Tüm harfleri filtreler, büyük harfleri 1'e ve küçük harfleri 0'a dönüştürür, 3'e bölünür, her öbeyi ikili sayı olarak yorumlar ve bunu BF komutlarını içeren bir dizgiye indeks olarak kullanır.

jkm @ "> <[] - +.," id2f!% lT3cm? rId0Z1f! rIT2z3 # z = giriş

                                T ile fz # filtre girişi
                                 ! # mantıklı değil
                                  rIT2 # T == swapcase (T), T bir harf değilse doğru
                        d ile m # harita filtre sonucu
                         ? rId0 # eğer d == toLower (d)
                              Küçük harf için Z1 # 0, büyük harf için 1
                       c 3 # 3 parçaya bölün, gerekirse son eleman daha kısa olur
                 T # ile f # filtre
                  ! # mantıklı değil
                   % lT3 # len (t) mod 3 -> yalnızca uzunluk 3 öğelerini korur
  d ile m # haritası
              id2 # İkiliden ondalıkya dönüştür
   @ "> <[] - +.," # Elde edilen BF komutunu alın
jk # Bir dizgeye katıl

3

Jolf, 31 34 bayt

Burada dene! Değiştir ile \x10ve ile \x05. Doğrama fonksiyonunu yanlış yaptığım için 3 bayt kazandım. :(

►ΜZeZcAAρi♣Epu1pl033d."><[]-+.,"ΙH
        ρi♣E                        remove all space in input
       A    pu1                     replace all uppercase letters with 1
      A        pl0                  replace all lowercase letters with 0
    Zc            3                 chop into groups of three
  Ze               3                keep groups of length three
 Μ                  d               map
                              ΙH   parse element as binary
                     ."><[]-=.,"    and return a member of that
►                                  join by nothing

3

Hoon , 212 bayt

=+([v=turn c=curr q=cold k=tape] |=(t/k `k`(v (v `(list k)`(need ((unit (list k)) p:(rose (murn t (c rush alf)) (star (stun [3 3] ;~(pose (q '0' low) (q '1' hig))))))) (c scan bin)) (c snag (rip 3 '><[]-+.,')))))

Ungolfed:

|=  t/tape
^-  tape
%+  turn
  %+  turn  ^-  (list tape)
  %-  need  %-  (unit (list tape))
    =+  t=(murn t (curr rush alf))
    p:(rose t (star (stun [3 3] ;~(pose (cold '0' low) (cold '1' hig)))))
  (curr scan bin)
(curr snag (rip 3 '><[]-+.,'))
  1. Girişte "alf" (alfabe) ile ayrıştırılamayan tüm karakterlerden kurtulmak için ++ murn kullanın
  2. Listeyi her seferinde her 3 karakteri çıkaran bir birleştiriciyle ayrıştırın, küçük harfleri '0' ve büyük harfleri '1' ile değiştirin
  3. Sonucu (birim (liste bandı)) olarak yayınla ve en uzak ayrıştırılmış sonucu elde etmek için zorla aç.
  4. Her grubu ikiliymiş gibi ayrıştırıp listeyi haritalayın
  5. Listedeki her sayıyı '> <[] - +.,' Metnine dizin olarak kullanın ve listeyi bir teybe geri verin.

Hoon'un düzgün düzenli ifadeleri yok, yalnızca bir ayrıştırıcı birleştirici kitaplığı var, bu yüzden ne yazık ki güzel. Ayrıca, tüm girdi akışı ayrıştırılmadığında ++ taraması da çöküyor, bu yüzden ++ rose kullanmam gerekiyor, bir birime zorlamak ve "en uzak ayrıştırma" değeri için paketini açmak zorundayım. Ayrıca listelerde (+ + turn) sıralamak ve haritalandırmak için de büyük fayda sağlar, bu yüzden fonksiyon isimlerini bir harf değişkenine kopyalarım.

Hoon, temiz bir kayrak yeniden uygulama projesi olan Urbit için programlama dilidir. Tamamen işlevsel, statik olarak yazılmış, belli belirsiz lisp benzeri ve Nock'a derler. Nock, ikili bir ağaç bignum bellek modelinin üstünde çalışan bir birleştirme tabanlı VM'dir.

Urbit'i başlattığınızda içine atılırsınız: dojo, shell ve Hoon repl. Parçacığı çalıştırmak için sadece şunu yazın:

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

ve bağımsız işlevi bir sonraki satıra yapıştırın.


PPCG'ye Hoşgeldiniz! Yanıtınız oldukça iyi açıklanmış, ancak bir tercümana ya da çevrimiçi olarak denemek için bir yere bağlayabilir misiniz?
Addison Crump,

Urbit'in github sayfasına bir link ekledim, çünkü onu inşa etmenin tek yolu bu. Bu yeterli mi?
RenderSettings,

Kesinlikle. : D Bunun tam bir programda nasıl kullanılacağına ilişkin talimatların bırakılması harika olurdu.
Addison Crump,

3

Jöle , 27 bayt

=Œs¬Tịµ=Œu;0s3ṖḄ€ị“<[]-+.,>

Çevrimiçi deneyin! İkinci sınama durumu için ters eğik çizgilerin giriş dizesinde kaçması gerektiğini unutmayın.

Implicit input: string s (list of characters)

=Œs             Compare with swapcase
¬               Not - this gives 1 for letters, 0 otherwise
Tị              Take characters at truthy indices
µ               Start a new monadic chain

Input: string s' (list of letters)

=Œu             Compare with uppercase
;0              Append 0
s3              Split into chunks of length 3
Ṗ               Pop last chunk
Ḅ€              Apply convert-from-binary to each chunk
ị“<[]-+.,>      For each number, 1-based index cyclically into the string "<[]-+.,>"

2

Matlab, 98 bayt

function t(s);s=s(isletter(s));s=s(1:end-mod(end,3));r='><[]-+.,';r([4 2 1]*reshape(s<92,3,[])+1)
  1. Temiz
  2. düzeltmek
  3. UC = 1, lc = 0 olan bir 3xn Matrix m'ye yeniden şekillendirme
  4. (4 2 1) * m + 1 indeks listesindedir
  5. Doğru karaktere indeksle

1

Perl, 76 73 72 + 1 = 73 bayt

$a.=y+A-Z++dfor/[A-Z]/gi;print substr"><[]-+.,",oct"0b$_",1for$a=~/.../g

-nBayrağı gerektirir :

$ perl -n oOo.pl <<< 'PROgRamr{}\eVERsESgiVeNiNPutsEqUENcE'
,[>,]<[.<]+

Temel-2 dönüşümüyle numarayı kullanmak .

Nasıl çalışır:

                          # '-n' auto read first line into `$_`
            for/[A-Z]/gi; # Iterate over all letters a-z
$a.=y/A-Z//d              # Count number of uppercase letters (1 or 0)

                                  for$a=~/.../g # Split $b into hunks of 3 characters. And
                                                # remove any potential trailing characters.
      substr"><[]-+.,",oct"0b$_",1              # `oct("0b$binary")` will convert binary
                                                # to decimal.
print

1

Julia, 107 bayt

s->"><[]-+.,"[map(j->parse(Int,j,2)+1,[map(i->i<'_'?'1':'0',m)for m=matchall(r"\w{3}",filter(isalpha,s))])]

Bu, bir dizgeyi kabul eden ve bir dize döndüren adsız bir işlevdir. Aramak için değişkene atayın.

Ungolfed:

function f(s)
    # Brainfuck commands
    bf = "><[]-+.,"

    # Filter out non-alphabetic characters from the input
    chars = filter(isalpha, s)

    # Get all non-overlapping groups of three characters
    groups = matchall(r"\w{3}", chars)

    # Construct binary strings by comparing to _
    binary = [map(i -> i < '_' ? '1' : '0', m) for m = groups]

    # Parse each binary string as an integer and add 1
    indices = map(j -> parse(Int, j, 2) + 1, binary)

    # Return the Brainfuck commands at the indices
    return bf[indices]
end

1

Lua, 120 Bayt

string.gsub()Burada büyük bir kullanım , bir kez daha bazı bayt kazanmak için bu fonksiyon üzerinde bir karakter işaretçisi yaratmama izin verebilirdi. Ayrıca, boşluk bırakmadan ilk lua programım! : D

Bu program girişini komut satırı argümanı ile alır ve bir satır başına bir komut olan BrainFuck programını çıkarır.

Düzenleme: @Oleg V. Volkov sayesinde 1 Bayt kaydedildi

arg[1]:gsub("[%A]",""):gsub("%l",0):gsub("%u",1):gsub("...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)

Ungolf ve açıklamalar

arg[1]:gsub("[%A]","")    -- replace the non-letter character by an empty string
                          -- %A matches all the character not in %a (letters)
:gsub("%l",0)             -- replace lower case letters by 0s
:gsub("%u",1)             -- replace upper case letters by 1s
:gsub("...",function(c)   -- iterate over all groupe of 3 characters
  x=tonumber(c,2)+1       -- convert the 3-letter group from binary to decimal
  print(("><[]-+.,")      -- output the corresponding brainfuck command
             :sub(x,x))   
end)

Tek bir satır içine alma üzerinde bayt kaydedebilirsiniz bdaha tasarruf ve bir string.gsubkısa var ve elle kendisine ilk argümanları katlama:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Oleg V. Volkov

... belki de bayt sayımını katlamada yanlış okudum. Inlining hala çalışıyor.
Oleg V. Volkov

@ OlegV.Volkov Daha kısa bir var var tasarruf için ne yazık ki, daha, aynı şeyi ^^ denedim. Ve b
inline

1

Python 2, 112 bayt

''.join('><[]-+.,'[int('%d'*3%tuple(map(str.isupper,y)),2)]for y in zip(*[iter(filter(str.isalpha,input()))]*3))

Daha çok golf oynamaya çalışacağım.


1

Mathematica, 192 bayt

StringJoin[FromDigits[#,2]&/@Partition[ToCharacterCode@#-48,3]&[StringDelete[#,a_/;!LetterQ[a]]~StringReplace~{_?UpperCaseQ->"1",_?LowerCaseQ->"0"}]/.Thread[0~Range~7->Characters@"><[]-+.,"]]&

İstenen dizgiyi argüman olarak alan isimsiz işlev. (Oldukça basit) algoritmasında yer alan adımlar:

  1. Diziyi temizle
  2. UC'yi değiştir -> "1", lc -> "0"
  3. Diziyi ikili listeye çevirin
  4. Listeyi üç gruba ayırın ve her bir parçayı temel-2 sayısı olarak yorumlayın
  5. Numaraları uygun sembollerle değiştirin ve tekrar bir dizeye katılın.

1

Ruby 117 114 113 111 86 79 Bayt

gets.tr(?^+m='a-zA-Z','').tr(m,?0*26+?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
  • tr(?^+m='a-zA-Z','')m 'a-zA-Z'harfini ayarlar ve harfleri kaldırır
  • .tr(m,?0*26+?1) küçük harfleri 0'a, büyük harfleri 1'e dönüştürür
  • .scan(/.../) dizeyi 3 gruba ayırın ve 3'ten az olması durumunda son grubu atın.
  • {$><<"><[]-+.,"[$&.t‌​o_i 2]} Her ikili sayıyı bir karaktere dönüştür

Kullanamaz tr("a-zA-Z","01")mısın veya hattatr("A-Za-z",10)
andlrc

@ dev-null "AAz".tr("a-zA-Z","01")verir111
FuzzyTree

1
Burada yapılabilecek çok şey var. Bu bir başlangıçtır: gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}(86 bayt). Komut satırı seçeneğinden girdiyi stdin'e değiştirdi; çıktıdaki çevre tırnaklarını düzeltti (ancak şimdi sonunda yeni bir satır yok)
daniero

@ daniero teşekkürler! bunu bir topluluk cevabı yaptı. değişiklik yapmaktan çekinmeyin
FuzzyTree

1
tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)daha kısa
Charles

1

Perl 6, 81 bayt

Bu muhtemelen daha iyi yapılabilir, ama bu benim başarım

{m:g/:i<[a..z]>/;[~] ("><[]-+.,".comb[:2[$_]]for (+(91>$_.ord)for |$/).rotor(3))}

kullanım

> my &f = {m:g/:i<[a..z]>/;[~] ("><[]-+.,".comb[:2[$_]]for (+(91>$_.ord)for |$/).rotor(3))}
-> ;; $_? is raw { #`(Block|149805328) ... }
> f("PROgRamreVERsESgiVeNiNPutsEqUENcE")
,[>,]<[.<]+

Ungolfed

sub oOo ($_) {
    m:g/:i<[a..z]>/;  # Match all letters and put them in $/

    my @digits = (                
        for |$/ -> $c {           # For all $c in $/
            +(91>$c.ord)          # 1 if $c.ord < 91 else 0
        }
    );
    @digits.=rotor(3);            # Split the digits into chunks of 3

    my @chars = (
        for @digits -> @l {
            "><[]-+.,".comb[:2[@l]] # Take the character from "><[]-+.,"
                                    # at an index given by converting 
                                    # @l (a list of 3 binary digits)
                                    # from base 2 to base 10
        }
    );
    @chars.join # Join the list of chars into a string and return
}

1

C ++, 173 167 bayt

Tam program, golf oynadı (standart girdiden okundu):

#include <cstdio>
main(){for(char*a="@[`{>-[.<+],",c,o=0,t=1;(c=getchar())>0;)if(c=c>*a&&c<a[1]?2:c>a[2]&&c<a[3]?1:0){o|=c>1?t:0;t*=2;if(t>4)putchar(a[o+4]),o=0,t=1;}}

Biraz unungolfed:

#include <cstdio>
main(){
    for(char*a="@[`{>-[.<+],",c,o=0,t=1;(c=getchar())>0;)
        if(c=c>*a&&c<a[1]?2:c>a[2]&&c<a[3]?1:0){
            o|=c>1?t:0;
            t*=2;
            if(t>4)putchar(a[o+4]),o=0,t=1;            
        }
}

Not o @A... Z[ASCII ve aynı şekilde için `a... z}.




0

Pyke, 31 bayt, rekabetçi olmayan

Pyke mücadeleden daha eski, fakat daha rekabetçi - chunk fonksiyonu için bazı özellikler ekledim. Aynı numarayı @Martin Büttner'ın kullandığı gibi kullandım.

#~l{)\`Lm<0+3cFb2"><[]-+.,"@)st

Burada dene!


0

JavaScript, 148 bayt

function a(s){function b(c){return c.charCodeAt()&32}return (l=(s=s.replace(/[^a-z]/gi)).substr(3))?",.+-][<>"[b(s[0])*4+b(s[1])*2+b(s[2])]+a(l):""}

0

TI-BASIC, 311 288 bayt

Ne, TI-BASIC cevap yok mu? Düzeltme zamanı geldi!

Ans→Str1:" →Str2:" →Str6:"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str4:For(S,1,length(Str1:sub(Str1,S,1:If inString(Str4+"abcdefghijklmnopqrstuvwxyz",Ans:Str2+Ans→Str2:End:sub(Str2,2,length(Str2)-1→Str2:For(B,1,.1+3⁻¹length(Str2:sub(Str2,3B-2,3→Str3:1+sum({4,2,1}seq(0≠inString(Str4,sub(Str3,X,1)),X,1,3→L₁(B:End:For(C,1,.1+dim(L₁:Str6+sub("><[]-+.,",L₁(C),1→Str6:End:sub(Str6,2,length(Str6)-1→Str6

Girdi olduğu oOo kod Ans.
Çıktı çevrilen BF kodudur.

Örnekler:

"AbcDef
AbcDef
prgmCDGF18
--
"PROgRam reVERsES giVeN iNPut sEqUENcE
PROgRam reVERsES giVeN iNPut sEqUENcE
prgmCDGF18
.[>,]<[.<]+
"AbcDe
AbcDe
prgmCDGF18
-

Un-golfed:
(Yeni satırlar ve yorumlar eklendi)

Ans→Str1                                                   ;store the input in "Str1"
" →Str2                                                    ;set "Str2" and "Str6" to a
" →Str6                                                    ; space character
                                                           ; (needed b/c TI-BASIC doesn't
                                                           ;  like concatenating empty
                                                           ;  strings)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str4                           ;store the uppercase alphabet
                                                           ; in "Str4"
For(S,1,length(Str1                                        ;loop over the input string
sub(Str1,S,1                                               ;get the current character
If inString(Str4+"abcdefghijklmnopqrstuvwxyz",Ans          ;if the character is in either
                                                           ; the uppercase or lowercase
                                                           ; alphabet
Str2+Ans→Str2                                              ;add it to "Str2", the code
                                                           ; string
End
sub(Str2,2,length(Str2)-1→Str2                             ;remove the space added earlier
For(B,1,.1+3⁻¹length(Str2                                  ;loop over each 3-char substring
                                                           ; and skip any extra chars
                                                           ; (.1 is added to force one
                                                           ;  loop)
sub(Str2,3B-2,3→Str3                                       ;store said substring in "Ans"
1+sum({4,2,1}seq(0≠inString(Str4,sub(Str3,X,1)),X,1,3→L₁(B ;convert to the respective
                                                           ; index in "><[]-+.,"
                                                           ; (1-indexed)
End
For(C,1,.1+dim(L₁                                          ;loop over each index
                                                           ; (.1 is added to force one
                                                           ;  loop)
Str6+sub("><[]-+.,",L₁(C),1→Str6                           ;add the char to the translation
                                                           ; string
End
sub(Str6,2,length(Str6)-1→Str6                             ;remove the added space and
                                                           ; store the result in "Str6"
                                                           ; and "Ans"
                                                           ;implicit print of "Ans"

Notlar:

  • TI-BASIC belirtilmiş bir dildir. Karakter sayısı bayt sayısına eşit değil .
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.