Scelta delle lingue per giocare a golf [chiuso]


28

Quali sono alcuni consigli per scegliere la lingua giusta per giocare a golf? Quali sono i fattori che influenzano la lingua da scegliere?

Ecco alcuni tipi di problemi di esempio:

  • Problemi che richiedono una soluzione I / O , console o file
  • Problemi che richiedono l' analisi
  • Problemi che richiedono di scrivere la soluzione come definizione di funzione
  • Problemi di matematica
  • Problema con i numeri primi
  • Risolvere i puzzle numerici
  • Esecuzione di metodi numerici
  • Elaborazione delle stringhe
  • Elaborazione di array
  • Problemi di array 2D complessi
  • Geometria computazionale
  • ricorsione
  • Grafica 2D
  • Grafica 3D
  • Audio
  • Rete / Web
  • Elaborazione parallela

Non dire semplicemente cose come "Usa GolfScript | J" perché ti piacciono.


Per alcuni problemi è il sistema di tipi. Ad esempio, se hai bisogno di gestire numeri interi superiori a 64 bit, vuoi le lingue che lo hanno incorporato (ad esempio Golfscript, Haskell) piuttosto che le lingue che li rendono costosi (ad esempio Java).
Peter Taylor,

Ho reso questo un wiki in linea con la nostra politica sulle domande di tipo "Suggerimenti".
dmckee,

99 bottiglie sono utili se hai bisogno di una lingua che inizia con una lettera specifica ...
Jesse Millikan,

Complimenti per asso, trimsty, algoritmo condiviso e hosch250 per aver contribuito a rendere questa discussione una risorsa migliore. Per favore, continua a ricevere le comunicazioni! È stata una dura chiamata di taglie tra algoritmo di shak e hosch250, che hanno entrambi fatto molti sforzi dettagliati, ma alla fine Herr Shark ottiene il cenno del capo.
Jonathan Van Matre,

Scegli la lingua che desideri. È anche una competizione all'interno delle lingue. Le soluzioni più uniche e interessanti in più lingue sono buone.
Mego,

Risposte:


-1

Dipende da ciò di cui si ha bisogno, C / C ++ è veloce, ma è necessario codificare più lavoro da soli. Python e Ruby sono più lenti ma sono molto più facili da programmare con metodi integrati che accorciano molto il lavoro e gestiscono automaticamente valori infinitamente grandi (se uno ha la RAM). L'uso di un linguaggio funzionale come Haskell è ottimo per un uso funzionale puramente matematico se si può inquadrare il problema in quel modo.


2
Come utente principalmente Python, in Py paghi per la tua facilità d'uso nel conteggio dei personaggi, anche se ci sono alcuni trucchi davvero complicati che possono salvare i personaggi. Haskel e Lisp, mentre sono divertenti, tendono a correre anche più a lungo di Python.
Arrdem,

Questa probabilmente non dovrebbe essere la risposta accettata. La descrizione delle lingue di alto e basso livello non ha nulla a che fare con il conteggio dei personaggi.
Samy Bencherif,

Sì, è davvero giusto tenere una risposta del 2011 a una domanda modificata il 23 febbraio 2017. Forse dovremmo smettere di cambiare le domande dopo aver ricevuto risposta?
ewanm89,

10

Mettendo i miei due centesimi nei linguaggi di programmazione dell'array , in particolare J e APL .

Anche K / Kona, Q e Nial rientrano in questa categoria, ma generalmente hanno gli stessi benefici e critiche. Usa discrezione. Userò J esempi di seguito, principalmente perché sono ASCII e quindi facili da digitare - ricorda che i caratteri APL contano come byte singoli, quindi non lasciare che questo sia il tuo problema con la lingua come scelta per il golf.

  • Problemi di matematica
  • Risolvere i puzzle numerici
  • Esecuzione di metodi numerici
  • Problemi di array 2D complessi

Questi due sono ottimi linguaggi matematici e di manipolazione dei dati, perché generano array intorno a un livello elevato e molti cicli vengono eseguiti implicitamente , dicendo, ad esempio, aggiungere dieci a ciascuno di 3, 4 e 5 ( 10 + 3 4 5) o sommare ciascuno riga di un array ( +/"1 arr- il looping è nel "1).

  • Problema con i numeri primi

Con problemi di numero primo in particolare, J ha primitive integrate veloci e brevi, così come alcuni dialetti di APL. (Modifica: sto pensando a Nars2000, che è in parte dialetto e in parte implementazione completamente diversa. APL non ha incorporato per i numeri primi.) N-esimo primo ( p:), no. di numeri primi fino a ( _1&p:), factoring ( q:), GCD e LCM ( +.e *.), e così via, ce ne sono molti. Tuttavia, in pratica, la domanda spesso specifica che devi cucinare le tue prime implementazioni principali, quindi queste non vedono troppo uso. Ci sono ancora modi puliti e fantasiosi per ottenere le cose migliori di cui hai bisogno, diventa solo un po 'meno taglia e incolla.

  • Elaborazione delle stringhe
  • Elaborazione di array

