3
\$\begingroup\$

Given a number determine if it is a circular prime.

A circular prime is a prime where if you rotate the digits you still get prime numbers. 1193 is circular prime because 1931 and 9311 and 3119 are all primes.

Input:          Output:
1193            circular
11939           circular
1456            nothing
193939          circular
1111111         nothing
7               circular
23              nothing

Shortest code wins.

\$\endgroup\$
  • 1
    \$\begingroup\$ I don't think this should have the code-challenge tag. \$\endgroup\$ – Cruncher Nov 12 '13 at 19:18
  • 1
    \$\begingroup\$ Not a big deal, but they're sort of disjoint. codegolf.stackexchange.com/tags/code-challenge/info "A code challenge is a competition for creative ways to solve a programming puzzle for an objective criterion other than code size." \$\endgroup\$ – Cruncher Nov 12 '13 at 19:36
  • 4
    \$\begingroup\$ -1 You stated: "Shortest code wins" but awarded the check to a submission that was 4 times as long as the shortest submitted! \$\endgroup\$ – DavidC Nov 14 '13 at 19:50
  • 1
    \$\begingroup\$ My own code returns True if a number is circular, False if a number is not circular. I find that a reasonable alternative to "circular" and "nothing". The shorter solution in J appears to follow the same Boolean convention (True, False). \$\endgroup\$ – DavidC Nov 14 '13 at 22:05
  • 4
    \$\begingroup\$ @DavidCarraher Some problems on this site require specific output. This is one. Deal with it and stop whining. "Oh, poor me, my output 99,98,97... is equivalent to the lyrics of '99 bottles of beer on the wall' but it wasn't an accepted answer!" \$\endgroup\$ – boothby Nov 14 '13 at 22:13

10 Answers 10

2
\$\begingroup\$

GolfScript, 47 characters

