Basit golf tercümanı


13

Meydan okuma:

İşiniz basit bir golf dili için basit bir tercüman yaratmaktır.


Giriş:

Girdi, boşluklarla ayrılmış dize biçiminde olacaktır.

Alan ayrımını istediğinizle değiştirebilirsiniz


Çıktı:

Tüm işlemleri yaptıktan sonra elde edilen sonucu (sayı veya dize) çıktılayın. Birden fazla çıktı varsa, tek bir sonuç vermek için bir araya getirin (ayırıcı yok). Değişkenin başlangıç ​​değeri her zaman sıfırdır. ie: Şuradan başlar0


Dil Sözdizimi:

Dilin aşağıdaki operatörleri vardır:

inc  ---> add one to variable
dec  ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri  ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)

Örnekler:

inc inc inc dec Pri exit                 ---> 2
dec inc mult inc inc Pri                 ---> 2
inc inc inc mult half Pri exit inc       ---> 3
inc Pri inc Pri inc Pri exit half mult   ---> 123
Pri exit                                 ---> 0
inc half Pri exit                        ---> 0.5 

Kısıtlama:

Bu kod golf yani her dil için bayt en kısa kod kazanacak.


Not:

  • Giriş her zaman geçerli olacaktır. (boşlukla ayrılmış operatör dizisi)
  • Ondalık basamak istemiyorsanız en yakın tam sayıya yuvarlayabilirsiniz.

3
Dizelerin bir listesini alabilir miyim? Başka bir büyük harf kullanabilir miyim?
user202729

Çıkış durumu eklensin mi? çıkış önemli
l4m2

1
@Kaldo: Yeni hatlar kullanarak ayrılabilirsiniz
Muhammad Salman

3
Hmm, bu dile "golf dili" demezdim.
Paŭlo Ebermann

1
Bu kare ve daha uzun komut isimleri yerine çift buçuk ile Deadfish
Jo King

Yanıtlar:


8

Bash , 61 bayt

sed '1i0
s/.//2g;y"idmhe"+-*/q";/+\|-/i1
/*\|\//i2
/P/cdn'|dc

Çevrimiçi deneyin!

Programı bir dc programına dönüştürür, sonra da dc kodu olarak değerlendirir. Bu, girdiyi satır satırlarıyla ayırarak alır. DC'nin yığın tabanlı olduğunu ve ters lehçe gösterimi kullandığını unutmayın.

Giriş ilk önce sed

1i0 girişin ilk satırında bir 0 ekleyin (başa ekleyin), bu akümülatör olacak

s/.//2g her satırdaki ilk karakter hariç her şeyi kaldır

y"idmhe"+-*/q"transliterasyon idmheiçine +-*/qsırasıyla + - * / aritmetik komutları ve q programı çıkar

/+\|-/+ veya - içeren her satıra i1bir 1 ekleyin