L'elaborazione di array e stringhe è un po 'un miscuglio: se è qualcosa in cui APL / J è bravo o ha un linguaggio primitivo o comune, è quasi banale; se è qualcosa di molto sequenziale e non molto parallelizzabile, ti divertirai molto. Qualcosa nel mezzo è nell'aria, sebbene di solito rispondano favorevolmente.

  • Problemi che richiedono una soluzione I / O, console o file
  • Problemi che richiedono di scrivere la soluzione come definizione di funzione

IO è strano. APL ha un'espressione di ingresso singolo carattere, ma con J si deve spendere almeno l'8 per leggere in un numero: ".1!:1]1. L'output è un po 'meno dettagliato, ma in pratica stai ancora guardando 6 o 7 caratteri sprecati. In particolare a J piace molto se si può accettare l'input come argomento di una funzione, invece di dover fare confusione con IO stesso.

In pratica, con J e APL, di solito la soluzione è scritta come una funzione invocata sulla console. Con APL, puoi semplicemente inserire nomi di variabili per i tuoi argomenti e racchiudere l'espressione con cui stavi lavorando in parentesi graffe e chiamarla un giorno.

Ma con J, c'è un po 'di sovraccarico per definire esplicitamente le funzioni-- 3 :'...'e devi sfuggire a qualsiasi stringa all'interno - quindi ciò che viene solitamente fatto è qualcosa chiamato programmazione tacita: programmi a livello di funzione, combinando le primitive in un modo non diversamente da quello di Haskell. Questa può essere sia una benedizione che una maledizione, perché non devi spendere tanti personaggi facendo riferimento ai tuoi argomenti, ma è facile annegare tra parentesi e finire per perdere decine di personaggi cercando di hackerare la tua soluzione altrimenti breve e intelligente in qualcosa che funziona.

  • Problemi che richiedono l'analisi
  • Geometria computazionale

Non ho esperienza con il golf su questi particolari problemi, ma lo dirò: alla fine, i linguaggi di programmazione dell'array sono molto bravi a convogliare e trasformare molti dati allo stesso modo. Se riesci a trasformare il problema in un esercizio di mescolanza dei numeri, puoi renderlo un problema APL / J, senza sudare.

Detto questo, non tutto è un problema APL / J. A differenza di Golfscript, APL e J sono risultati buoni per giocare a golf, insieme ai loro altri vantaggi;)


Ottimo contributo! Grazie per essere il primo in piscina.
Jonathan Van Matre,

4

Perché il Perl non è ancora stato elogiato? È un linguaggio di golf eccellente, per quasi tutti questi, in particolare cose legate alle stringhe (regex).

Burlesque è utile per i programmi relativi ai numeri, mentre Ruby è eccezionale per una più semplice manipolazione del testo.

In realtà c'è un elenco di lingue e punteggi di golf qui .


Non so occuparmi di Perl, ma sono d'accordo.
ckjbgames,

2

Mi piace usare oscuri linguaggi di programmazione per (provare a) fare il lavoro.

Ecco i miei preferiti per i dettagli che hai elencato:

Problemi che richiedono una soluzione I / O, console o file

Linguaggi come TI-Basic funzionano bene, ma preferisco di Ruby a causa dellaputs

Problemi che richiedono l'analisi

GolfScript ti aiuterà sicuramente qui

Problemi che richiedono di scrivere la soluzione come definizione di funzione

Tabella TI-84 : consente le funzioni, Y=ad esempio Y=|X|restituisce il valore assoluto di X

Problemi di matematica

TI-Basic - realizzato per una calcolatrice, quindi include matematica;)

Problema con i numeri primi

Niente di speciale; Mathematica è probabilmente lo strumento giusto per il lavoro

Risolvere i puzzle numerici

TI-Basic in quanto scorre automaticamente tra gli array

Esecuzione di metodi numerici

TI-Basic o Mathematica

Elaborazione delle stringhe

Python - ha alcune fantastiche funzioni di stringa.

Non importa quanto pensi che sia TI-Basic , non usarlo per le stringhe ...

Elaborazione di array

TI-Basic : passa automaticamente in rassegna le matrici ; ad es. incrementare tutti i valori nell'array -L1+1→L1

Ruby - ha anche funzionalità di array molto potenti e, naturalmente !, aiuterà anche a comprimere il codice

Problemi di array 2D complessi

Ruby o Python funzionano meglio qui, poiché TI-Basic non supporta array 2D

