Serius, GolfScript, CJam, atau Pyth?

56

Beberapa waktu lalu, pertanyaan berikut diajukan: GolfScript, CJam, atau Pyth? Berdasarkan judul saja, saya pikir itu akan menjadi tantangan yang sangat bagus, tetapi sayangnya, itu ternyata menjadi pertanyaan yang menanyakan tip. Inilah tantangan yang ingin saya baca:

Siapa bilang bahasa golf tidak digunakan di Dunia Nyata? Seperti yang diketahui semua orang, rasio bug per baris kode sama secara independen dengan bahasa pemrograman yang digunakan, sehingga ada peluang yang jelas untuk mengurangi biaya debugging dan pemeliharaan dengan bahasa-bahasa tersebut. Perusahaan Anda akhirnya melihat cahaya dan memutuskan untuk menggunakan Golfscript, CJam dan Pyth untuk mengembangkan produknya.

Sayangnya, setelah beberapa bulan, hard drive Anda penuh dengan potongan kode dan Anda bahkan tidak tahu mana yang ditulis dalam bahasa apa (Anda bahkan mencurigai beberapa programmer Anda menggunakan Perl).

Anda harus menulis alat untuk mendeteksi CJam, Golfscript atau Pyth mana yang merupakan bahasa tempat program ditulis. Situasinya kritis, Anda dapat menggunakan bahasa apa pun yang Anda inginkan, tetapi harap tetap singkat (penyimpanan data mahal: semakin banyak byte yang kami gunakan, semakin banyak biayanya).

Umum

  • Kemenangan kode terpendek
  • Celah standar, dll.
  • Jangan gunakan penerjemah online
  • Anda dapat menulis fungsi atau program
  • Anda dapat menggunakan eval untuk mendeteksi bahasa Anda sendiri

Memasukkan

  • Input Anda diambil dari aliran input standar atau sebagai string
  • Input hanya berisi karakter yang dapat dicetak ASCII dan umpan garis
  • Ukuran input hingga 256 byte

Keluaran

  • Output dicetak ke aliran output atau dikembalikan sebagai urutan string / simbol
  • Jika input adalah program X yang valid , cetak atau kembalikan X , X ∈ {CJam, Pyth, Golfscript}

    Catatan : "tanpa keraguan" tidak berarti bahwa Anda diizinkan untuk menjawab dengan penganalisa bodoh yang secara konsisten gagal mendeteksi bahasa apa pun. Untuk Pyth , saya berharap Program Sederhana untuk dikenali (tetapi tidak ada hardcoding). Hal yang sama berlaku untuk CJam ( lembar contekan , contoh ) dan Golfscript ( contoh ). Tautan sebelumnya menunjuk ke spesifikasi masing-masing bahasa. Jika Anda menggunakan pendekatan fuzzy / bayesian, "tanpa keraguan" berarti dengan tingkat kepercayaan yang tinggi (Anda skor 99% dengan klasifikasi Anda, misalnya). Lihat di bawah untuk suite tes yang sebenarnya.

  • Jika input valid dalam berbagai bahasa, setiap bahasa yang terdeteksi harus dicetak / dikembalikan. Saat dicetak, harus ada pemisah antara beberapa output (mis. Spasi, baris baru, koma ...).

  • Urutan di mana bahasa dicoba tidak masalah
  • Saya tidak peduli dengan case (CJam, cjam, CJAM, SPAM) [1]
  • Jika tidak ada bahasa di atas yang terdeteksi, cetak " Probably Perl" . Berkat komentar ini dari mbomb007 , dalam kasus di atas Anda juga dapat menampilkan " Seriously" penalti dari 4 byte (perbedaan antara kedua string).

[1] Untuk lebih jelasnya, SPAM tidak valid

Contohnya

  • Memasukkan

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Output (contoh beberapa nilai pengembalian)

    ["Golfscript", "Cjam"]
    
  • Memasukkan

    3
    
  • Output (contoh pada output standar)

    golfscript
    cjam
    pyth
    
  • Memasukkan

    if {} aazd
    
  • Keluaran

    Probably Perl
    

Dalam kasus terakhir, program input menghasilkan kesalahan dengan All Three Interpreter online.

Penilaian, kriteria kemenangan

Kemenangan kode terpendek. Tambahkan 4 byte jika Anda menampilkan "Serius". Lalu, terapkan bonus.

Tes gagal

Berikut ini adalah cuplikan yang tidak boleh dikenali sebagai salah satu dari tiga bahasa di atas.

Satu baris (yaitu satu entri per baris)
$^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";
}
Ikan
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Paket tes dasar

Itu adalah tes yang harus lulus. Belows adalah satu-baris untuk setiap bahasa di mana program Anda harus mendeteksi bahasa yang sedang ditulisnya (saya tidak memeriksa yang mana dari polyglot).

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

Naskah Golf

;'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=}{;}?}/