/*\|\//* veya / içeren her satıra i22 ekleyin

/P/P içeren her satırda, DC'de newline olmadan çoğaltmaya ve çıktıya eşdeğer olarak cdndeğiştirindn

Şimdi bu bir dc ifadesi olarak değerlendiriliyor.


2
sedGolf söz konusu olduğunda sözdiziminin daha önce düşünülenden daha yabancı olmasını beklemenin mantıksız olmadığını düşünüyorum.
Mateen Ulhaq

6

Jöle , 21 bayt

ḲḢ€O%11ị⁾’‘j“IȮḤH”¤VI

Çevrimiçi deneyin!


İlk karakterlerin ( idmhPe) modulo 11'in ASCII değerlerinin benzersiz modulo 6 olduğunu unutmayın.


Modulo 16'yı kullanma:

Jöle , 21 bayt

ḲḢ€O%⁴ị“ḢwġḞkz’ṃØJ¤VI

Çevrimiçi deneyin!

ḤH‘’IȮBu durumda dizin oluşturmak için kullanılan dize . ‘’Artık sınırları vardır.


6 baytlık bir dizeyi temsil etmek için 11 bayt kullanmak ... çok kötü. Ama ... “”2 bayt, ¤1 bayt, verinin kendisi 6 bayt, bir şey yapmak için 2 bayt kaldı. Şu anda ve j, ama ịØJveya ṃØJçok daha kötü ve çalışmıyor (çünkü Unicode).
user202729

jli'nin dize konsepti ("Dize, baskıyı etkilemek için özel bir bayrağı olan tamsayıların bir listesidir") harika.
user202729

5

R , 128125 bayt

Reduce(function(x,y)switch(y,i=x+1,d=x-1,m=x*2,h=x/2,P={cat(x);x}),substr(el(strsplit(gsub("e.*$","",scan(,""))," ")),1,1),0)

Çevrimiçi deneyin!

source(echo=FALSE)Dönüş değerinin otomatik olarak yazdırılmasını önlemek için ile çağrılmalıdır . Alternatif her şeyi sarmakinvisible olurdu ama bu çok daha az golfy (ve benim [hala] güzel bayt sayısı mahveder).


3

05AB1E , 25 bayt

΀¬"idmhPe"S"><·;=q"S‡J.V

Çevrimiçi deneyin!

Dil işlevinin her birini karşılık gelen 05AB1E işleviyle eşleştirir (her işlevin ilk karakterini kullanarak) ve sonra da elde edilen dizeyi 05AB1E kodu olarak yürütür.


2

Kırmızı , 121 bayt

func[s][v: 0 parse s[any[["i"(v: v + 1)|"d"(v: v - 1)|"m"(v: v * 2)|"h"(v: v / 2.0)|"P"(prin v)|"e"(exit)]thru" "| end]]]

Çevrimiçi deneyin!

Okunabilir:

f: func [s] [
    v: 0
    parse s [
        any [
            [ "i" (v: v + 1)
            | "d" (v: v - 1)
            | "m" (v: v * 2)
            | "h" (v: v / 2.0)
            | "P" (prin v)
            | "e" (exit)]
            thru [" " | end]
        ]
    ]
] 

2

Python 2 , 131 125 122 121 118 117 115 bayt

v=0;o=""
for x in input().split("x")[0].split():
 if"Q">x:o+=`v`
 else:v+=(1,-1,v,-v/2.)['idmh'.find(x[0])]
print o

Çevrimiçi deneyin!

@Rod sayesinde -6 ve -3

@Etene sayesinde -3 ve -2

-1 değiştirerek "Pri"==xile"P"in x


yapabilecekleriniz splitüzerinde "exit"ve bunun yerine, 1 blok almak breaking 4 bayt tasarrufu
Çubuk

1
Parantezleri kaldırabilir 'idmh've findbunun yerine kullanabilirsiniz index, bu da birkaç bayt kurtaracaktır
etene

@Rod - aslında biraz daha ileri alabilir ve exbaşka bir 2 kurtarmak için bölünmüş
ElPedro

Sen yerini alabilir v=(v+1,v-1,v*2,v/2.)ile v+=(1,-1,v,-v/2.)çalışması gerekir, gerçi test etmedi
Çubuk

@ Çubuk - bunu düşündüm ama nasıl yapılacağını çözemedim half. Çok basit! Teşekkürler.
ElPedro

2

Python 3 , 110 91 82 bayt

exit programın bir hata ile çıkmasına neden olur.

x=0
for c in input():c=='P'==print(x,end='');x+=(1,-1,x,-x/2,c,0)['ndmhx'.find(c)]

Çevrimiçi deneyin!


9 bayt tasarruf etmek için değişken adlarınızı kısaltın. i='x+=1';d='x-=1';...ve daha sonra execçağrınızda değiştirinexec(eval(c[0]))
mypetlion

@ mypetlion Teşekkürler, ama daha iyi bir yol buldum.
mbomb007

Bunun geçerli olduğunu düşünüyorum: 82 bayt
Lynn

@Lynn Harika! printAçıklamaya kısa devre yapmak için iyi bir yol düşünemedim !
mbomb007

2

JavaScript (ES6), 83 79 bayt

@ L4m2 sayesinde 4 bayt kaydedildi

Talimatları, çıkış veya boş dizelerle değiştirerek değiştirir.

s=>s.replace(/\S+./g,w=>m<s?'':w<{}?m:(m+={d:-1,e:w,i:1,m}[w[0]]||-m/2,''),m=0)

Çevrimiçi deneyin!

Yorumlananlar

s =>                       // given the input string s
  s.replace(/\S+./g, w =>  // for each word w in s:
    m < s ?                //   if m is a string:
      ''                   //     ignore this instruction
    :                      //   else:
      w < {} ?             //     if w is 'Pri' ({} is coerced to '[object Object]'):
        m                  //       output the current value of m
      : (                  //     else:
          m +=             //       add to m:
            { d: -1,       //         -1 if w is 'dec'
              e: w,        //         w  if w is 'exit' (which turns m into a string)
              i: 1,        //         1  if w is 'inc'
              m            //         m  if w is 'mult'
            }[w[0]]        //       using the first character of w to decide
            || -m / 2,     //       or add -m/2 (for 'half') if the above result was falsy
        ''),               //       do not output anything
    m = 0                  //   m = unique register of our mighty CPU, initialized to 0
  )                        // end of replace()

s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
l4m2

@ l4m2 Bu w<{}saf kötülük: p
Arnauld

s=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)ayrıca çalışma
l4m2 28:18

2

Kömür , 37 35 bayt

≔⁰ηF⎇№θx…θ⌕θxθ≡ιn≦⊕ηd≦⊖ηm≦⊗ηh≦⊘ηrIη

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. @ RickHitchcock'un cevabından ilham alındı. Açıklama:

≔⁰η

Değişkeni temizleyin.

F⎇№θx…θ⌕θxθ≡ι

xVarsa girişi kesin , sonra döngüyü döndürün ve girişin (geri kalanının) her karakterini açın.

n≦⊕η

ni n değişkeni yok eder.

d≦⊖η

d d değişkeni ekler.

m≦⊗η

m m değişkeni ikiye katlar (yani iki katına çıkar).

h≦⊘η

h h değişkeni değiştirir.

rIη

rp r değişkeni dizeye dönüştürür.


1
@ RickHitchcock Üzgünüm, bunu yeterince test etmedim. Bir çözüm buldum ama bana bir bayt maliyeti.
Neil

2

JavaScript (ES6), 77 75 bayt

(Ödünç alındı ​​( çaldı ) @ Arnauld'un mdeğişken ad olarak kullanma hilesi, 2 bayt tasarruf.)

f=([c,...s],m=0)=>c<'x'?(c=='P'?m:'')+f(s,m+({h:-m/2,d:-1,n:1,m}[c]||0)):''

Her bir komut için ayrı harfler arayan ve gerisini görmezden gelen dizeyi tekrar tekrar yürür:

  • n: inc
  • d: aralık
  • m: çoklu
  • h: yarım
  • P: Pri
  • x: çıkış

Aslında yararlanır undefineddaha ne az ne büyüktür 'x'dizenin sonunda durağına özyineleme neden ya da karşılaştığında 'x'içinde çıkışında .


1
Artık cevaplayamadığım silinen yorumunuzu takiben, düzeltilmiş kodun (d'oh!) Bağlantısını yapıştırmayı unuttum, ancak yine de orijinal denememden 2 bayt daha kısa olan yeni bir yaklaşım buldum.
Neil



1

JavaScript, 107 bayt

s=>eval('x=0;x'+(s.split` `.map(v=>({i:"++",d:"--",m:"*=2",h:"/=2",P:";alert(x)",e:"//"})[v[0]]).join`;x`))


1

Lua, 207 bayt

s=0;n=0;for a in io.read():gmatch'.'do if s==0 then s=1;n=a=='i'and n+1 or a=='d'and n-1 or a=='m'and n*2 or a=='h'and n/2 or n;if a=='P'then print(n)elseif a=="e"then break end elseif a==' 'then s=0 end end

1

Python 3 , 114 110 109 116 bayt

Aslında execbir deyim olduğu ve parantez gerektirmediği için Python 2'de iki bayt daha az alacaktı ...

  • @ElPedro sayesinde 4 ekstra bayt tasarruf etti

  • findHata durumunda -1 döndüren ve daha sonra bir dizin olarak kullanılabilen gerçeğinden yararlanarak fazladan bir bayt kaydetti

  • Yeni satır içermeyen kuralını fark etmediğim için +7 bayt :(

i=0;exec(";".join("i+=1 i-=1 i*=2 i/=2 print(i,end='') exit()".split()["idmhP".find(h[0])]for h in input().split()))

Çevrimiçi deneyin!

Her giriş sözcüğünün ilk karakterini bir Python koduyla eşler. Bunlar daha sonra birleştirilir ve execdüzenlenir.

Muhtemelen biraz daha golf olabilir oldukça basit bir yaklaşım. Zorluk çoğunlukla olası birçok formdan en kısa formunu bulmakta yatar ...


112 Çevrimiçi deneyin! komutları boşlukla ayrılmış dize olarak ayırır ve bölerseniz.
ElPedro

1
Aslında köşeli parantezler 110 gibi online deneyin!
ElPedro

Bu doğru çıktı vermez. Soru, ayırıcı olmadan yazdırmanız gerektiğini söylüyor, bu yüzden ihtiyacınız var print(i,end=''). 4. test senaryosuna bakın.
mbomb007

Fark etmemiştim, düzeltirim. Teşekkürler !
etene

@etene Bunu düzelttiğinizde yorum yapın ve downvote'umu kaldıracağım.
mbomb007

1

Ruby + -na, 81 73 65 bayt

x=0;$F.map{|w|eval %w{x+=1 x-=1 1/0 $><<x x*=2 x/=2}[w.ord%11%6]}

Çevrimiçi deneyin!

Oldukça basit. Her kelimenin ilk harfi için, karşılık gelen komut dizesini ve evalonu bulun . Tamsayı bölümünü kullanır ve exitsa ZeroDivisionError.

-5 bayt: .ord%11%6Dize araması yerine kullanın . Kredi kullanıcıya gidiyor202729

-3 bayt: .ordsadece dizenin ilk karakterini dikkate alır, bu yüzden bir atlayabilirsiniz [0].

-8 bayt: Kirill L-a sayesinde girişi otomatik olarak bölmek için bayrak kullanın .


1
Sen ekleyerek daha da bayt kaydedebilirsiniz -agibi sizin için otomatik bölme yapmak için seçenek bu
Kirill L.

1

Emoji kodu , 270 bayt

🐖🔥🍇🍮c 0🔂j🍡💣🐕🔟 🍇🍊😛j🔤inc🔤🍇🍮c➕c 1🍉🍋😛j🔤dec🔤🍇🍮c➖c 1🍉🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉🍋😛j🔤half🔤🍇🍮c➗c 2🍉🍋😛j🔤Pri🔤🍇👄🔡c 10🍉🍓🍇🍎🍉🍉🍉

Çevrimiçi deneyin!

🐋🔡🍇
🐖🔥🍇
🍮c 0
🔂j🍡💣🐕🔟 🍇
🍊😛j🔤inc🔤🍇🍮c➕c 1🍉
🍋😛j🔤dec🔤🍇🍮c➖c 1🍉
🍋😛j🔤mult🔤🍇🍮c✖️c 2🍉
🍋😛j🔤half🔤🍇🍮c➗c 2🍉
🍋😛j🔤Pri🔤🍇👄🔡c 10🍉
🍓🍇🍎🍉🍉🍉🍉

🏁🍇
 🔥🔤inc inc inc dec Pri exit🔤
😀🔤🔤
 🔥🔤dec inc mult inc inc Pri🔤
😀🔤🔤
 🔥🔤inc inc inc mult half Pri exit inc🔤
😀🔤🔤
 🔥🔤inc Pri inc Pri inc Pri exit half mult🔤
😀🔤🔤
 🔥🔤Pri exit🔤
😀🔤🔤
 🔥🔤inc half Pri exit🔤
🍉

0

SNOBOL4 (CSNOBOL4) , 165 bayt

	P =INPUT ' exit ' 
	x =0
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)
m	X =X * 2	:(S)
h	X =X / 2.	:(S)
e	OUTPUT =O
END

Çevrimiçi deneyin!

Brüt.

	P =INPUT ' exit ' 				;* append ' exit ' to the input to guarantee that the program will stop
	x =0						;* initialize x to 0 else it won't print properly if the program is 'Pri'
S	P LEN(1) $ L ARB ' ' REM . P	:S($L)F(end)	;* set L to the first letter of the word and goto the appropriate label
i	X =X + 1	:(S)
d	X =X - 1	:(S)
P	O =O X		:(S)				;* append X to the output string
m	X =X * 2	:(S)
h	X =X / 2.	:(S)				;* divide by 2. to ensure floating point
e	OUTPUT =O					;* print whatever's in O, which starts off as ''
END

0

C # (.NET Çekirdek), 186 Bayt

class P{static void Main(string[]a){int v=0;foreach(var s in a){var i=s[0];if(i=='i')v++;if(i=='d')v--;if(i=='m')v*=2;if(i=='h')v/=2;if(i=='P')System.Console.Write(v);if(i=='e')break;}}}

Sen bildirerek gibi birkaç basit şeyler yaparak bu işi 26bytes tıraş edebilirsiniz iile v, küçük numaralarını kullanabilirsiniz böylece bir ASCII tablosu danışmanlık, yeniden düzenleyerek if: s ve sonra üçlü kullanarak class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}kullanımına (PS nasıl çalıştığını bir açıklama ve nasıl (örn. komut satırı bağımsız değişkenlerini bekliyor) her zaman takdir edilir!)
VisualMelon

(Ah bu utanç verici ... Bunun %50yerine kullanmalıyım %'d')
VisualMelon

0

Perl 5 -a , 61 bayt

eval'$,'.qw(++ -- ;exit ;print$,||0 *=2 /=2)[(ord)%11%6]for@F

Çevrimiçi deneyin!

@ User202729 kullanıcısının ord%11%6hilesi çaldı

Nasıl?

-a            # split the input by whitespace, store in @F
eval          # Execute the string that results from:
'$,'          # $, (the accumulator)
.             # appending:
qw(           # create an array for the following whitespace separated values:
++ --            # operators for inc & dec
;exit            # exit
;print$,||0      # Pri  (||0 ensures that 0 is output if accumulator is null
*=2 /=2)         # mult div
[(ord)%11%6] # @user202729's trick selects one of the preceding operations
for@F        # for every term input

0

Pyth, 44 Bayt

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B

Test odası

açıklama

Vmx"idmhPe"hdcwd=Z@[hZtZyZcZ2ZZ)NIqN4pZIqN6B   ## full program
             cwd                               ## split input on space
Vmx"idmhPe"hd                                  ## iterate through list of numbers corresponding to operators
                =Z@[hZtZyZcZ2ZZ)N              ## assign the variable Z (initialliy Zero) it's new value
                                 IqN4pZ        ## print Z if the current operator is "Pri" (4)
                                       IqN6B   ## break if the current operator is "exit" (5)

0

TI-BASIC, 112 bayt

Bu AFAIK'ın mükemmel kabul edilebilir olduğu bazı varsayımlardan yararlanır. Birincisi, tüm değişkenlerin yürütmeden önce sıfıra başlatılması; iki numaralı girdi girdi yoluyla alınır Ans.

Ans+" E→Str1
While 1
I+4→I
sub(Str1,I-3,1→Str2
A+(Ans="I")-(Ans="D
If inString("MH",Str2
Then
I+1→I
2AAns+A/2(1-Ans
End
If Str2="P
Disp A
If Str2="E
Stop
Ans→A
End

0

Java (OpenJDK 8) , 164 bayt

a->{int c=0;for(String g:a.split(" ")){char b=g.charAt(0);if(b==105)c++;if(b==100)c--;if(b==109)c*=2;if(b==104)c/=2;if(b==80)System.out.print(c);if(b==101)return;}}

Çevrimiçi deneyin!

Yukarıda tamsayılara yuvarlanan çözümüm, ancak ondalık sayıları işleyen çözümüm aşağıda. Java'nın iki katına çıktığı iğrenç yol, skora 55 byes daha ekliyor. İkinci satırda kodu daha okunabilir hale getirmek için yeni satırları bıraktım çünkü sadece bir ekstra komut ve bir import ifadesi ile aynı çözüm.

Java (OpenJDK 8) , 219 bayt

a->{
double c=0;
for(String g:a.split(" ")){
char b=g.charAt(0);
if(b==105)c++;
if(b==100)c--;
if(b==109)c*=2;
if(b==104)c/=2;
if(b==80)System.out.print(new DecimalFormat("0.#").format(c));
if(b==101)return;}}

Çevrimiçi deneyin!


0

C (GCC) , 120 114 111 bayt

Tavan kedisi sayesinde -6 bayt.

x,d;f(char*s){for(x=0;s>1;s=index(d^1?s:"",32)+1)d=*s-100,x+=d?d==5:-1,x*=d^9?d^4?1:.5:2,d+20||printf("%d",x);}

Çevrimiçi deneyin!

124 bayt

Kayan noktalı sürüm:

d;f(char*s){for(float f=0;s>1;s=strchr(s,32)+1)d=*s-80,f+=d==25,f-=d==20,f*=d^29?d^24?1:.5:2,s=d^21?s:"",d?:printf("%f",f);}

Çevrimiçi deneyin!

Yuvarlanan bir sürümle uğraşmadım, ancak yorum zincirini doğru anlarsam izin verilecek olan 0 için bir istisna oluşturur.


0

33 , 62 bayt

s'i'{1a}'d'{1m}'m'{2x}'h'{2d}'P'{o}'e'{@}It[mzsjk""ltqztItn1a]

Çevrimiçi deneyin!

Bu program yeni satırlarla sınırlandırılmış talimatları alır

Açıklama:

It[mzsjk""ltqztItn1a]
  [mz            n1a] | Forever
It    jk       It     | - Get the first character of the next instruction
            qz        | - Call the function declared previously
     s  ""lt  t       | - Make sure we don't lose track of the variable

Bu segmentten önceki kod tüm işlevleri tanımlar.

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.