计算ILD的总和


21

输入:

一个整数

输出:

输入本身的总和+输入的长度+输入的每个数字。

nr + nr-length + {sum of digits} = output

例子:

输入:99
输出:99(nr)+ 2(nr-length)+ (9 + 9)(数字)→119

输入:123
输出:123 + 3 + (1 + 2 + 3)132

挑战规则:

  • 输入也可以包含负输入,这些输入经过特殊解析。的-/减号也+1为长度,并且是第一的一部分digit
    例如:

    输入:-123
    输出:-123 + 4 + (-1 + 2 + 3)-115

  • 您可以假设输入或输出都不会超出(32位)整数的范围。

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,如有必要,请添加说明。

测试用例:

87901 → 87931
123 → 132
99 → 119
5 → 11
1 → 3
0 → 1
-3 → -4
-123 → -115
-900 → -905
-87901 → -87886

半相关:所有数字的总和


我认为对于负数,例如-123总和应该(-1 + 1 + 2 + 3)改为(-1 + 2 + 3),对吧?
Yytsi

@TuukkaX不,应该是-1 + 2 + 3。对于此挑战,我选择将-/减号合并到第一个数字作为一个负数,以使其更加有趣。
凯文·克鲁伊森

Answers:


10

05AB1E,28 20 18 8字节

ÐgsS'+ýO

说明

Ð           # triplicate input
 g          # get length of input
  sS'+ý     # split input and merge with '+' as separator 
       O    # sum and implicitly display

在线尝试

@Adnan节省了10个字节


2
幸运的是,05AB1E会对算术表达式进行自动求值,因此您可以执行以下操作:ÐgsS'+ýO
阿德南

1
@Adnan:太好了!我不知道那样做。
Emigna '16

13

Python 2,39个字节

lambda x:x+len(`x`)+eval("+".join(`x`))

测试套件

使用与我的Pyth-answer中相同的评估技巧。


我从来没有使用过的Python,所以忘了我的无知可能,但如何将evaljoin知道要采取负输入负第一位?我希望-123成为像- + 1 + 2 + 3写出来,但显然它不是。(或者是它,它会自动合并- + 1-1作为第二个步骤?)
凯文Cruijssen

2
就像您说的那样,@ KevinCruijssen 在加入后-123变为"-+1+2+3",当您加入时会产生正确的结果eval。尝试eval("-+1")例如导致的结果-1
Denker

1
@KevinCruijssen - + 1- > - 1。一元加号运算符存在,因此- + 1与基本上相同-(+(1))。对于数字,+a与相同a
大公埃里克

9

Pyth,11个10字节

感谢@LeakyNun一个字节!

++vj\+`Ql`

测试套件

说明

++ vj \ +`Ql`QQ#Q =输入,最后两个隐式添加

  vj \ +`Q#在'+'上加入输入并评估
        Q`输入的长度
           Q#输入本身
++#将这三个值相加以获得结果

7

18岁的CJam

q_,\~__Ab(@g*\~]:+

在线尝试

说明:

q_      read the input and make a copy
,\      get the string length and swap with the other copy
~__     evaluate the number and make 2 copies
Ab      convert to base A=10 (array of digits), it uses the absolute value
(       take out the first digit
@g*     get a copy of the number, get its sign and multiply with the digit
\~      dump the other digits on the stack
]:+     add everything together

6

Brachylog35 32字节

lL,?:ef +:?:L + I,(0>?h:2 *:Ir-:1 + .; I。)
lL,(0>?h:1--I; I0),? b:ef +:?:L:I +。

说明

lL,             L is the length of the Input
(
    0>?         Input < 0
       h:1--I   I is (First digit - 1) * -1
;               Or
    I0          I is 0
),
?b:ef+          Sum all digits of the Input
      :?:L:I+.  Output = sum of digits + (Input minus first digit) + L + I

6

XSLT 1.0(无EXSLT),673字节