Bonus perak: byte-count * 0,6

Semua tes sebelumnya harus lulus, begitu juga dengan satu-liner berikut. Semua cuplikan itu diambil dari jawaban CodeGolf yang sebenarnya.

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

Naskah Golf

);:|;{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*

Bonus emas: skor sebelumnya * 0.8

Pyth

Membandingkan
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Manusia salju
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

Besar
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
Manusia salju
q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Naskah Golf

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.
Jam digital
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Selamat ulang tahun
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Urutan Farey
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'
coredump
sumber
54
Dari judulnya, saya berharap ini termasuk bahasa esoterik baru yang disebut "Serius".
mbomb007
17
@ mbomb007 Serius: bahasa yang menjalankan hasil dari sumber yang ditafsirkan dalam Golfscript sebagai Pyth, kemudian mendorong nilai yang dipisahkan baris baru ke tumpukan CJam dan akhirnya output ke STDOUT dari sana. Dua kali lebih mudah digunakan sebagai perl: ^)
FryAmTheEggman
3
@ mbomb007 Saya merasakan kekecewaan Anda. Bolehkah saya menyarankan untuk mengajukan pertanyaan Anda sendiri? "Belum lama berselang, pertanyaan berikut diajukan ..."
coredump
31
Dan ini, teman-temanku, adalah mengapa shebang ditemukan.
primo
6
Saya akan memberikan hadiah 150 rep untuk solusi pertama yang memenuhi syarat untuk bonus emas dan memvalidasi input berdasarkan pencocokan pola, daripada solusi sederhana saya menjalankan program melalui penerjemah.
Mego

Jawaban:

2

Ruby, (135 + 4) * 0,6 * 0,8 = 66,72

Ini berjalan di Windows dan saya terlalu lelah untuk mempersingkatnya dengan berjalan di Unix.

(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

Saya melakukan hal-hal ini tetapi saya tidak yakin apakah diperbolehkan:

  • Ganti nama cjam-[version].jarmenjadi cjam, pyth.pyuntuk pyth, golfscript.rbmenjadi golfscript.
  • Baca dari file falih-alih mendapatkan input. (Tambahkan IO.write(?f,gets);ke awal untuk memperbaikinya, dan panjang baru adalah (153 + 4) * 0.6 * 0.8 = 75.36)
RShields
sumber
Sayangnya, saya tidak dapat mengujinya (kombinasi Windows dan kurangnya waktu). Itu terlihat bagus dan skor Anda lebih rendah, jadi saya memindahkan tanda centang.
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'

Sejauh yang saya ketahui, ini ada dalam aturan. Membutuhkan Pyth, CJam, dan Golfscript juru ( pyth.py, cjam.jar, dan golfscript.rb) di direktori saat ini, dan Python 3, Java, dan Ruby diinstal. Tes sederhana: coba jalankan program. Jika kembali 0, kita baik-baik saja. Jika tidak, itu tidak valid. File sementara bernama (misalnya file dibuat $TMP) dibuat untuk menampung program, karena CJam tidak memiliki opsi skrip. The delete=Falsebendera diperlukan untuk mencegah file dari yang dihapus ketika ditutup (OS akan mengurus itu bagi kita). File harus ditutup sebelum mencoba untuk membacanya (meskipun secara manual pembilasan file juga harus berfungsi, tetapi ini lebih sederhana). stdoutdan stderrdialihkan ke/dev/null untuk menekan output / kesalahan (perhatikan bahwa ini membuatnya hanya berfungsi pada sistem * NIX).

Kesenangan ekstra: coba jalankan kode yang diberikan dalam semua 4 bahasa, untuk melihat apa yang kita dapatkan:

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()
Mego
sumber
11
+1 Jawaban yang bagus. Dan itu hanya membutuhkan 6 penerjemah untuk berjalan, dilakukan dengan baik ;-)
coredump
1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - Saya hitung 8.
Mego
2
Tepat sekali. Dan dengan file input yang tepat, bahkan dapat menghapus direktori home Anda. Bagaimanapun, ini adalah pendekatan yang valid, saya tidak keberatan.
coredump
Semoga saja Anda tidak mendapatkan program dengan loop tanpa akhir, atau mengembalikan non-nol.
Paŭlo Ebermann
@Mego jika program itu sendiri gagal karena beberapa alasan (seperti ketika membuka file yang tidak ada - atau ketika sedang menunggu argumen, yang saya curigai mungkin terjadi lebih sering untuk program yang benar-benar digunakan secara produktif), itu harus mengembalikan nilai bukan nol sesuai dengan standar berumur satu dekade. Ini tidak berarti itu bukan milik bahasa itu. (Mungkin tidak ada test case yang benar-benar bertipe demikian). Kasus lain mungkin menunggu input, seperti catprogram ... mungkin Anda setidaknya harus mencoba mengarahkan / dev / null juga ke input?
Paŭlo Ebermann