นับโดยไม่ต้อง 3


45

พื้นหลัง

เมื่อฉันอยู่ในโรงเรียนประถมเราเคยเล่นเกมในชั้นเรียนคณิตศาสตร์ที่มีดังต่อไปนี้

เด็กทุกคนนั่งอยู่ในวงกลมขนาดใหญ่และผลัดกันนับเริ่มต้นจาก1

อย่างไรก็ตามต้องข้ามตัวเลขต่อไปนี้ขณะนับ:

  • เบอร์ที่มีหลายรายการที่ 3
  • ตัวเลขที่มี3ในการแทนทศนิยม

ตัวเลข 15 อันดับแรกที่เด็กควรพูดคือ

1 2 4 5 7 8 10 11 14 16 17 19 20 22 25

เมื่อใดก็ตามที่ใครบางคนผิดตัวเลข - พูดหมายเลขที่ไม่ได้อยู่ในลำดับหรือข้ามหมายเลขนั่นคือ - เขาถูกนำออกจากวงกลม สิ่งนี้จะดำเนินต่อไปจนกว่าจะมีเด็กเหลือเพียงคนเดียว

งาน

คุณเล่นเกมนี้ไม่ดีคุณจึงตัดสินใจโกง เขียนโปรแกรมหรือฟังก์ชั่นที่ให้ลำดับของตัวเลขคำนวณหาลำดับถัดไป

คุณไม่ต้องจัดการกับตัวเลขที่ไม่สามารถแสดงได้โดยใช้ชนิดตัวเลขดั้งเดิมของภาษาของคุณโดยที่โปรแกรมของคุณทำงานอย่างถูกต้องจนถึงอินพุต251และอัลกอริทึมของคุณทำงานกับอินพุตขนาดใหญ่โดยพลการ

อินพุตและเอาต์พุตสามารถใช้ฐานใดก็ได้ที่สะดวก

เมื่อคุณต้องปกปิดรหัสของคุณมันจะต้องสั้นที่สุด ความจริงแล้วนี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ

  1 ->   2
  2 ->   4
 11 ->  14
 22 ->  25
 29 ->  40
251 -> 254

5
ฉันรู้สึกเหมือนเรามีความท้าทายเช่นนี้ ...
Conor โอไบรอัน

5
เป็นเสมอ7ที่ข้ามเมื่อฉันเล่นมัน แต่คุณจะพูดอย่างอื่นแทนแทนที่จะไปที่หมายเลขต่อไปในบรรทัด
mbomb007

12
@ mbomb007: เมื่อฉันเล่นคุณจะไม่ถูกลบออกจากแวดวง แต่คุณจะดื่ม แต่นั่นไม่ได้อยู่ในโรงเรียนประถม อย่างไรก็ตามการได้รับมากกว่า 80 นั้นเป็นไปไม่ได้โดยเฉพาะหลังจากชั่วโมงแรก
tomasz


4
@ mbomb007: นั่นจะขึ้นอยู่กับการพิสูจน์สิ่งที่คุณกำลังดื่ม
tomasz

คำตอบ:


21

Brachylogขนาด 10 ไบต์

<.='e3:I'*

ลองออนไลน์!

คำอธิบาย

(?)<.                Output > Input
    .=               Assign a value to the Output
    . 'e3            3 cannot be an element of the Output (i.e. one of its digits)
        3:I'*(.)     There is no I such that 3*I = Output

3
คำตอบเช่นนี้มีความสวยงามดังนั้นใน Brachylog :)
Emigna

3
@Emigna มันแทบจะไม่รู้สึกกอล์ฟพอเพราะบางครั้งมันอธิบายถึงความท้าทายโดยตรง เป็นกรณีที่มากของคำตอบในภาษาที่ :)
Fatalize

14

JavaScript (ES6), 30 ไบต์

f=n=>++n%3*!/3/.test(n)?n:f(n)

ทั้งดัชนี 2 และดัชนี 3 คืนค่าหมายเลข 4 ด้วยฟังก์ชันนี้
nl-x

