Cidden, GolfScript, CJam veya Pyth?


56

Bir süre önce, aşağıdaki soru soruldu: GolfScript, CJam veya Pyth? Sadece başlığa dayanarak, bunun çok güzel bir meydan okuma olacağını düşündüm, ancak ne yazık ki, ipuçları isteyen bir soru olduğu ortaya çıktı. İşte okumak istediğim zorluk:

Golf dünyasının Gerçek Dünya'da kullanılmadığını kim söyledi? Herkesin bildiği gibi, kod satırı başına hata oranı kullanılan programlama dilden bağımsız olarak aynıdır, bu nedenle hata ayıklama ve bakım maliyetlerini bu dillerle azaltmak için açık bir fırsat vardır. Şirketiniz nihayet ışığı gördü ve ürünlerini geliştirmek için Golfscript, CJam ve Pyth kullanmaya karar verdi.

Ne yazık ki, birkaç ay sonra, sabit diskleriniz kod parçacıklarıyla doludur ve hangilerinin hangi dillerde yazıldığını bile bilmiyorsunuz (hatta bazı programcıların Perl kullandığından şüpheleniyorsunuz).

Hangi programın yazıldığı dilin CJam, Golfscript veya Pyth olduğunu algılamak için bir araç yazmalısınız. Durum kritik, istediğiniz herhangi bir dili kullanabilirsiniz, ancak lütfen kısa tutun (veri depolama pahalı: ne kadar çok bayt kullanırsak, maliyeti o kadar artar).

Genel

  • En kısa kod kazanma
  • Standart boşluklar vs.
  • Çevrimiçi tercüman kullanma
  • Bir işlev veya program yazabilirsiniz
  • Kendi dilinizi belirlemek için eval'ü kullanabilirsiniz

Giriş

  • Girişiniz standart giriş akışından veya bir dize olarak alınır.
  • Giriş yalnızca ASCII yazdırılabilir karakterleri ve satır beslemeleri içeriyor
  • Girişin boyutu 256 byte uzunluğunda

Çıktı

  • Çıktı, çıktı akışına yazdırılır veya bir dizi dizge / sembol olarak döndürülür
  • Girdi şüphesiz geçerli bir X programı ise, yazdırın veya X , X ∈ {CJam, Pyth, Golfscript} yazın veya geri dönün.

    Not : "şüphesiz", herhangi bir dili sürekli olarak tespit edemeyen aptal bir analizörle cevap verebileceğiniz anlamına gelmez. İçin Pyth , beklediğim Basit Programları tanınan (ancak hiçbir hardcoding) edebilirsiniz. Aynı şey CJam ( hile tabaka , örnek ) ve Golfscript ( örnekler ). Önceki bağlantılar, her dilin özelliklerine işaret eder. Bulanık / bayesli bir yaklaşım kullanıyorsanız, "şüphesiz", yüksek bir güven düzeyi anlamına gelir (örneğin, sınıflandırmanızla% 99 puan alırsınız). Gerçek test takımı için aşağıya bakın.

  • Giriş birden fazla dilde geçerliyse, algılanan her dil yazdırılmalı / iade edilmelidir. Yazdırıldığında, birden fazla çıktı arasında bir ayırıcı olmalıdır (örn. Boşluk, yeni satır, virgül ...).

  • Dillerin denenme sırası önemli değil
  • Davayı umursamıyorum (CJam, cjam, CJAM, SPAM) [1]
  • Eğer yukarıdaki dilin hiçbiri , baskı algılandığında " Probably Perl" . Mbomb007'den gelen bu yorum sayesinde , yukarıdaki durumda Seriously4 baytlık bir ceza ("her iki dize arasındaki fark) " " çıktısı alabilirsiniz .

[1] Sadece açık olmak gerekirse, SPAM geçersiz

Örnekler

  • Giriş

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Çıktı (çoklu dönüş değeri örneği)

    ["Golfscript", "Cjam"]
    
  • Giriş

    3
    
  • Çıktı (standart çıktıya örnek)

    golfscript
    cjam
    pyth
    
  • Giriş

    if {} aazd
    
  • Çıktı

    Probably Perl
    