<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"><output method="text"/><param name="i"/><template match="/"><variable name="d"><variable name="s">0<if test="0>$i">1</if></variable><variable name="d"><call-template name="d"><with-param name="i" select="substring($i,$s+2)"/></call-template></variable><value-of select="substring($i,1,$s+1)+$d"/></variable><value-of select="$i+string-length($i)+$d"/></template><template name="d"><param name="i"/>0<if test="$i!=''"><variable name="d"><call-template name="d"><with-param name="i" select="substring($i,2)"/></call-template></variable><value-of select="substring($i,1,1)+$d"/></if></template></transform>

轻度充气:

<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <output method="text"/>
    <param name="i"/>
    <template match="/">
        <variable name="d">
            <variable name="s">0<if test="0&gt;$i">1</if></variable>
            <variable name="d">
                <call-template name="d">
                    <with-param name="i" select="substring($i,$s+2)"/>
                </call-template>
            </variable>
            <value-of select="substring($i,1,$s+1)+$d"/>
        </variable>
        <value-of select="$i+string-length($i)+$d"/>
    </template>
    <template name="d">
        <param name="i"/>0<if test="$i!=''">
            <variable name="d">
                <call-template name="d">
                    <with-param name="i" select="substring($i,2)"/>
                </call-template>
            </variable>
            <value-of select="substring($i,1,1)+$d"/>
        </if>
    </template>
</transform>

使用xsltproc运行:

xsltproc --param i -87901 ild.xsl ild.xsl

是的,ild.xsl两次通过:一次作为XSLT文档,然后作为要转换的XML文档。输入文档必须存在,因为XSLT处理器通常需要一个输入文档才能开始运行。(XSLT旨在定义从输入文档到输出文档的转换;不像我在这里所做的那样,仅使用命令行参数运行转换是不典型的。)对于此程序,任何格式正确的XML文档都可以作为输入,并且XSLT是XML的应用程序,根据定义,任何格式正确的XSLT转换都是格式良好的XML文档。


1
+1表示使用完全不用于计算数字并使之正常工作的东西。
DJMcMayhem

您不能删除一些引号以使其“无效但对代码高尔夫有用”吗?
暴民埃里克

当然,name="i" select="..."例如,您在引号后不需要空格<with-param name="i"select="substring($i,$s+2)"/>吗?

@cat整个文档中只有3个,实际上删除空格会使xsltproc阻塞。
psmay 2016年

1
@psmay哦,这很奇怪。埃里克是说,如果你删除引号,也可以是技术上无效根据标准,但仍能正常工作,如HTML这些都将使得标签没有引号中的属性值,大多数的实现<p id=hello>等等。我想,如果xsltproc有关空格不会让未加引号的烦恼事由。

4

MATL,20个字节

tVtnw48-PZ}t0<?x_]vs

在线尝试

所有测试用例

说明

        % Implicitly grab the input
tV      % Duplicate the input and convert to a string
tn      % Duplicate and find the length of this string
w       % Flip the top two stack elements to get us the string again
48-     % Subtract 48 (ASCII 'O'). Yields a negative number for a negative sign
        % and digits otherwise
P       % Flip the resulting array
Z}      % Break the array up so each element is pushed to the stack
t0<?    % If the first character was a negative sign
  x_    % Pop the negative sign off the stack and negate the first digit
]       % End of if
vs      % Vertically concatenate and sum all stack contents
        % Implicitly display the result

4

Clojure,102字节

