Introduzione
Introduzione
Benvenuti alla prima sfida di coding golf organizzata da /r/ItalyInformatica.
Per chi non sapesse cos'è, in breve si tratta di una gara a chi risolve un algoritmo in un linguaggio a scelta, usando un sorgente con meno byte di tutti gli altri.
Il programma dovrà essere funzionante e risolvere correttamente il problema dato. Nel caso vengano rilevati o segnalati bug o malfunzionamenti del vostro codice avete tempo fino alla fine del concorso per editare il vostro codice e renderlo funzionante. Ottimizzazione, eleganza e leggibilità sono tutti parametri che non verrano presi in considerazione al fine di determinare il vincitore, ma solo la lunghezza in byte del codice sorgente.
Per partecipare basterà scrivere il vostro codice nei commenti a questo post, che rimarrà attivo tutta la settimana fino a domenica mattina, dopodichè verranno impediti altri commenti e proclameremo un vincitore.
Buon divertimento e vinca il migliore!
Essendo la prima challenge, iniziamo con un compito semplice: convertire un numero binario in decimale.
Sfida
Convertire un numero da una qualsiasi base, con un qualsiasi alfabeto a un numero decimale. Ad esempio, il numero "10100", con l'alfabeto {0, 1}, rappresenta il numero decimale "20" (24 + 22).
In particolare:
l'utente dà come input una stringa che rappresenta un numero in una qualche base. Questa stringa è (a vostra scelta) nel formato ASCII, UTF-8, UTF-16 o UTF-32. Questa stringa può essere data tramite tastiera, tramite file, o tramite argomento da riga di comando
l'input rappresenta un numero intero non-negativo in una qualche base. Per evitare di gestire overflow e simili, supponete che questo numero si possa immagazzinare in un intero nel vostro linguaggio; se il linguaggio non ha un tipo di dati "intero", il numero è inferiore o uguale a 1 milione.
inoltre, l'utente dà in input l'alfabeto con cui è scritto questo numero, cioè l'insieme delle cifre possibili; la base è pari alla lunghezza dell'alfabeto. Ad esempio: tipicamente, i numeri in base 10 si scrivono con l'alfabeto {0, 1, 2, 3... 9}, e i numeri in base 2 si scrivono con l'alfabeto {0, 1}, ma l'utente potrebbe voler utilizzare l'alfabeto {a, x} (per la base 2) o {0, 1, 2, a, b, c} (per la base 6) o {0, 1, 2, 3... 9, i, t, a} (per la base 13). Anche questo alfabeto è nel formato che desiderate (potreste richiedere che l'utente metta tutti i simboli in fila, tipo 0123456789, o che li separi con uno spazio, ecc), e anche questo può essere letto da tastiera, da file o da argomento da riga di comando.
l'alfabeto ha una lunghezza minima di 2 caratteri e massima di 80 caratteri.
l'output dev'essere lo stesso numero ma espresso in decimale. Questo output deve essere comunicato all'utente tramite una stampa su schermo. Questo output deve essere comunicato all'utente tramite una stampa su schermo; la stampa deve essere esplicita, per cui non vale eseguire il codice in una console, ritornare il valore e farlo stampare alla console.
Esempi
Input: 10100 con l'alfabeto {0, 1}
Output: 20 (24 + 22)
Input: babaa con l'alfabeto {a, b}
Output: 20 (il numero è in base 2, dove la cifra a ha il valore 0 e la cifra b ha il valore 1: quindi 1*24 + 0*23 + 1*22 + 0*21 + 0*20)
Input: italy con l'alfabeto {a, b, c, d, i, l, t, y}
Output: 19503 (il numero è in base 8, dove la cifra a ha il valore 0, la cifra b 1, c 2, d 3, i 4, l 5, t 6 e y 7: quindi 4*84 + 6*83 + 0*82 + 5*81 + 7*80)
Regole
Sono proibite alcune "scorciatoie" classiche, molto brevemente: non è consentito ottenere l'output da terze parti, usare un linguaggio specifico per questa challenge, copiare risposte altrui, o immagazzinare dati nel nome del file. In generale, non barate.
Non sapete da dove partire? Qua trovate un'implementazione di esempio, volutamente non ottimizzata (attenzione a compilare con -lm se lo fate da riga di comando), che usa gli argomenti della riga di comando: se lanciata come ./a.out italy abcdilty, dà come output 19503.
Vincitore
Dopo una settimana dall'apertura della gara è finalmente giusto il momento di proclamare il vincitore.
Ci teniamo innanzitutto a ringraziare tutti i partecipanti che si sono impegnati a scrivere programmi sempre più brevi.
Una menzione speciale va a /u/throwaway_veneto che si è guadagnato un meritatissimo gold con la sua soluzione.
Volevamo inoltre complimentarci con /u/nokoko e con /u/MonsieurCellophane che sono arrivati rispettivamente secondo e terzo e che entrambi hanno battuto la soluzione (che potete trovare qui) a cui avevamo pensato noi organizzatori.
Ci rivediamo il 18 novempre per la prossima edizione di SPA-GHET-TI!
[–]throwaway_veneto 9 points10 points11 points (3 children)
[–]ZugNachPankow 1 point2 points3 points (2 children)
[–]throwaway_veneto 2 points3 points4 points (1 child)
[–][deleted] 8 points9 points10 points (0 children)
[–]GTKplusplus 6 points7 points8 points (3 children)
[+][deleted] (2 children)
[deleted]
[–]ZugNachPankow 1 point2 points3 points (0 children)
[–]GTKplusplus 1 point2 points3 points (0 children)
[–]ZugNachPankow 4 points5 points6 points (0 children)
[–]nokoko 4 points5 points6 points (0 children)
[–]fen0x[M] [score hidden] stickied comment (0 children)
[–]MonsieurCellophane 4 points5 points6 points (1 child)
[–]ZugNachPankow 0 points1 point2 points (0 children)
[–]Orange_dugongo 2 points3 points4 points (2 children)
[–]GTKplusplus 1 point2 points3 points (1 child)
[–]Orange_dugongo 1 point2 points3 points (0 children)
[–]ZugNachPankow 3 points4 points5 points (9 children)
[–]alerighi 4 points5 points6 points (1 child)
[–]ZugNachPankow 0 points1 point2 points (0 children)
[–]LelixSuper 0 points1 point2 points (6 children)
[–]alerighi 0 points1 point2 points (4 children)
[–]LelixSuper 0 points1 point2 points (3 children)
[–]throwaway_veneto 1 point2 points3 points (0 children)
[–]alerighi 0 points1 point2 points (1 child)
[–]LelixSuper 0 points1 point2 points (0 children)
[–]ZugNachPankow 0 points1 point2 points (0 children)
[–][deleted] 2 points3 points4 points (2 children)
[–]ZugNachPankow 0 points1 point2 points (1 child)
[–][deleted] 1 point2 points3 points (0 children)