Geometria computazionale

TI-Basic ha caratteristiche geometriche e può essere utilizzato per la maggior parte della matematica fino a Calculus e Linear Algebra


BONUS

looping

O Arduino o Quomplex . Arduino ha un built-in void loop(){}e Quomplex ha i loop infiniti contenuti tra parentesi ( [])

Disegno / GUI

Game Maker Language hafunzionalità di disegno molto potenti e TI-Basic è anche uno strumento generalmente utile grazie al supporto per disegnare sul grafico.

Quines

Sia HQ9 + o Quomplex perché HQ9 + ha la Qdi uscita del codice sorgente del programma e Quomplex potranno stampare automaticamente il suo codice sorgente a meno che non *sia specificato (output) o produce alcuna uscita, definita con#


2

Se stai risolvendo un problema di matematica e non hai Mathematica, prova Sage . Si basa su Python, quindi se conosci già Python non hai bisogno di molto tempo per apprenderne la sintassi.

Esempi:

È anche utile per la rappresentazione grafica e la risoluzione di equazioni (ad esempio, è possibile utilizzare la solve()funzione in Sage o, se ciò è vietato dalle regole, consente una facile implementazione del processo di Newton Raphson perché ha la diff()funzione che può eseguire la differenziazione simbolica) .

Inoltre, se sei un programmatore di Python2, l'uso di Sage può permetterti di imbrogliare saltando le importdichiarazioni lunghe . Ad esempio, mathe syssono già importati per impostazione predefinita. (Nota che questo potrebbe non funzionare se il tuo programma Python2 dipende dalla divisione intera.)


Buone informazioni Grazie per aver contribuito.
Jonathan Van Matre,

1

Conosco tre lingue: Java, C ++ e Python 3. Non conosco nessuno di questi ad alto livello, ma questa è la mia esperienza con loro.

Giava:

Non userei mai più Java per giocare a golf. Ci vogliono oltre 80 caratteri solo per scrivere Hello World!. Tuttavia, ha i suoi punti di forza:

L'input richiede la creazione di un Scanneroggetto. È difficile inserire un singolo carattere. Richiede la specifica di quali tipi stai inserendo.
L'analisi è abbastanza semplice a causa del forciclo. Il forloop avanzato è eccellente per questo.
Java supporta i metodi, ma la dichiarazione del metodo è piuttosto lunga.
Java è eccellente in matematica, così come tutti gli altri linguaggi di alto livello.
Java è difficile da usare quando il problema riguarda la modifica delle stringhe. Non è possibile apportare modifiche a una stringa esistente.
Gli array di Java sono semplici da usare.
Java è bravo nella ricorsione.
Java include grafica integrata. Sono molto facili da usare.

C ++

Il C ++ è un linguaggio molto forte, ma è piuttosto lungo quando si cerca di giocare a golf con 56 caratteri Hello world!.

Input e output sono facili. Non è necessario specificare quali tipi si stanno introducendo, ciò viene fatto automaticamente. Tuttavia, è necessario includere la libreria iostream.
L'analisi è molto semplice.
La dichiarazione di funzione è semplice, ma mangia molti personaggi importanti. Il C ++ eccelle in matematica, ma non include PI o E, come fa Java.
Le stringhe di C ++ sono facili da usare e cambiano secondo necessità.
Uso vectors dove possibile invece di arrays, ma entrambi sono facili da usare.
Il C ++ è bravo nella ricorsione.
C ++ non include la grafica integrata.

Python 3

Python 3 è simile a C ++ e Java. È molto più breve in quanto non è fortemente tipizzato - in altre parole, indovina solo quali sono le variabili.

L'input è semplice, ma tutto è input come stringhe. È necessario convertire manualmente tutti gli input in qualsiasi valore desiderato.
L'analisi e il looping sono molto semplici.
Le dichiarazioni delle funzioni Python sono piuttosto semplici e brevi.
Python è bravo in matematica.
Le stringhe di Python sono semplici da usare.
Le matrici sono semplici da usare.
Python è bravo nella ricorsione.
Python non include la grafica integrata.


Immagino che il for-loop avanzato stia parlando di un range-for loop. C ++ supporta questo dal C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). È sintatticamente simile al ciclo for-range Java e richiede che la classe dell'oggetto iterabile per implementare inizio () e fine () o inizio (T) e fine (T) sia sovraccaricata per l'oggetto dato. È inoltre implementato per stringhe in stile C e array incorporati e funziona per tutti i contenitori di librerie standard.
foobar

@foobar Sì, ne stavo parlando. Grazie per le informazioni, lo desidero da quando ho preso Java.
Hosch250,

Java ora ha una soluzione a 61 byte, ma il tuo punto è ancora valido.
MilkyWay90
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.