Java 7, Score = Upvotes - 3.97 = -2.97
Yay!!! Java!!! The world's favourite golfing language in the world. What, you can actually golf in java??? Well, it's kind of like using a bulldozer to putt.
a
is expected to contain the first character. b
is expected to contain the last character. c
is expected to have the input string.
Here is the function golfed:
int d=0;try{d=Integer.parseInt(c);}catch(Exception e){}int l=b-a+1;char[]f=new char[l];int[]g=new int[l];int h=1;int i=1;g[0]=1;f[0]=a;int j;for(j=1;j<b-a+1;){g[j]=(h+=i);f[j]=(char)(f[j++-1]+1);i*=h==10*i?10:1;}if(d==0){h=0;for(char k:c.toCharArray()){for(j=0;j<l;j++){if(f[j]==k){h+=g[j];}}}System.out.println(h);}else{c="";for(j=l;j>0;){if(g[--j]<=d){c+=f[j];d-=g[j++];}}System.out.println(c);}
Here it is indented with structure code:
public class G{
public static void main(String[] args){
new G(args);
}
public G(String[] args){
a = args[0].charAt(0);
b = args[1].charAt(0);
for (int i = 2; i < args.length; i++){
c += args[i];
}
function();
}
char a;
char b;
String c = "";
void function(){
int d=0;
try{
d=Integer.parseInt(c);
}catch(Exception e){}
int l=b-a+1;
char[]f=new char[l];
int[]g=new int[l];
int h=1;
int i=1;
g[0]=1;
f[0]=a;
int j;
for(j=1;j<b-a+1;){
g[j]=(h+=i);
f[j]=(char)(f[j++-1]+1);
i*=h==10*i?10:1;
}
if(d==0){
h=0;
for(char k:c.toCharArray()){
for(j=0;j<l;j++){
if(f[j]==k){
h+=g[j];
}
}
}
System.out.println(h);
}else{
c="";
for(j=l;j>0;){
if(g[--j]<=d){
c+=f[j];
d-=g[j++];
}
}
System.out.println(c);
}
}
}
Here it is completely expanded:
public class Generator{
public static void main(String[] args){
beginning = args[0].charAt(0);
end = args[1].charAt(0);
for (int i = 2; i < args.length; i++){
phrase += args[i];
}
function();
}
static char beginning;
static char end;
static String phrase = "";
static void function(){
int convertTo = 0;
try{
convertTo = Integer.parseInt(phrase);
} catch (Exception e){}
char[] alphabet = new char[end - beginning + 1];
int[] values = new int[alphabet.length];
int value = 1;
int base = 1;
values[0] = 1;
alphabet[0] = beginning;
int i;
for (i = 1; i < values.length;){
values[i] = (value += base);
alphabet[i] = (char)(alphabet[i++-1]+1);
base*=value==10*base?10:1;
}
if(convertTo==0){
value = 0;
for (char character : phrase.toCharArray()){
for (i = 0; i < alphabet.length;i++){
if (alphabet[i] == character){
value += values[i];
}
}
}
System.out.println(value);
} else {
phrase = "";
for (i = values.length;i > 0;){
if (values[--i] <= convertTo){
phrase += alphabet[i];
convertTo -= values[i++];
}
}
System.out.println(phrase);
}
}
}