1
@ nl-x ใช่เพราะ 4 เป็นหมายเลขถัดไปในลำดับหลังจากทั้ง 2 และ 3 มันไม่ได้ถูกทำดัชนี มันเป็นเพียงตัวเลขถัดไปในลำดับ
ETHproductions

ฉันคิดว่าฉันเริ่มเข้าใจแล้ว ... สิ่งที่ไม่ดีของฉัน
nl-x

8

J, 24 ไบต์

3(]0&({$:)~e.&":+.0=|)>:

วิธีการตรงไปข้างหน้าที่ทำซ้ำไปข้างหน้าจากอินพุตnจนกว่าจะพบหมายเลขถัดไปที่ถูกต้องตามกฎ

แบบฟอร์มห้ารอยยิ้ม$:, :), 0=, และ=|>:

การใช้

   f =: 3(]0&({$:)~e.&":+.0=|)>:
   (,.f"0) 1 2 11 22 29 251
  1   2
  2   4
 11  14
 22  25
 29  40
251 254

คำอธิบาย

3(]0&({$:)~e.&":+.0=|)>:  Input: integer n
                      >:  Increment n
3                         The constant 3
 (                   )    Operate dyadically with 3 (LHS) and n+1 (RHS)
                    |       Take (n+1) mod 3
                  0=        Test if equal to 0
             &":            Format both 3 and n+1 as a string
           e.               Test if it contains '3' in str(n+1)
                +.          Logical OR the results from those two tests
  ]                         Right identity, gets n+1
   0&(   )~                 If the result from logical OR is true
       $:                     Call recursively on n+1
      {                       Return that as the result
                            Else act as identity function and return n+1

ดี J อาจเป็นภาษาการเขียนโปรแกรมที่ยิ้มง่ายที่สุด
อดัม

8

Python 2, 73 66 43 ไบต์

ขอบคุณ xnor ที่บอกฉันว่าฉันโง่โดยใช้ตัวแปร 2 ตัวและขอบคุณ Mitch Schwartz ด้วย

x=~input()
while'3'[:x%3]in`x`:x-=1
print-x

1
การอัพเดตสองตัวแปรดูซับซ้อนเกินไป x=input()+1 while'3'[:x%3]in`x`:x+=1 print xฉันคิดว่าคุณเพียงแค่ต้อง
xnor

@xnor โอ้ใช่ฉันโง่ฉันไม่รู้ว่าทำไมฉันถึงทำอย่างนั้น
Daniel

ปรับปรุงไบต์หนึ่งโดยเริ่มต้นด้วยลบแทนการเพิ่มและการพิมพ์x=~input() -x
Mitch Schwartz

1
@Artyer นั่นเป็นเพียง 1 ใน 3 ข้อผิดพลาดในการแก้ไขนั้น
Mitch Schwartz

1
@Dopapp การแก้ไขปัจจุบัน (ไม่เว้นวรรค) คือ 43 ไบต์? mothereff.in/…
Artyer


7

Perl, 19 ไบต์

18 รหัสไบต์ + 1 -pสำหรับ

++$_%3&&!/3/||redo

การใช้

perl -pe '++$_%3&&!/3/||redo' <<< 8
10

perl -pe '++$_%3&&!/3/||redo' <<< 11
14

1
@ dan1111 มันเป็น Perl คุณคาดหวังอะไร ความชัดเจน?
Erik the Outgolfer

1
@EriktheGolfer คืออะไร นี่คือคำจำกัดความของ "รหัสเอกสารด้วยตนเอง"

@ dan1111 ดูเหมือนว่าคุณรู้จัก Perl ฉันไม่รู้ว่า Perl ทำงานอย่างไรเพราะความแปลกประหลาดที่โด่งดังของมัน
Erik the Outgolfer

@ dan1111 ขอบคุณ! ค่อนข้างมีความสุขกับระยะเวลาที่มันเปิดออก!
Dom Hastings

1
@ DomHastings ดีใน PPCG เราใช้ Perl เป็นระดับสูงสุดของความประหลาดและ Jelly / Actually / O5AB1E เป็นระดับสูงสุดของความยุ่งเหยิง ดูเหมือนว่าคุณยังไม่เคยเห็นนี้ความท้าทายแล้ว :)
เอริก Outgolfer

6

Java 8, 57 56 55 50 ไบต์

ขอบคุณ @Numberknot เป็นเวลา 1 ไบต์ ขอบคุณ @Kevin Cruijssen สำหรับ 5 ไบต์

i->{for(;++i%3<1|(i+"").contains("3"););return i;}

มันคือ Function<Integer, Integer>

คำอธิบาย

การใช้งานแบบไร้เดียงสาที่เพิ่มขึ้นเพียงจนกว่าจะถึงจำนวนที่ยอมรับได้

ชั้นทดสอบ

public class CodeGolf {

    public static void main(String[] args) {
        Function<Integer, Integer> countingGame = i->{for(;++i%3<1|(i+"").contains("3"););return i;};
        int val = 1;
        for (int i = 0; i < 10; i++) {
            System.out.print(val + " ");
            val = countingGame.apply(val);
        }
    }

}

เอาต์พุตของคลาสทดสอบ:

1 2 4 5 7 8 10 11 14 16

2
คุณสามารถใช้|แทน||
Numberknot

1
@ หมายเลขฉันไม่มีความคิดผู้ประกอบการระดับบิตที่ทำหน้าที่เป็นคนตรรกะในบริบทบางอย่าง! ขอบคุณ!
Socratic ฟีนิกซ์

1
ทำไมdo-while? ปกติสำหรับ for-loop จะสั้นกว่า: i->{for(;++i%3<1|(i+"").contains("3"););return i;}( 50 bytes )
Kevin Cruijssen

@KevinCruijssen ดี ... ฉันคิดว่าการเปรียบเทียบwhileและdo-whileและพวกเขาทั้งสองให้คะแนนฉันเหมือนกัน แต่ฉันชอบวิธีการdo-whileดู ... ฉันไม่คิดว่าจะใช้forวง ... ขอบคุณ!
Socratic Phoenix

5

Japt, 18 ไบต์

°U%3*!Us f'3 ?U:ßU

ทดสอบออนไลน์

ในที่สุดฉันก็มีโอกาสใช้ß:-)

มันทำงานอย่างไร

                    // Implicit: U = input integer
°U%3                // Increment U, and take its modulo by 3.
     !Us f'3        // Take all matches of /3/ in the number, then take logical NOT.
                    // This returns true if the number does not contain a 3.
    *               // Multiply. Returns 0 if U%3 === 0  or the number contains a 3.
             ?U     // If this is truthy (non-zero), return U.
               :ßU  // Otherwise, return the result of running the program again on U.
                    // Implicit: output last expression

5

PowerShell v2 +, 46 ไบต์

for($a=$args[0]+1;$a-match3-or!($a%3)){$a++}$a

รับอินพุต$args[0]เพิ่ม1บันทึกลงใน$aเริ่มforลูป เงื่อนไขทำให้ลูปไปในขณะที่$a-match3(การจับคู่ regex) -or $a%3เป็นศูนย์ ( !ซึ่งเป็น1) $a++ห่วงก็เพิ่มขึ้น ในตอนท้ายของลูปเราเพียงวาง$aบนไพพ์ไลน์Write-Outputเกิดขึ้นเมื่อโปรแกรมเสร็จสมบูรณ์

ตัวอย่าง

PS C:\Tools\Scripts\golfing> 1,2,11,22,29,33,102,251,254|%{"$_ --> "+(.\count-without-three.ps1 $_)}
1 --> 2
2 --> 4
11 --> 14
22 --> 25
29 --> 40
33 --> 40
102 --> 104
251 --> 254
254 --> 256

4

R, 46 ไบต์

n=scan()+1;while(!n%%3|grepl(3,n))n=n+1;cat(n)

ผมคิดว่าการกลับค่า (มากกว่าการพิมพ์ที่ stdout) ที่ได้รับอนุญาตเพื่อให้คุณสามารถบันทึกไบต์ 5 โดยมีเพียงแทนn cat(n)
rturnbull

4

Python 2, 49 44 42 ไบต์

f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~x

รายการ Python อื่น ๆ ชนะสิ่งนี้ (แก้ไข: ไม่ได้อีกแล้ว :-D) แต่ฉันโพสต์ไว้เพราะฉันชอบวิธีแบบเรียกซ้ำ ขอบคุณ Mitch Schwarz และ Erik the Golfer ที่ช่วยฉันทำสิ่งนี้ให้สั้นลง


1
คุณสามารถทำเช่นนี้ในหลาม f=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x2: หากคุณต้องการที่จะให้งูใหญ่ 3 คุณสามารถกอล์ฟสุดท้ายx+1ไป-~xและลบพื้นที่
Erik the Outgolfer

@EriktheGolfer ขอบคุณ! ฉันจะเปลี่ยนเป็น Python 2 เนื่องจากสั้นกว่า
0WJYxW9FMN

42: f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~xและf=lambda x:f(x+1)if'3'[:~x%3]in`~x`else-~x
มิทช์ชวาร์ตซ์



3

C #, 56 , 51 ไบต์

นี่เป็นคำย่อที่น่าประหลาดใจสำหรับคำตอบ C #!

x=>{while(++x%3<1|(x+"").Contains("3"));return x;};

คุณสามารถทำให้มันลดลงเหลือ 43 ถ้าคุณทำให้มันวนซ้ำt=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x; ใน Visual Studio คุณเพียงแค่ต้องกำหนดตัวแปรและตั้งค่าให้เป็นโมฆะFunc<int, int> t = null;แล้วกำหนดฟังก์ชั่นวนซ้ำในบรรทัดต่อไปนี้
Grax32

ปัญหาคือว่าถ้าฉันทำให้มันซ้ำแล้วซ้ำอีกฉันต้องนับฟังก์ชั่นและคำจำกัดความประเภท
Morgan Thrapp

มีที่ไหนที่ฉันสามารถไปดูแนวทางเหล่านี้ได้หรือไม่? ฉันพบว่าการเล่นกอล์ฟ C # ทำให้เกิดความสับสนที่นี่
Grax32

@Grax โดยทั่วไปคุณต้องใส่รหัสที่จำเป็นสำหรับรหัสเพื่อให้ทำงานยกเว้นการกำหนดให้กับชื่อในกรณีของฟังก์ชันที่ไม่เกิดซ้ำ ฉันไม่รู้ว่าคุณจะพบแนวทางที่เป็นรูปธรรมได้อย่างไร
Morgan Thrapp

@MorganThrapp โปรดตรวจสอบคำตอบของฉัน C # กับ recursion ที่ 49 ไบต์ :)
lee

3

Haskell, 50 48 ไบต์

f n=[x|x<-[n..],mod x 3>0,notElem '3'$show x]!!1

ลองใช้กับ Ideone ที่บันทึกไว้ 2 ไบต์ขอบคุณที่@Charlie ฮาร์ดิ้ง

ทางเลือก: (50 ไบต์)

g=f.(+1)
f n|mod n 3<1||(elem '3'.show)n=g n|1<3=n

1
นอกจากนี้ยังมี 50 until(\x->mod x 3>0&&notElem '3'(show x))succ.succไบต์:
nimi

3

Pyth, 11 ไบต์

f&-I`T3%T3h

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

f&-I`T3%T3hQ   implicit Q at the end
f         hQ   find the smallest integer T >= input + 1 which fulfills:
  -I`T3           T is invariant under removing the digit 3
 &                and
       %T3        T mod 3 leaves a positive remainder


2

Ruby, 47 ไบต์

i=gets.to_i;i while(i+=1)%3==0||"#{i}"=~/3/;p i

ฉันรู้สึกเหมือนว่าสามารถเล่นกอล์ฟต่อไปได้


คุณสามารถใช้iแทน"#{i}"
Mhmd

2

MATL , 14 ไบต์

`Qtt3\wV51-hA~

ลองออนไลน์!

คำอธิบาย

`       % Do...while
  Q     %   Add 1. Takes input implicitly in the first iteration
  tt    %   Duplicate twice
  3\    %   Modulo 3
  wV    %   Swap, string representation
  51-   %   Subtract 51, which is ASCII for '3'
  h     %   Concatenate
  A~    %   True if any result was 0. That indicates that the number
        %   was a multiple of 3 or had some '3' digit; and thus a 
        %   new iteration is needed

2

เขาวงกต , 117 102 ไบต์

?       """""""""""_
):_3    (         0/{!@
;  %;:}_';:_3-_10 1
"  1            %;_
""""_""""""""{;;'

ลองออนไลน์!

เขาวงกตเป็นภาษาโปรแกรมสองมิติแบบกองซ้อนและที่ทางแยกทิศทางจะถูกกำหนดโดยส่วนบนสุดของสแต็ก (บวกไปทางขวา, ลบไปทางซ้าย, ศูนย์ไปตรง) มีโปรแกรมหลักสองโปรแกรมในโปรแกรมนี้ ครั้งแรก mods อินพุตจำนวนเต็ม 3 และเพิ่มขึ้นถ้า 0 ที่สองตรวจสอบซ้ำ ๆ ว่าหลักสุดท้ายคือ 3 (โดยการลบ 3 และ modding โดย 10) แล้วหารด้วย 10 เพื่อรับตัวเลขสุดท้ายใหม่


2

PHP, 60 55 54 46 ไบต์

ต้องขอบคุณ @ user59178 สำหรับการลบทิ้งสักสองสามไบต์ @AlexHowansky ต่อหนึ่งไบต์ @Titus อีกสองสามไบต์

for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;

-rเรียกว่าจากบรรทัดคำสั่งด้วย วิธีการที่ไร้เดียงสาที่วนซ้ำในขณะที่ตัวเลขนั้นเป็นผลคูณของ 3 หรือมี 3 ในหลัก


1
คุณสามารถบันทึก 7 ไบต์โดยเพียงแค่ใช้โปรแกรมรับอินพุตจากบรรทัดคำสั่งมากกว่าฟังก์ชั่น: for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;มันอาจเป็นไปได้ที่จะทำได้ดีขึ้นโดยการกำหนด$iในขณะที่ใช้มันเช่นกัน
user59178

@ user59178 ฉันคิดว่าฟังก์ชั่นต้องส่งคืน $ i
Xanderhall

คำถามส่วนใหญ่มีความยืดหยุ่นในการดำเนินการอินพุตและเอาต์พุตตราบใดที่มีการให้และรับสิ่งที่ถูกต้อง นอกจากนี้เมื่อดูคำตอบในภาษาอื่น ๆ ส่วนใหญ่เลือกที่จะพิมพ์ไปยัง stdout
user59178

บันทึกไบต์ด้วยstrpos(_.$i,'3')
Alex Howansky

บันทึกหนึ่งไบต์ด้วย%3<1, หนึ่ง51แทน'3', อีกสองด้วยstrstr($i)แทนที่จะเป็นstrpos(_.$i)และอีกสองโดยแลกเปลี่ยน|ตัวถูกดำเนินการในรุ่นที่สอง: <?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;-> 48 ไบต์
Titus

2

PHP, 47 41 ไบต์

ได้รับแรงบันดาลใจจากแซนเดอร์ฮอลล์ แต่สุดท้ายความคิดล่าสุดก็ปรับคำตอบของตนเอง

while(strstr($n+=$n=&$argn%3,51));echo$n;

หรือ

while(strpbrk($n+=$n=&$argn%3,3));echo$n;

นี้จะใช้ประโยชน์จากความจริงที่ว่าใส่เป็นยังมาจากลำดับ: สำหรับการโมดูโลใหม่คือ$n%3==1 2สำหรับการโมดูโลใหม่คือ$n%3==2 ไม่เคยเกิดขึ้น4-3=1$n%3==0

ทำงานเป็นท่อที่มี-Rหรือลองพวกเขาออนไลน์


2

APL (Dyalog Unicode) , 33 28 27 19 ไบต์SBCS

1∘+⍣{('3'∊⍕⍺)<×3|⍺}

ลองออนไลน์!

-6 ขอบคุณAdám -8 ขอบคุณ ngn

คำอธิบายเก่า:

1-⍨g⍣((×3|⊢)>'3'∊⍕)∘(g←+∘1)
                       +∘1   curry + with 1, gives the increment function
                             increments the left argument so we do not return the number itself
                    (g   )  assign to "g"
                            compose g with the repeat
                            does parsing the argument to a string...
             '3'            ...contain '3'?
        3|⊢                  residue of a division by 3
         )                 direction (0 if 0, 1 if greater, ¯1 is lower)
     (      >     )          and not (we want the left side to be 1, the right side 0)
   g                        repeat "g" (increment) until this function is true ^
1-⍨                          afterwards, decrement: inversed -

APL (Dyalog Extended) , 23 17 ไบต์SBCS

1∘+⍣(3(×⍤|>∊⍥⍕)⊣)

ลองออนไลน์!

ขอบคุณAdám -6 ขอบคุณ ngn

คำอธิบายเก่า:

0+⍣(3(×⍤|>∊⍥⍕)⊢)⍢(1+⊢)⊢
0                        the left argument (⍺)
 +⍣(3(×⍤|>∊⍥⍕)⊢)         the left function (⍺⍺)
                 (1+⊢)   the right function (⍵⍵)
                             (increments its argument)
                        the right argument (⍵)
                             (just returns the input)
                        under:
                             calls (⍵⍵ ⍵) first, which increments the input
                             also (⍵⍵ ⍺) which gives 1
                             then calls (⍺incremented ⍺⍺ incremented)
                             afterwards, does the opposite of ⍵⍵, and decrements the result
                         fixpoint: repeats the left operation until the right side is truthy
 +                       calls + with incremented and the input (so, 1+input)
   (3(×⍤|>∊⍥⍕)⊢)         right operation
    3                    on its left, "3"
                        on its right, the current iteration
      ×⍤|                divisibility check: × atop |
        |                    starts with 3|⊢ (residue of ⊢/3)
      ×                      then returns the direction (0 if 0, 1 if greater, ¯1 is lower)
          ∊⍥⍕            contains 3:
                           stringifies both its arguments (3 and ⊢)
          ∊⍥                checks for membership
         >               divisibility "and not" contains 3

2

Perl 6 , 27 25 24 ไบต์

{max $_+1...{!/3/&$_%3}}

ลองออนไลน์!

พบว่าจำนวนแรกมีขนาดใหญ่กว่าการป้อนข้อมูลที่ไม่ได้มีสามและมีส่วนที่เหลือเมื่อ moduloed โดย 3. ผมหวังที่จะทำอะไรบางอย่างแฟนซีที่มีสภาพเหมือนแต่มันไม่ได้ทำงานร่วมกับ!/3/&*%3!:(

คำอธิบาย:

{                      }   # Anonymous code block
     $_+1                  # From the input+1
         ...               # Get the series
            {         }    # That ends when
             !/3/            # The number does not contain a 3
                 &           # and
                  $_%3       # The number is not divisible by 3
 max                       # And get the last element of the series


1

ไขว้กันเหมือน 30 ไบต์

in v
?v$>1+d3,qds:3@cQm*
;\$o

ลองออนไลน์!

คำอธิบาย

1: การเริ่มต้น

in v

สิ่งนี้จะแปลงinput เป็นnumber จากนั้นลงไป ( v)

2: วนรอบ

?v$>1+d3,qds:3@cQm*
   >                 go right!              [n]
    1+               add 1                  [n+1]
      d3,            duplicate and mod 3    [n+1, (n+1)%3]
         qd          reverse and duplicate  [(n+1)%3, n+1, n+1]
           s         cast to string         [(n+1)%3, n+1, `n+1`]
            :3@c     count numbers of "3"   [(n+1)%3, n+1, `n+1`.count(3)]
                Qm*  negate and rotate      [n+1, continue?]
?v                   terminate if continue
  $                  drop continue

3: ขั้นสุดท้าย

;\$o
 \$o  drop and output
;     terminate

1

แบตช์, 93 ไบต์

@set/pn=
:l
@set/an+=1,r=n%%3
@if %r%==0 goto l
@if not "%n:3=%"=="%n%" goto l
@echo %n%

ใช้อินพุตบน STDIN


1

CJam, 19 ไบต์

ri{)__3%!\`'3e=e|}g

ออนไลน์

คำอธิบาย:

ri{)__3%!\`'3e=e|}g
r                   Get token
 i                  Convert to integer
  {              }  Block
   )                 Increment
    _                Duplicate
     _               Duplicate
      3              Push 3
       %             Modulo
        !            NOT gate
         \           Swap
          `          String representation
           '3        Push '3'
             e=      Count occurrences
               e|    OR gate
                  g While popped ToS is true

หากมีการขอคำอธิบายอย่างละเอียดน้อยกว่าฉันจะทำสิ่งนี้:

ri{)__3%!\`'3e=e|}g
ri                  Get integer
  {              }  Block
   )                 Increment
    __               Triplicate
      3%!            Test non-divisibility with 3
         \           Swap
          `'3e=      Count occurrences of '3' in string repr
               e|    OR gate
                  g While popped ToS is true

1

Pyth, 19 ไบต์

JhQW|!%J3/`J\3=hJ;J

ชุดทดสอบ

ฉันแน่ใจว่าฉันสามารถเล่นกอล์ฟนี้ได้ ... มันเหมือนกับคำตอบ CJam ของฉัน

คำอธิบาย:

JhQW|!%J3/`J\3=hJ;J
  Q                 Evaluated input
 h                  Increment
J                   Assign J to value
       J            Variable J
        3           Value 3
      %             Modulo
     !              Logical NOT
           J        Variable J
          `         String representation
            \3      Value "3"
         /          Count occurrences
    |               Logical OR
               h    Increment
                J   Variable J
              =     Apply function then assign
                 ;  End statement block
                  J Variable J

ฉันโพสต์วิธีแก้ปัญหาที่สั้นกว่า อย่างไรก็ตามนี่เป็นเคล็ดลับสำหรับวิธีการของคุณ: Jอย่าใช้ตัวแปร Qคุณสามารถเพิ่ม และถ้าคุณทำมันอย่างชาญฉลาดคุณสามารถอินไลน์การดำเนินการเข้าสู่เงื่อนไขในขณะที่: W|!%=hQ3/Q \ 3; Q`
Jakube

ขออภัย:W|!%=hQ3/`Q\3;Q
Jakube

@Jakube ตัวแปรไม่เพียงเพิ่มขึ้น แต่ยังขอบคุณ
Erik the Outgolfer

1

Clojure 73 ไบต์

(fn c[n](let[m(inc n)](if(or(=(rem m 3)0)(some #(=\3 %)(str m)))(c m)m)))

วนซ้ำในขณะที่ nหารด้วย 3 หรือประกอบด้วย 3 ในการแทนค่าสตริง แม้ว่าฉันจะใช้การเรียกซ้ำแบบไม่เพิ่มประสิทธิภาพ แต่ก็สามารถจัดการกับ 2999999 เป็นอินพุตได้ดังนั้นจึงควรใช้ได้

Ungolfed

(defn count-without-3 [n]
  (let [m (inc n)]
    (if (or (= (rem m 3) 0)
            (some #(= \3 %) (str m)))
      (count-without-3 m)
      m)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.