Son durumda, giriş programı Her Üç çevrimiçi yorumlayıcı ile birlikte bir hata üretir .

Puanlama, kazanan kriter

En kısa kod kazanır. "Gerçekten" çıktısını alıyorsanız 4 bayt ekleyin. Ardından ikramiye uygulayın.

Başarısız testler

Aşağıdakiler, yukarıdaki üç dilden herhangi biri olarak tanınmaması gereken snippet'lerdir .

Tek gömlekler (yani her satıra bir giriş)
$^X=~/([a-z]+)[^\/]+$/;print$1,$/
<>;map($s-=(-1)**$_/(2*$_-1),1..$_),$s=!print$s,$/for<>
((THIS IS LISP HAIKU) (TRULY THIS IS LISP HAIKU) (THIS IS LISP HAIKU))
(format t"~@(~{~R~^, ~}~).~%~:*~@(~{~:R~^, ~}~)."(loop for i to 99 collect(1+ i)))
print sum(ord(c) for c in 'Happy new year to you!')
brainfuck
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.
-----------------.
++++++++.
+++++.
--------.
+++++++++++++++.
------------------.
++++++++.
Perl
@list=( "aaaa", 
        "aaaaaaaa", 
        "aaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaa", 
        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

while (@list) {
    for($i=0;$i<6;$i++){
        print length($list[$i])." ";
    }
    print "\n";
}
Balık
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Temel test paketi

Bunlar geçmesi gereken testler . Aşağıda , programınızın yazıldığı dili algılaması gereken her dil için tek bir gömlek bulunmaktadır (hangilerinin çokgrup olduğunu kontrol etmedim).

Pyth

*2Q
FNrZTN
FNrZhTN
FNUhTN
VhTN
FNr1hQN
=N5N
K5K
K1FNr1hQ=K*KN
K1FNr1hQ=K*KNK
K1FNr1hQ=K*KN;K
DhZK*3ZRK
L?b*bytb1yQ
A(Z1)VQHA(H+HG

Golfscript

;'2706 410'~{.@\%.}do;
;''6666,-2%{2+.2/@*\/10.3??2*+}*`50<~\;
'Hello, world!'
1 2 [\]

CJam

"Hello, world"
{`"_~"}_~
"`_~"`_~
T1{_2$+}A*]`
{__'`>\'x>26*2-*-}/
Y38#
N/s:X,8-,{X>9<__{'a<},,\4%{'Z>},,*I={4=}{;}?}/

Gümüş bonus: bayt sayısı * 0.6

Önceki tüm testlerin yanı sıra aşağıdaki tek gömlekleri geçmelidir. Tüm bu snippet'ler gerçek CodeGolf cevaplarından alınmıştır.

Pyth

VzJ:zZhZpkJ~Zhy}rJ0-G"aeoui
Vzjdm?@zd}N,dt-lzd\ Uz
jd.iSQs*RtQ,\?":0
rsXOtQmO*-GJ"aeiou"J/Q2*%Q2O"hy"4
VhQIq`N_`NN
s["$$\\varphi=1+"*Q"\cfrac1{1+"\\<\dQ"dots"*Q\}"$$
@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

Golfscript

);:|;{0):0;|$:§-1%" - "§" = ""0"4$~§~-+-4>:|n|6174`=!}do"Iterations: "0"."
'-+,/'{)))))}%
4:echo(2+2);
#undef X;A!"$%&'()*+-[,.]/0123456789:<=>?@BCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcghijklmopqrstvwxyz{|}~
{`),32>^.}.~
"126,32>''+".~\-'.~\-"'-
"),@`^^32>#.~".~
...[[]]{{}}&%%++++5i
  *++..0011125::::;;;?bbbbcccc{}
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"

CJam

