Scherzi a parte, GolfScript, CJam o Pyth?


56

Qualche tempo fa, è stata posta la seguente domanda: GolfScript, CJam o Pyth? Basandomi solo sul titolo, ho pensato che sarebbe stata una bella sfida, ma sfortunatamente si è rivelata una domanda che richiede suggerimenti. Ecco la sfida che volevo leggere:

Chi ha detto che le lingue del golf non sono state utilizzate nel mondo reale? Come tutti sanno, il rapporto di bug per riga di codice è lo stesso indipendentemente dal linguaggio di programmazione utilizzato, quindi esiste una chiara opportunità per ridurre i costi di debug e manutenzione con tali linguaggi. La tua azienda ha finalmente visto la luce e ha deciso di utilizzare Golfscript, CJam e Pyth per sviluppare i suoi prodotti.

Sfortunatamente, dopo un paio di mesi, i tuoi dischi rigidi sono ingombri di frammenti di codice e non sai nemmeno quali sono scritti in quali lingue (sospetti addirittura che alcuni dei tuoi programmatori utilizzino il Perl).

È necessario scrivere uno strumento per rilevare quale di CJam, Golfscript o Pyth è la lingua in cui è scritto un programma. La situazione è critica, puoi usare qualsiasi lingua tu voglia, ma tienila breve (l'archiviazione dei dati è costosa: più byte utilizziamo, più costa).

Generale

  • Vincita del codice più breve
  • Scappatoie standard, ecc.
  • Non usare un interprete online
  • È possibile scrivere una funzione o un programma
  • Puoi usare eval per rilevare la tua lingua

Ingresso

  • L'input viene preso dal flusso di input standard o come stringa
  • L'input contiene solo caratteri e avanzamenti di riga ASCII stampabili
  • La dimensione dell'input è lunga fino a 256 byte

Produzione

  • L'output viene stampato sul flusso di output o restituito come una sequenza di stringhe / simboli
  • Se l'input è senza dubbio un programma X valido , stampa o ritorna X , X ∈ {CJam, Pyth, Golfscript}

    Nota : "senza dubbio" non significa che ti è permesso rispondere con un analizzatore stupido che non riesce a rilevare in modo coerente qualsiasi lingua. Per Pyth , mi aspetto che vengano riconosciuti i programmi semplici (ma nessun hardcoding). Lo stesso vale per CJam ( cheat sheet , esempi ) e Golfscript ( esempi ). I collegamenti precedenti puntano alle specifiche di ogni lingua. Se usi un approccio fuzzy / bayesiano, "senza dubbio" significa con un alto livello di confidenza (ad esempio ottieni un punteggio del 99% con la tua classificazione). Vedi sotto per la suite di test attuale.

  • Se l'input è valido in più lingue, ogni lingua rilevata deve essere stampata / restituita. Quando viene stampato, deve esserci un separatore tra più output (ad es. Spazio, newline, virgola ...).

  • L'ordine in cui vengono provate le lingue non ha importanza
  • Non mi interessa il caso (CJam, Cjam, CJAM, SPAM) [1]
  • Se non viene rilevata nessuna delle lingue sopra , stampa " Probably Perl" . Grazie a questo commento di mbomb007 , nel caso precedente puoi anche generare " Seriously" per una penalità di 4 byte (la differenza tra entrambe le stringhe).

[1] Per essere chiari, SPAM non è valido

Esempi

  • Ingresso

    "Crime predicted: --
    Calling: 1--555-
    
    "30*{_5<{iAa*:mr}&}/
    
  • Output (esempio di più valori di ritorno)

    ["Golfscript", "Cjam"]
    
  • Ingresso

    3
    
  • Output (esempio su output standard)

    golfscript
    cjam
    pyth
    
  • Ingresso

    if {} aazd
    
  • Produzione

    Probably Perl
    

Nell'ultimo caso, il programma di input produce un errore con tutti e tre gli interpreti online.

Punteggio, criterio vincente

Vincita del codice più breve. Aggiungi 4 byte se si visualizza "Seriamente". Quindi, applica i bonus.

Test falliti

Di seguito sono riportati frammenti che non devono essere riconosciuti come nessuna delle tre lingue sopra.

One-liner (ovvero una voce per riga)
$^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";
}
Pesce
#ifndef __linux
#include "x.h"
#define X/*\
a=1 set -e
+++++++++++++++++++++_+++++++++++++....Hello World!?:Q:
#endif
    echo "Hello, World!"
    int m(){}

Suite di test di base