(fn[n](load-string(str"(+ "n" "(count(str n))" "(apply str(map #(if(= % \-)%(str %" "))(str n)))")")))

匿名函数,构造一个看起来像 (+ -123 4 -1 2 3 )并评估它。一切都非常冗长,从数字,其长度构造字符串,然后将数字的字符串表示形式的每个符号(减号除外)映射到自身加上空格和减号,然后保持不变

您可以看到它在这里运行:https : //ideone.com/FG4lsB


4

Dyalog APL19 17 16 字节

≢+#⍎'\d'⎕R'&+',⊢

取字符串并返回

正则表达式附加数字的根名称空间评估中的长度
+加号,其后带有加号
#

'\d'⎕R'&+'
,
未修改的字符串

–3感谢ngn


3

Matlab,76 67字节

n=input('');t=num2str(n)-48;if(n<0)t(1)=0;t(2)=-t(2);end
n+sum(t+1)

@Luis Mendo节省了9个字节

说明:

n=input('');     -- takes input
t=num2str(n)-48; -- makes it a string and then array of digits with "-" becoming -3 (48 is code for 0)
if(n<0)
t(1)=0;          -- set first element (-3) to 0
t(2)=-t(2);      -- the second element is the most significant digit, so we have to negate it
end
n+sum(t+1)       -- take sum of n, sum of all digits and length of t
                    (guaranteed by +1 of every element)

1
sum(t+1)+n短于sum([n numel(t) t])
路易斯·门多

1
哇,我花了好一会儿在想为什么这可行。万分谢意!
pajonk '16

3

dc,57位元组

dc -e"0 1?rdsc*d[1r]s+d0>+dZr[+la10~lc*rdsaZ1<A]sAdsaZ1<Ala+++f"

解释:

0 1      # Push 0, then 1 on the stack
?        # Wait for input from stdin
         # If input is negative, the leading minus will subtract 1 from 0
r        # Swap (rotate) top two items on stack.
         # Stack status if input (`$') was...
         #       positive                    negative
         # TOP       1     <- coefficient ->    -1
         #           $                           $
         #           0
dsc      # Store a copy of coefficient in `c'
*        # Multiply input by coefficient:
         #  If input was positive, it stays positive.
         #  If input was negative, it's actually interpreted as positive.
         #   In this case, multiply by -1 to make it negative.
d        # Duplicate signed input
[1r]s+   # Define a function `+': Push 1 and rotate
d 0>+    # If input is negative, push 1 underneath the top of the stack
         # This 1 represents the length of the `-` in the input
         # Note that the stack now has 3 items on it, regardless of input sign
dZ       # Push the length of the input (not including leading minus)
r        # Rotate, moving a copy of the input to the top
[        # Begin function definition
 +       # Add top two items of stack
 la      # Load value from `a' (which holds nothing at time of function definition)
 10~     # Slice the last digit off `a' (spoiler: `a' is going to hold the input while
         #  we gather its digits)
 lc*     # Multiply digit by coefficient
         #  Since the input is signed, the input modulo 10 will have the same sign.
         #  We want all digits to be positive, except the leftmost digit, which should
         #   have the sign of the input.
         #  This ensures that each digit is positive.
 r       # Rotate: move remaining digits to top of stack
 dsa     # Store a copy of the remaining digits in `a'
 Z 1<A   # Count the number of digits left; if more than 1, execute A
]sA      # Store the function as `A'
d sa     # Store a copy of the input in `a'
         #  Props to you if you're still reading this
Z 1<A    # Count the number of digits left; if more than 1, execute A
la       # Load leftmost digit of input (still signed appropriately)
+++      # Add the top four items on the stack
f        # Dump stack

这比我预期的要复杂得多!好挑战:)


我要等到我的工作开始,看看我们是否有类似的方法时再看您的观点。但是我看到您可以通过将10~a 换成a来收回一个字节A~
brhfl

3

Bash + coreutils,36个字节

bc<<<$1+${#1}+$(sed s:\\B:+:g<<<0$1)

说明:

     $1+                      # the input number (+)
     ${#1}+                   # the length of the number, the '-' sign included (+)
     $(sed s:\\B:+:g<<<0$1)   # insert '+' between two consecutive word characters
                              #A word character is any letter, digit or underscore.
bc<<<                         # calculate the sum

在sed中,\B还匹配两个连续的非单词字符,因此对于负数,它匹配在'^'和'-'之间。例如,请注意给出0$1所需的技巧。\B0-1+2+3

运行示例: “ input.txt”包含问题语句中的所有测试用例

while read N;do echo "$N -> "$(./ILD_sum.sh "$N");done < input.txt

输出:

87901 -> 87931
123 -> 132
99 -> 119
5 -> 11
1 -> 3
0 -> 1
-3 -> -4
-99 -> -96
-123 -> -115
-900 -> -905
-87901 -> -87886

@DigitalTrauma不适用于负整数。
seshoumara

@DigitalTrauma好吧,是的(但是代码大小不会改变),并且没有(如果sed保持原样)。原因是与相比,使用带反引号的命令替换时,反斜杠的处理方式会有所不同$()。反引号有两种替代方法,但最后都给出了36个字节的解决方案:sed 's:\B:+:g'<<<0$1sed s:\\\B:+:g<<<0$1
seshoumara

2

PowerShell v4,48个字节

param($n)$n,"$n".length+[char[]]"$n"-join'+'|iex

应该可以在v2 +中使用,但我仅在v4中进行过测试。

接受输入$n。创建一个新数组,其,运算符由,$n并且.lengthwhen $n转换为字符串。与之相连的字符串转换$n为字符数组。然后,将整个数组-join与一起进行ed处理,+然后再传递给iex(类似于eval)。结果留在管道上,输出是隐式的。

例如,对于输入-123,数组看起来像(-123, 4, -, 1, 2, 3),而后面的字符串-join看起来像-123+4+-+1+2+3。然后Invoke-Expression发生,结果是-115预期的。


2

具有load-all175字节的因子

好吧,这不是很短。一元减号的特殊处理确实很烦人。我想我可以做得更好,也许可以。

[ dup [ 10 >base length ] [ [ 10 >base >array [ 48 - ] V{ } map-as ] [ 0 < ] bi [ reverse dup pop* dup pop swap [ neg ] dip dup [ push ] dip ] [ ] if 0 [ + ] reduce ] bi + + ]

使用此替换正则表达式:

s/(-?[\d]+)\s*->\s*(-?[\d]+)/{ $2 } [ $1 calculate-ild ] unit-test/g

我们可以将OP的测试用例转换为Factor测试套件。

USING: arrays kernel math math.parser sequences ;
IN: sum-ild

: sum-digits ( n -- x )
    [ number>string >array [ 48 - ] V{ } map-as ]
    [ 0 < ]
    bi
    [
      reverse dup pop* dup pop swap [ neg ] dip dup [ push ] dip
    ]
    [ ] if
    0 [ + ] reduce ;

: calculate-ild ( n -- x )
  dup
  [ number>string length ]
  [ sum-digits ]
  bi + + ;

USING: tools.test sum-ild ;
IN: sum-ild.tests

{ 87931 } [ 87901 calculate-ild ] unit-test
{ 132 } [ 123 calculate-ild ] unit-test
{ 119 } [ 99 calculate-ild ] unit-test
{ 11 } [ 5 calculate-ild ] unit-test
{ 3 } [ 1 calculate-ild ] unit-test
{ 1 } [ 0 calculate-ild ] unit-test
{ -4 } [ -3 calculate-ild ] unit-test
{ -115 } [ -123 calculate-ild ] unit-test
{ -905 } [ -900 calculate-ild ] unit-test
{ -87886 } [ -87901 calculate-ild ] unit-test

2

C#,118个字节

int k(int a){var s=a.ToString();for(int i=0;i<s.Length;a+=s[i]<46?-(s[++i]-48)+ ++i-i:(s[i++]-48));return a+s.Length;}

您需要空间的事实1+ ++i是完全荒谬的imo

你是对的,但我不知道该怎么做……
ScifiDeath '16

1
您可以s[i]<46检查是否为负号
悬崖根

@ScifiDeath你不能++i+1吗?
暴民埃里克

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ没有,因为缀数学的评价哑顺序

2

SpecBAS-147字节

1 INPUT a$: l=LEN a$: b$="text "+a$+"+"+STR$ l+"+": FOR i=1 TO l: b$=b$+a$(i)+("+" AND i<l): NEXT i: EXECUTE b$

建立一个字符串,然后运行它。不幸的是,EXECUTE不适?用于的简写形式PRINT,但TEXT保存了1个字符。

enter image description here


2

C#,106个字节

我击败了我一个字节的Java,我的生活完成了

int r(int n){var s=n+"";return n+s.Length+s.Select((k,j)=>int.Parse(s[k==45?1:j]+"")*(k==45?-2:1)).Sum();}

松软(kinda)

    public static int r(int n)
    {
            var s = n + "";
            return n + s.Length + s.Select((k, j) =>int.Parse(s[k==45?1:j]+"")*(k==45?-2:1)).Sum();
    }

2
非常确定您可以用var替换字符串,用45替换“-”
ScifiDeath

您可以(n)=>{....为匿名lambda 做些事情

猫,你能详细说明吗?我试图自己解决这个问题,但对我不起作用。我从未
这么做

我知道已经有一段时间了,但是您可以n=>n+(n+"").Length+(n+"").Select((k,j)=>int.Parse((n+"")[k<48?1:j]+"")*(k<48?-2:1)).Sum()将其压缩为89个字节:尽管您必须添加+18,using System.Linq;但您在当前答案中也忘记了。
凯文·克鲁伊森

2

Java 8,174 136 122 107 105 93 78字节

i->{int f=0;for(int j:(i+"").getBytes())i+=j<48?f++:f-->0?50-j:j-47;return i;}

-14个字节,感谢@LeakyNun
-15个字节,感谢@cliffroot

说明:

在线尝试。

i->{                   // Method with integer as both parameter and return-type
  int f=0;             //  Integer-flag, starting at 0
  for(int j:(i+"").getBytes())
                       //  Loop over the digits as bytes
    i+=                //   Increase the input with:
       j<48?           //    If the current byte is '-':
        f++            //     Increase the input with the flag-integer `f` (which is 0),
                       //     and increase the flag-integer `f` by 1 afterwards
       :               //    Else:
        f-->0?         //     If the flag-integer `f` is 1,
                       //     and decrease the flag-integer `f` back to 0 afterwards
         50-j          //      Increase it with 50 minus the current byte
        :              //    Else
         j-47;         //     Increase it with the byte as digit
                       //      + 1 to cover for the length part in ILD
  return i;}           //  Return the modified input as result

1
int c(int i){char[]c=(i+"").toCharArray();int x=i,l=c.length,s=i+l,j=-1;for(;++j<l;x=1)s+=x>0?c[j]-38:38-c[++j];return s;}
Leaky Nun

1
int c(int i){char[]c=(i+"").toCharArray();for(int x=i,j=-1;++j<c.length;i+=1+Integer.parseInt(x<0?"-"+--c[j+=x=1]:c[j]+""));return i;} it finally felt like golfing in Java @LeakyNun does your variant work? it gives wrong answers at first and then crashes.
cliffroot

@LeakyNun Your code fails at the test case for 0.
Kevin Cruijssen

1
Oh, how ridiculous; change the two occurrences of 38 to 48.
Leaky Nun

1
int c(int i){byte[]c=(i+"").getBytes();for(int j=-1;++j<c.length;i+=(c[j]<48?50-c[++j]:c[j]-47));return i;} yay
cliffroot

1

Perl 6 - 30 bytes

As literal as it gets

{$^a+$^a.chars+[+]($^a.comb)}

Use it as an anonymous function

> {$^a+$^a.chars+[+]($^a.comb)}(99)
119 

1

JavaScript (ES6), 38 bytes

n=>eval([n+=``,n.length,...n].join`+`)

Uses the old join-and-eval trick. Save 4 bytes if I can insist on string input:

f=
n=>eval([n,n.length,...n].join`+`)
;
<input type=number oninput=o.value=f(this.value)><input id=o readonly>


"Add 4 bytes if I have to allow both integers and strings representing integers" You don't, it is optional to choose either, but probably 99.9% will choose integer. I mainly added it for the rare languages that only support strings, but I will remove that part from my question since almost every language does.
Kevin Cruijssen

@KevinCruijssen Sorry for being unclear earlier; the 34-byte version only works on strings.
Neil

1

C++, 255 Bytes

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){
    string input;
    cin >> input;
    int sum = atoi(input.c_str()) + input.length();
    for(unsigned i = 0; i < input.length(); ++i)
        sum += input.at(i) - 48;
    return 0;
}

1

Perl 5 - 37 Bytes

warn eval(join'+',/./g)+($_+=()=/./g)

Input is in $_



1

C, 132 116 113 80

t,c;f(char*v){for(c=atoi(v+=t=*v==45);*v;t=0,++v)c+=t?50-*v-2*c:*v-47;return c;}

Function f() takes the input as a string and returns the result as an integer. Full program version (113 bytes):

t;main(int c,char**v){char*p=v[1];c=atoi(p+=t=*p==45);for(c=t?-c:c;*p;++p,t=0)c+=t?50-*p:*p-47;printf("%d\n",c);}

Requires one argument.


1

Perl, 27 bytes

22 bytes code + 5 for -paF.

$"="+";$_+=@F+eval"@F"

Explanation

Uses the -a autosplit option with an empty delimiter (-F) creating an array of the digits passed in. Uses the magic variable $" which controls which char is used to join an array when it's interpolated into a string (we use "+" here) and the fact that a list used in scalar context will return the length of the list (the number of digits).

Usage

echo -n 99 | perl -paF -e'$"="+";$_+=@F+eval"@F"'
119

Perl, 27 bytes

22 bytes code + 5 for -paF.

Alternative solution, that's a lot more readable for no more bytes. I prefer the other as it looks more cryptic!

$_+=@F+eval join"+",@F

1

dc, 56 bytes

?dZrdd1sa[1+r0r-_1sa]sb0>b[A~rd0<x]dsxxrla*[+z1<y]dsyxp

No shorter than Joe's above, but a somewhat different implementation (and one that takes negative numbers as input vs. a subtraction command). Can probably be golfed more, but lunch only lasts so long.

?                #input
dZrdd            #find no. of digits, rotate to bottom of stack, dup input twice
1sa              #coefficient for first digit stored in register 'a'
[1+r0r-_1sa]sb   #macro 'b' executes on negative numbers. add one (for the neg. sign)
                 #rotate this value out of the way, leave a positive copy on top
0>b              #run the above macro if negative
[A~rd0<x]dsxx    #create and run macro 'x'; mod 10 to grab least significant digit
                 #keep doing it if quotient is greater than zero
rla*             #a zero remains in the way of our most significant digit, rotate it down
                 #and multiply said digit by our coefficient 'a' from earlier
[+z1<y]dsyx      #add two top stack values (we left that zero there to ensure this always
                 #works), check stack depth and keep doing it while there's stack
p                #print!

1

R, 108 bytes

A bit late to the party again but here it goes:

s=strsplit(paste(n<-scan()),"")[[1]];n+nchar(n)+sum(as.integer(if(n<0)c(paste0(s[1],s[2]),s[1:2*-1])else s))

In order to generally split the digits of any number (e.g. to sum them), R requires us to first convert to a string and subsequently split the string into a string vector. To sum up the elements, the string vector has to be converted to numeric or integer. This together with the exception with the sum of a the digits of a negative number eats up a lot of bytes.

The exception can be golfed a bit (to 96 bytes) if warning messages are allowed.

s=as.integer(strsplit(paste(n<-scan()),"")[[1]]);if(n<0){s[2]=s[2]*-1;s=s[-1]};n+nchar(n)+sum(s)

In this case the string vector is converted to integer directly using as.integer. However, for negative numbers the first element in the vector will be a minus sign: "-". This causes some trouble, e.g.: as.numeric(c("-",1,2,3)) will return NA 1 2 3 and a warning message. To circumvent this, remove the NA and then multiply the first element with -1 before taking the sum.


1

RProgN, 30 Bytes

] '' . ] '-?.' | sum _ \ L + +

Explination

]               # Clone the input
                #
'' . ]          # Convert it to a string, then clone it again.
'-?.' | sum     # Split it into chunks via the pattern '-?.' (A - if there is one, followed by a single character). Sum the resulting array.
_               # Floor the value, purely because I hate floats.
\ L + +         # Swap the top value with the value underneith it, to work with the string again. Get it's length, add the top, middle, and bottom, which is now the length, the sum and the input respectively.

Try it Online!



1

AWK, 64 63 61 bytes

{s=j=0;for(;j++<n=split($1,a,"");s+=$1>0||j-2?a[j]:-a[j]);$0+=n+s}1

Try it online!

TIO link has 6 extra bytes s=j=0; to allow for multi-line input. This is the shortest method I could come up with. I'm curious if it can be done shorter in AWK.

Saved 2-bytes, thanks Kevin


1
Can't $0=n+s+$0 be golfed to $0+=n+s (-2 bytes)?
Kevin Cruijssen

You are absolutely right @KevinCruijssen . Silly me.
Robert Benson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.