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
-
"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 Siejdm@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 IpsumLorem 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}'
Antworten:
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.
Ich habe diese Dinge getan, bin mir aber nicht sicher, ob sie erlaubt sind:
cjam-[version].jar
incjam
,pyth.py
nachpyth
,golfscript.rb
nachgolfscript
.f
anstatt Eingaben zu erhalten. (Fügen SieIO.write(?f,gets);
dem Anfang hinzu, um dies zu beheben, und die neue Länge ist (153 + 4) * 0,6 * 0,8 = 75,36.)quelle
Python 2, 332 × 0,6 × 0,8 = 159,36
Soweit mir bekannt ist, liegt dies innerhalb der Regeln. Erfordert die Pyth-, CJam- und Golfscript-Interpreter (
pyth.py
,cjam.jar
undgolfscript.rb
) im aktuellen Verzeichnis sowie Python 3, Java und Ruby. Einfacher Test: Starten Sie das Programm. Wenn es mit zurückkehrt0
, 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. Dasdelete=False
Flag 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).stdout
undstderr
werden 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:
quelle
cat
Programm ... Vielleicht sollten Sie zumindest versuchen, / dev / null auch auf die Eingabe umzuleiten?