Im Ernst, GolfScript, CJam oder Pyth?


56

Vor einiger Zeit wurde die folgende Frage gestellt: GolfScript, CJam oder Pyth? Nur aufgrund des Titels dachte ich, dass es eine sehr schöne Herausforderung sein würde, aber leider stellte sich heraus, dass es sich um eine Frage handelte, die nach Tipps fragte. Hier ist die Herausforderung, die ich lesen wollte:

Wer hat gesagt, dass Golfsprachen in der realen Welt nicht verwendet werden? Wie jeder weiß, ist das Verhältnis der Fehler pro Codezeile unabhängig von der verwendeten Programmiersprache dasselbe, so dass eine klare Möglichkeit besteht, die Debug- und Wartungskosten mit diesen Sprachen zu senken. Ihr Unternehmen hat endlich das Licht der Welt erblickt und sich für die Entwicklung seiner Produkte mit Golfscript, CJam und Pyth entschieden.

Leider sind Ihre Festplatten nach ein paar Monaten mit Codefragmenten überfüllt und Sie wissen nicht einmal, welche in welchen Sprachen geschrieben sind (Sie vermuten sogar, dass einige Ihrer Programmierer Perl verwenden).

Sie müssen ein Tool schreiben, um festzustellen, in welcher CJam, Golfscript oder Pyth-Sprache ein Programm geschrieben ist. Die Situation ist kritisch, Sie können jede gewünschte Sprache verwenden, aber halten Sie sie bitte kurz (Datenspeicherung ist teuer: Je mehr Bytes wir verwenden, desto mehr kostet sie).

Allgemeines

  • Kürzester Code-Gewinn
  • Standardlücken etc.
  • Verwenden Sie keinen Online-Dolmetscher
  • Sie können eine Funktion oder ein Programm schreiben
  • Sie können eval verwenden, um Ihre eigene Sprache zu erkennen

Eingang

  • Ihre Eingabe wird aus dem Standardeingabestream oder als Zeichenfolge übernommen
  • Die Eingabe enthält nur ASCII-druckbare Zeichen und Zeilenvorschübe
  • Die Größe der Eingabe ist bis zu 256 Byte lang

Ausgabe

  • Die Ausgabe wird als Ausgabestream gedruckt oder als Folge von Zeichenfolgen / Symbolen zurückgegeben
  • Wenn die Eingabe ohne Zweifel ein gültiges X- Programm ist, drucken Sie oder geben Sie X , X ∈ {CJam, Pyth, Golfscript} zurück.

    Anmerkung : "Ohne Zweifel" bedeutet nicht, dass Sie mit einem dummen Analysegerät antworten dürfen, das durchweg keine Sprache erkennt. Für Pyth erwarte ich, dass einfache Programme erkannt werden (aber keine Hardcodierung). Gleiches gilt für CJam ( Spickzettel , Beispiele ) und Golfscript ( Beispiele ). Die vorherigen Links verweisen auf die jeweiligen Sprachspezifikationen. Wenn Sie einen Fuzzy- / Bayes-Ansatz verwenden, bedeutet dies "ohne Zweifel" mit einem hohen Maß an Vertrauen (Sie erzielen beispielsweise mit Ihrer Klassifizierung 99%). Die aktuelle Testsuite finden Sie weiter unten.

  • Wenn die Eingabe in mehreren Sprachen gültig ist, sollte jede erkannte Sprache gedruckt / zurückgegeben werden. Beim Ausdruck muss zwischen mehreren Ausgaben ein Trennzeichen stehen (z. B. Leerzeichen, Zeilenvorschub, Komma ...).

  • Die Reihenfolge, in der Sprachen ausprobiert werden, spielt keine Rolle
  • Groß- und Kleinschreibung ist mir egal (CJam, CJam, CJAM, SPAM) [1]
  • Wenn keine der oben genannten Sprachen erkannt wird, drucken Sie " Probably Perl" . Dank dieses Kommentars von mbomb007 " Seriously" können Sie im obigen Fall auch eine Strafe von 4 Bytes (die Differenz zwischen beiden Strings) ausgeben .

[1] Nur um klar zu sein, SPAM ist ungültig

Beispiele

  • Eingang

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Ausgabe (Beispiel für mehrere Rückgabewerte)

    ["Golfscript", "Cjam"]
    
  • Eingang

    3
    
  • Ausgabe (Beispiel für Standardausgabe)

    golfscript
    cjam
    pyth
    
  • Eingang

    if {} aazd
    
  • Ausgabe

    Probably Perl
    

Im letzten Fall erzeugt das Eingabeprogramm einen Fehler mit allen drei Online-Dolmetschern.

Wertung, Gewinnkriterium

Kürzester Code-Gewinn. Fügen Sie 4 Bytes hinzu, wenn Sie "Seriously" ausgeben. Wenden Sie dann Boni an.

Fehlgeschlagene Tests

Die folgenden Ausschnitte dürfen nicht als eine der drei oben genannten Sprachen erkannt werden.

Einzeiler (dh ein Eintrag pro Zeile)
$^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";
}
Fisch
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Grundlegende Testsuite