"Q"c("ASSW"1$("aRD"(((T1
%\@_@){;_0}*__*)\15
"This program wasn't written in "o"GolfScript"", it was built for ""CJam"oo"!"
"P2"1e3K51_,1>K*$K*~]N*
li__,\mf:i2m1+:*/fb:+
ri:B__(^2/):G/,{_BBG/@-(#G@*G(B2/*+*}/]:+
{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~
[S'-26*N]:Z[S'|:PS24*PN]:RR'(PS5*qi:XD=X0<-X2%2*+:Y[" ^ "_" > ""(O)"" - "__]=S8*Y[" ^ ""   "" < ""(O)"" - "__]=S5*P')NRRXD=[SPS7*'oA*S7*PN]:QR?Y[[SPS5*'oSC*'oS5*PN]:T_R[SPS7*'oS8*'oS7*PN]RRR]=QY2=TR?RRZ
li4H#+2bW%32<2b
q~:R100:H*\d:T/i){R-H*HT-/m]}6*_H)<*
"JamesBdo,"YZ+/)BA*c+Y*Y%:BS@SB)))[JW:Z____)ci+*]U*

Altın bonusu: önceki puan * 0.8

Pyth

Karşılaştırmak
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Kardan adam
M@GCHgc"  ___

  ___
   _"bhzgc" (_*_)
 _===_
 .....
  /_\\"bhzs[g"  \ "@z4\(g"-.oO"@z2g" ,._"@z1g"-.oO"@z3\)g"  / "@z5)s[g" < /"@z4\(gc"   
 : 
] [
> <"b@z6\)g" > \\"@z5)++" ("gc"   
 : 
\" \"
___"bez\)

CJam

Büyük
rri:Hri:Vri:Q[q~]3/_Qa3*a+_|$W%:Pf{\a#}:AH/:B0ff*
P,,[AHAW%HBz:+_W%V\V]2/
ff{~@@f=/::|1#}0Ua4*t:R;
P0f<
V{H{BI=J=_2$=
0R{"I>! I+V<J>! J+H<"4/+4/z{~~}%:&1$*\)}%);2$-|t
}fJ}fI
[P,{_La#\1$0t1$f-}*;;]
{:TR=2/~\~V\-,>\f{\_3$=@~H\-,>{Tt}/t}~}/
:~Pf=:~
~]S*N
Kardan adam
q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Golfscript

Lorem Ipsum
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet est ut sem commodo scelerisque. Sed ut ultricies enim. Nam eget lectus suscipit, gravida turpis a, volutpat tellus. Cras efficitur luctus neque, at semper massa condimentum at posuere.
Dijital saat
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
İyi ki doğdun
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Farey dizisi
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
Başlıktan, bunun "Cidden" olarak adlandırılan yeni bir ezoterik dili içerdiğini umuyordum.
mbomb007 23:15

17
@ mbomb007 Cidden: Golfscript'te Pyth olarak yorumlanan kaynağın sonucu olarak çalışan, ardından yeni satırı ayrılmış değerleri bir CJam yığınına iter ve son olarak oradan STDOUT'a çıkar. Perl olarak kullanmak kadar kolay iki katı: ^)
FryAmTheEggman 23:15

3
@ mbomb007 Hayal kırıklığınızı hissediyorum. Kendi sorunuzu sormanızı önerebilir miyim? "Çok uzun zaman önce, aşağıdaki soru soruldu ..."
coredump

31
Ve bu, arkadaşlarım, bu yüzden Shebangs icat edildi.
primo

6
Altın ikramiye için uygun olan ilk çözüme 150 rep ödül vereceğim ve programları yorumlayıcılar aracılığıyla çalıştırmaya yönelik basit çözümümden ziyade kalıp eşleştirmeye dayalı girdileri doğrulayacağım.
Mego

Yanıtlar:


2

Ruby, (135 + 4) * 0.6 * 0.8 = 66.72

Bu, Windows üzerinde çalışır ve Unix'te çalıştırarak kısaltmak için çok yorgunum.

(a=[%w(javaw -jar cjam),%w(python pyth),%w(rubyw golfscript)].map{|c|c[-1]if system(*c,?f,'> NUL','2>','NUL')}-[nil])==[]?'Seriously':a

Bunları yaptım ama izin verilip verilmediğinden emin değilim:

  • Rename cjam-[version].jariçin cjam, pyth.pyiçin pyth, golfscript.rbiçin golfscript.
  • fGiriş almak yerine dosyadan okuyun . ( IO.write(?f,gets);Bunu düzeltmek için başlangıca ekleyin ve yeni uzunluk (153 + 4) * 0.6 * 0.8 = 75.36)

Ne yazık ki, test edemiyorum (Windows'un bir kombinasyonu ve zaman eksikliği). İyi görünüyor ve puanınız düşük, ben de onay işaretini taşıyorum.
coredump

39

Python 2,332 * 0,6 * 0,8 = 159,36

import os
from subprocess import*
from tempfile import*
f,n,a=NamedTemporaryFile(delete=0),open(os.devnull,'w'),''
f.write(os.read(0,256))
f.close()
for l in["CJam","java","-jar","cjam.jar"],["Pyth","./pyth.py"],["Golfscript","./golfscript.rb"]:a+=(l[0]+' ')*(call(args=l[1:]+[f.name],stdout=n,stderr=n)>0)
print a or'Probably Perl'

Bildiğim kadarıyla, bu kurallar dahilinde. Geçerli dizindeki Pyth, CJam ve Golfscript tercümanlarını ( pyth.py, cjam.jarve golfscript.rb) ve Python 3, Java ve Ruby'nin yüklü olmasını gerektirir. Basit test: programı çalıştırmayı deneyin. Eğer geri dönerse 0, biz iyiyiz. Değilse geçersiz. $TMPCJam bir script seçeneğine sahip olmadığından, programı tutmak için adlandırılmış bir geçici dosya (örn. İçinde yaratılan bir dosya ) oluşturulur. delete=FalseBayrak kapatıldığında (OS bizim için ilgilenir) dosyayı silinmeye önlemek için gereklidir. Dosyayı okumayı denemeden önce kapatılmalıdır (dosyayı el ile temizlemek de çalışmalıdır, ancak bu daha kolaydır). stdoutve stderryönlendirilir/dev/null Çıktı / hataları bastırmak için (bunun yalnızca * NIX sistemlerinde çalışmasını sağladığını unutmayın).

Ekstra eğlence: ne alacağımızı görmek için verilen kodu 4 dilde çalıştırmayı deneyin:

import sys
from subprocess import*
from tempfile import*
c=["Cjam","java","-jar","cjam.jar"]
p=["Pyth","./pyth.py"]
g=["Golfscript","./golfscript.rb"]
e=["Perl","perl"]
f=NamedTemporaryFile(delete=False)
s=sys.stdin.read()
f.write(s)
f.close()
n=open('/dev/null','w+')
a=''
for l in [c,p,g,e]:
    try:
        print '%s: %s'%(l[0],check_output(args=l[1:]+[f.name],stderr=n))
    except:
        continue
n.close()

11
+1 Güzel cevap. Ve sadece 6 tercüman
koşması

1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - 8'i sayıyorum.
Mego

2
Doğru. Ve doğru giriş dosyasıyla, ana dizininizi bile silebilirsiniz. Neyse, bu geçerli bir yaklaşım, umrumda değil.
18

Diyelim ki sonsuz döngülere sahip bir program alamayacaksınız veya sıfır olmayan bir programa döneceksiniz.
Paŭlo Ebermann 17:15

@Mego bir programın kendisi bir nedenden ötürü başarısız olursa (mevcut olmayan bir dosyayı açarken olduğu gibi - ya da aslında verimli bir şekilde kullanılan programlar için daha sık olabileceğinden şüphelendiğim iddiaları beklerken) sıfır olmayan bir değer döndürmelidir. Bu on yıllık standarda göre. Bu, o dile ait olmadığı anlamına gelmez. (Test senaryolarının hiçbiri aslında bu türde olmayabilir.) Başka bir dava bir catprogram gibi bir giriş bekliyor olabilir ... belki de en azından girişe yöneltmeyi denemelisiniz / dev / null?
Paŭlo Ebermann
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.