:s,,{)s/(+~:P{(.P\%}do(},!"nothing
circular"n/=

Input must be given on STDIN without trailing newline (online example).

\$\endgroup\$
  • \$\begingroup\$ It's beautiful :) \$\endgroup\$ – Quillion Nov 15 '13 at 15:04
6
\$\begingroup\$

J, 47 chars (w/ formatted output)

('nothing';'circular'){~*/1&p:".(|."0 1~i.&#)":

J, 23 chars (boolean only)

*/1&p:".(|."0 1~i.&#)":

": is a string conversion; i.&# produces a range of integers [0,len), and |."0 1~ is a rotation of the string by each successive integer of the range.

". converts the list of rotations back into numbers, 1&p: converts the list of numbers into booleans (i.e. "prime?" predicate), and */ is a multiply reduce over the booleans (i.e. and).

\$\endgroup\$
  • \$\begingroup\$ Wow I really like this :) nicely done \$\endgroup\$ – Quillion Nov 13 '13 at 13:56
  • \$\begingroup\$ Add an {'nothing';'circular' and beat the Python submission :) \$\endgroup\$ – marinus Nov 14 '13 at 23:46
  • 1
    \$\begingroup\$ @marinus Done, though it really hurts my sense of aesthetics... The interface between the human and the program is always the least fun to code. \$\endgroup\$ – rationalis Nov 15 '13 at 4:03
  • \$\begingroup\$ Months after the fact, I finally just realized I could replace [:i.# with i.&#, which was bugging me at the time... L'esprit_de_l'escalier. Take that, GolfScript! \$\endgroup\$ – rationalis Aug 14 '14 at 8:41
5
\$\begingroup\$

Python, 106 chars

p=input();n=`p`
for i in n:
 n=n[1:]+n[0];e=2
 while`e`!=n:p*=int(n)%e;e+=1
print'cniortchuilnagr'[p<1::2]
\$\endgroup\$
  • \$\begingroup\$ I see what you did there with the answer :) very clever \$\endgroup\$ – Quillion Nov 13 '13 at 15:29
  • 2
    \$\begingroup\$ Oh man! I just did mine in Python and I came up with "cniortchuilnagr" independently. \$\endgroup\$ – danmcardle Nov 14 '13 at 3:32
  • 1
    \$\begingroup\$ Whoa! I got the idea from codegolf.stackexchange.com/a/406/9395 \$\endgroup\$ – Daniel Lubarov Nov 14 '13 at 3:38
  • 3
    \$\begingroup\$ You can make this both shorter and correct if you use for i in n... otherwise, this will fail to rule out certain primes with more than 10 digits. \$\endgroup\$ – boothby Nov 14 '13 at 19:02
  • \$\begingroup\$ @boothby good idea, thanks! \$\endgroup\$ – Daniel Lubarov Nov 14 '13 at 19:47
5
\$\begingroup\$

Mathematica 62 61

f@s_ := And @@ PrimeQ[FromDigits@StringRotateLeft[s, #] & /@ Range@9]

Usage

f["1193"]

True

f["11939"]

True

f["1456"]

False

f["193939"]

True

f["1111111"]

False

f["7"]

True

f["23"]

False

\$\endgroup\$
  • 1
    \$\begingroup\$ You can use FromDigits instead of ToExpression. \$\endgroup\$ – alephalpha Nov 13 '13 at 2:27
  • \$\begingroup\$ I had no idea that FromDigits could handle strings! \$\endgroup\$ – DavidC Nov 13 '13 at 2:34
3
\$\begingroup\$

Mathematica, 75 64

And@@PrimeQ[FromDigits/@NestList[RotateLeft,IntegerDigits@#,9]]&
\$\endgroup\$
  • \$\begingroup\$ You can save a few characters by using RotateRight or RotateLeft to rotate the digits. \$\endgroup\$ – DavidC Nov 13 '13 at 0:45
  • \$\begingroup\$ @DavidCarraher: Thanks, it saves quite a few, actually. How at one point I must have thought my elaborate Part trick would be shorter, I find most puzzling, but even now, you're still a good three characters ahead. \$\endgroup\$ – Marcks Thomas Nov 13 '13 at 13:13
3
\$\begingroup\$

Ruby, 110 109 chars

require'mathn'
x=gets.chop.split''
puts (0..x.size).all?{|n|x.rotate(n).join.to_i.prime?}?:circular:'nothing'
\$\endgroup\$
  • 1
    \$\begingroup\$ You can shorten 1 character by using Symbol instead of String for :circular. \$\endgroup\$ – manatwork Nov 15 '13 at 9:31
1
\$\begingroup\$

R, 139

a=scan()
p=0
A=nchar(a)
S=substr
for(i in 1:A){b=as.integer(paste0(S(a,i+1,A),S(a,1,i)));p=p+!sum(!b%%1:b)<3}
c('nothing','circular')[!p+1]
\$\endgroup\$
1
\$\begingroup\$

Python3.3, 160C

def m():
 s=input()
 r=range
 for i in r(len(s)):
  a=int(s)
  if all(a%i for i in r(2,a)):return 0
  s=s[1:]+s[:1]
 return 1 
print("cniortchuilnagr"[m()::2])
\$\endgroup\$
1
\$\begingroup\$

APL, 53

'nothing' 'circular'[1+^/{⌊/⍵|⍨1↓⍳⍵-1}¨⍎¨{⍵⌽∆}¨⍳⍴∆←⍞]
\$\endgroup\$
1
\$\begingroup\$

Smalltalk, 195 chars

[:x|r:=[:n|(n\\10)*(10 raisedTo:n log floor)+(n//10)].s:=OrderedCollection with:x.[(m:=r value:s last)=x]whileFalse:[s add:m].^(s allSatisfy:[:each|each isPrime])ifTrue:['circular']ifFalse:['nothing']]

formatted

[:x|
  r:=[:n|(n\\10)*(10 raisedTo:n log floor)+(n//10)].
  s:=OrderedCollection with:x.
  [(m:=r value:s last)=x]whileFalse:[s add:m].
  ^(s allSatisfy:[:each|each isPrime])ifTrue:['circular']ifFalse:['nothing']]
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.