Das sind Tests, die bestehen müssen . Belows sind Einzeiler für jede Sprache, in der Ihr Programm die Sprache erkennen muss, in der es geschrieben wird (ich habe nicht überprüft, welche davon mehrsprachig sind).

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

Silberbonus: Byteanzahl * 0,6

Alle vorherigen Tests sowie die folgenden Einzeiler müssen bestanden werden. Alle diese Schnipsel stammen aus den tatsächlichen CodeGolf-Antworten.

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*

Goldbonus: bisherige Punktzahl * 0.8

Pyth

Vergleichen Sie
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Schneemann
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

Groß
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
Schneemann
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.
Digitaluhr
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Alles Gute zum Geburtstag
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Farey-Sequenz
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
Vom Titel hoffte ich, dass dies eine neue esoterische Sprache namens "Ernsthaft" beinhaltete.
mbomb007

17
@ mbomb007 Im Ernst: Eine Sprache, die das Ergebnis der in Golfscript als Pyth interpretierten Quelle ausführt, dann die durch Zeilenumbrüche getrennten Werte auf einen CJam-Stapel schiebt und schließlich von dort an STDOUT ausgibt. Doppelt so einfach zu bedienen wie perl: ^)
FryAmTheEggman

3
@ mbomb007 Ich fühle deine Enttäuschung. Darf ich vorschlagen, Ihre eigene Frage zu stellen? "Vor nicht allzu langer Zeit wurde die folgende Frage gestellt ..."
coredump

31
Und das, meine Freunde, ist der Grund, warum Shebangs erfunden wurden.
Primo

6
Ich werde der ersten Lösung, die für den Goldbonus in Frage kommt, eine Prämie von 150 Wiederholungen gewähren und Eingaben auf der Grundlage des Mustervergleichs validieren, anstatt meiner einfachen Lösung, die Programme über die Interpreter auszuführen.
Mego

Antworten:


2

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

Dies läuft unter Windows und ich bin zu müde, um es unter Unix zu verkürzen.

(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

Ich habe diese Dinge getan, bin mir aber nicht sicher, ob sie erlaubt sind:

  • Umbenennen cjam-[version].jarin cjam, pyth.pynach pyth, golfscript.rbnach golfscript.
  • Aus Datei lesen, fanstatt Eingaben zu erhalten. (Fügen Sie IO.write(?f,gets);dem Anfang hinzu, um dies zu beheben, und die neue Länge ist (153 + 4) * 0,6 * 0,8 = 75,36.)

Leider kann ich es nicht testen (eine Kombination aus Windows und Zeitmangel). Es sieht gut aus und deine Punktzahl ist niedriger, also bewege ich das Häkchen.
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'

Soweit mir bekannt ist, liegt dies innerhalb der Regeln. Erfordert die Pyth-, CJam- und Golfscript-Interpreter ( pyth.py, cjam.jarund golfscript.rb) im aktuellen Verzeichnis sowie Python 3, Java und Ruby. Einfacher Test: Starten Sie das Programm. Wenn es mit zurückkehrt 0, sind wir gut. Wenn nicht, ist es ungültig. Eine benannte temporäre Datei (z. B. eine in erstellte Datei $TMP) wird erstellt, um das Programm aufzunehmen, da CJam keine Skriptoption hat. Das delete=FalseFlag ist notwendig, um zu verhindern, dass die Datei beim Schließen gelöscht wird (das Betriebssystem kümmert sich für uns darum). Die Datei muss geschlossen werden, bevor versucht wird, daraus zu lesen (obwohl das manuelle Leeren der Datei auch funktionieren sollte, ist dies jedoch einfacher). stdoutund stderrwerden weitergeleitet an/dev/null Ausgabe / Fehler unterdrücken (beachten Sie, dass dies nur auf * NIX-Systemen funktioniert).

Extra Spaß: versuchen Sie den angegebenen Code in allen 4 Sprachen auszuführen, um zu sehen, was wir bekommen:

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 Schöne Antwort. Und es werden nur 6 Dolmetscher benötigt, um zu funktionieren ;-)
coredump

1
Bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - ich zähle 8.
Mego

2
Stimmt. Und mit der richtigen Eingabedatei kann es sogar Ihr Home-Verzeichnis löschen. Wie auch immer, das ist ein gültiger Ansatz, das macht mir nichts aus.
Coredump

Hoffen wir nur, dass Sie keine Programme mit Endlosschleifen oder mit einem Wert ungleich Null erhalten.
Paŭlo Ebermann

@Mego Wenn ein Programm selbst aus irgendeinem Grund fehlschlägt (z. B. beim Öffnen einer nicht vorhandenen Datei - oder wenn es Argumente erwartet, von denen ich vermute, dass sie bei tatsächlich produktiv genutzten Programmen häufiger vorkommen), sollte es einen Wert ungleich Null zurückgeben nach diesem jahrzehntealten Standard. Dies bedeutet nicht, dass es nicht zu dieser Sprache gehört. (Es kann jedoch sein, dass keiner der Testfälle tatsächlich von diesem Typ ist.) Ein anderer Fall wartet möglicherweise auf Eingaben, wie z. B. ein catProgramm ... Vielleicht sollten Sie zumindest versuchen, / dev / null auch auf die Eingabe umzuleiten?
Paŭlo Ebermann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.