Quelli sono test che devono superare. I belows sono a linea singola per ogni lingua in cui il tuo programma deve rilevare la lingua in cui viene scritto (non ho verificato quali di questi sono poliglotti).

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

Bonus argento: conteggio byte * 0.6

Tutti i test precedenti devono essere superati, nonché i seguenti one-liner. Tutti questi frammenti sono tratti dalle risposte reali di CodeGolf.

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*

Bonus oro: punteggio precedente * 0,8

Pyth

Confrontare
jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
Pupazzo di neve
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

Grande
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
Pupazzo di neve
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.
Orologio digitale
:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
Buon compleanno
4,{"Happy Birthday "["To You""Dear GolfScript"]@2==n}%
Sequenza Farey
~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

54
Dal titolo, speravo che includesse un nuovo linguaggio esoterico chiamato "Seriamente".
mbomb007,

17
@ mbomb007 Scherzi a parte: un linguaggio che esegue il risultato della sorgente interpretata in Golfscript come Pyth, quindi trasferisce i valori separati da una nuova riga su uno stack CJam e infine restituisce a STDOUT da lì. Due volte più facile da usare di perl: ^)
FryAmTheEggman

3
@ mbomb007 Sento la tua delusione. Posso suggerire di porre la tua domanda? "Non molto tempo fa, è stata posta la seguente domanda ..."
coredump,

31
E questo, amici miei, è il motivo per cui sono state inventate le shebang.
primo

6
Darò una ricompensa di 150 rep alla prima soluzione che è ammissibile per il bonus gold e convalida gli input in base al pattern matching, piuttosto che alla mia semplice soluzione di esecuzione dei programmi attraverso gli interpreti.
Mego

Risposte:


2

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

Funziona su Windows e sono troppo stanco per accorciarlo eseguendo su 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

Ho fatto queste cose ma non sono sicuro che siano consentite:

  • Rinomina cjam-[version].jarin cjam, pyth.pyin pyth, golfscript.rbin golfscript.
  • Leggi dal file finvece di ottenere l'input. (Aggiungi IO.write(?f,gets);all'inizio per risolvere il problema e la nuova lunghezza è (153 + 4) * 0.6 * 0.8 = 75.36)

Sfortunatamente, non posso provarlo (una combinazione di Windows e mancanza di tempo). Sembra buono e il tuo punteggio è più basso, quindi sto spostando il segno di spunta.
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'

Per quanto ne so, questo rientra nelle regole. Richiede gli interpreti Pyth, CJam e Golfscript ( pyth.py, cjam.jare golfscript.rb) nella directory corrente e sono installati Python 3, Java e Ruby. Test semplice: prova a eseguire il programma. Se ritorna con 0, stiamo bene. In caso contrario, non è valido. Un file temporaneo con nome (ad esempio un file creato in $TMP) viene creato per contenere il programma, poiché CJam non ha un'opzione di script. Il delete=Falseflag è necessario per evitare che il file venga eliminato quando viene chiuso (il sistema operativo se ne occuperà per noi). Il file deve essere chiuso prima di tentare di leggerlo (anche se lo scaricamento manuale del file dovrebbe funzionare, ma questo è più semplice). stdoute stderrvengono reindirizzati a/dev/null per eliminare output / errori (si noti che questo fa funzionare solo su sistemi * NIX).

Divertimento extra: prova a eseguire il codice dato in tutte e 4 le lingue, per vedere cosa otteniamo:

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 bella risposta. E richiede solo 6 interpreti per funzionare, ben fatto ;-)
coredump

1
bash, Python 2, Python 3, Ruby, Java, CJam, Pyth, Golfscript - Conto 8.
Mego

2
Giusto. E con il giusto file di input, può persino cancellare la tua home directory. Comunque, questo è un approccio valido, non mi dispiace.
coredump,

Speriamo solo di non avere programmi con loop infiniti o di restituire un valore diverso da zero.
Paŭlo Ebermann,

@Mego se un programma stesso fallisce per qualche motivo (come quando si apre un file che non esiste - o quando si aspetta argomenti, che sospetto possa accadere più spesso per programmi effettivamente utilizzati in modo produttivo), dovrebbe restituire un valore diverso da zero secondo quello standard decennale. Questo non significa che non appartenga a quella lingua. (Potrebbe non essere nessuno dei casi di test in realtà di quel tipo, però.) Un altro caso potrebbe essere in attesa di input, come un catprogramma ... forse dovresti almeno provare a reindirizzare / dev / null anche sull'input?
Paŭlo Ebermann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.