Đừng cho tôi năm!


38

Câu hỏi:

Bạn sẽ được cung cấp số nguyên bắt đầu và kết thúc của một chuỗi và sẽ trả về số nguyên trong đó không chứa chữ số 5. Các số bắt đầu và kết thúc nên được bao gồm!

Ví dụ:

1,9 → 1,2,3,4,6,7,8,9 → Kết quả 8

4,17 → 4,6,7,8,9,10,11,12,13,14,16,17 → Kết quả 12

50,60 → 60 → Kết quả 1

-59, -50 → → Kết quả 0

Kết quả có thể chứa năm.

Số bắt đầu sẽ luôn nhỏ hơn số kết thúc. Cả hai số cũng có thể âm!

Tôi rất tò mò về giải pháp của bạn và cách bạn giải quyết nó. Có lẽ ai đó của bạn sẽ tìm thấy một giải pháp toán học thuần túy dễ dàng.

Chỉnh sửa Đây là một thử thách golf-code, vì vậy mã ngắn nhất sẽ thắng.


3
@betseq: Đó là những người thân thiết; nhưng cái này có một phạm vi biến (và không yêu cầu modulo).
Tít

4
Tôi muốn giới thiệu mã ngắn nhất là tiêu chí chiến thắng và thẻ golf mã (tôi thậm chí không phát hiện ra rằng nó không phải!). Ngoài ra, có lẽ bạn nên đặt một trường hợp thử nghiệm kéo dài 50 hoặc 500; cũng có thể một cái kéo dài -50, và một cái kéo dài 0 sẽ là một ý kiến ​​hay.
Jonathan Allan

1
@Jonathan ALLan: Tôi sẽ cập nhật các ví dụ.
Arasuvel

4
Trường hợp thử nghiệm : 50, 59 -> 0.
Zgarb

14
Bạn nói: "Số bắt đầu sẽ luôn nhỏ hơn số kết thúc." nhưng một trong những ví dụ của bạn (-50, -59) mâu thuẫn trực tiếp với điều này
theonlygusti

Câu trả lời:


21

JavaScript (ES6), 36 33 byte

Đưa đầu vào với cú pháp currying (a)(b).

a=>F=b=>b<a?0:!/5/.test(b)+F(b-1)

Định dạng và nhận xét

a =>                 // outer function: takes 'a' as argument, returns F
  F = b =>           // inner function F: takes 'b' as argument, returns the final result
    b < a ?          // if b is less than a
      0              //   return 0
    :                // else
      !/5/.test(b) + //   add 1 if the decimal representation of b does not contain any '5'
      F(b - 1)       //   and do a recursive call to F with b - 1

Các trường hợp thử nghiệm


(Tôi thường thích testhơn execkhi bạn chỉ cần một boolean.)
Neil

@Neil Điều đó thực sự có ý nghĩa hơn. Cập nhật.
Arnauld

Lưu ý: Tôi không thể tìm thấy bất kỳ mẹo nào về cú pháp cà ri ES6, vì vậy tôi đã viết một .
Arnauld

5
@TheLethalCoder b<acó mặt để ngăn chặn đệ quy sau khi đếm qua tất cả các số từ bđến a, vì vậy việc loại bỏ nó sẽ chỉ gây ra đệ quy vô hạn.
Sản phẩm ETH

1
@HristiyanDodov Chức năng bên ngoài giấu tên mất anhư là đối số và trả về Fchức năng, do đó mất bnhư là đối số và - như bạn nhận thấy - được gọi là đệ quy để lặp từ bđể a, incrementing một truy cập cho tất cả các số nguyên không chứa một 5trong số thập phân của họ đại diện.
Arnauld

17

Thạch , 8 7 byte

-1 byte nhờ Dennis (sử dụng thực tế là lập chỉ mục thành một số coi số đó là danh sách thập phân)

rAw€5¬S

Dùng thử trực tuyến!

Làm sao?

rAw€5¬S - Main link: from, to    e.g. -51, -44
r       - range(from, to)        e.g. [-51,-50,-49,-48,-47,-46,-45,-44]
 A      - absolute value         e.g. [51,50,49,48,47,46,45,44]
  w€    - first index of... for €ach (0 if not present)
    5   - five                   e.g. [1,1,0,0,0,0,2,0]
     ¬  - logical not            e.g. [0,0,1,1,1,1,0,1]
      S - sum                    e.g. 5

* Nguyên tử giá trị tuyệt đối, Alà cần thiết vì một số âm được đưa vào danh sách thập phân có các mục âm, không ai trong số đó sẽ là một 5(ví dụ đã cho sẽ đếm tất cả tám thay vì hai).


rAw€5¬Stiết kiệm một byte.
Dennis

@Dennis cảm ơn! Mô tả của tôi "coi số đó là danh sách thập phân" có chính xác không?
Jonathan Allan

2
Khá nhiều. wđưa ra một đối số nguyên cho các chữ số thập phân của nó.
Dennis


13

2sable , 6 5 byte

Đã lưu một byte nhờ Adnan

Ÿ5¢_O

Hãy thử trực tuyến!

Giải trình

 Ÿ      # inclusive range
  5¢    # count 5's in each element of the range
    _   # negate
     O  # sum

Lưu ý: Điều này hoạt động do một lỗi trong ¢việc làm cho hàm áp dụng chính nó cho từng phần tử thay vì đếm các phần tử phù hợp trong danh sách.


Bạn có thể loại bỏ `vì nó hoạt động tương tự trên các mảng: p.
Ad Nam

@Ad Nam: Cảm ơn! Tôi sẽ kiểm tra nhưng quên mất;)
Emigna

9

Python2, 59 55 52 51 47 43 42 byte

f=lambda a,b:a<=b and-(`5`in`a`)-~f(a+1,b)

Một giải pháp đệ quy. Cảm ơn @xnor đã cho tôi động lực để tìm giải pháp bằng cách sử dụng các toán tử logic! Ngoài ra, nhờ vào @JonathanAllan@xnor cho hướng dẫn tôi và chặt byte 43-42!

Các nỗ lực khác ở 43 byte

f=lambda a,b:a<=b and-~-(`5`in`a`)+f(a+1,b)
f=lambda a,b:a<=b and 1-(`5`in`a`)+f(a+1,b)

Sẽ if!`x`.count('5')làm việc?
Tít

2
@Titus Python có nottoán tử !bằng các ngôn ngữ giống như C, nhưng phải mất 3 byte :(
Yytsi

1
Hãy suy nghĩ về việc sử dụng ngắn mạch logic với andor.
xnor

1
Yup, được thực hiện độc đáo! Bây giờ hãy nghĩ về việc rút ngắn điều đó not.
xnor

1
Bạn thật sự rất thân thiết! Hãy tiếp tục thử công cụ.
xnor


6

05AB1E , 8 7 6 byte

Đã lưu một byte nhờ Adnan

Ÿ5.å_O

Hãy thử trực tuyến!

Giải trình

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum

05AB1E cũng có vector hóa å, đó là , vì vậy bạn có thể làm Ÿ5.å_Ocho 6 byte.
Ad Nam

negateý nghĩa -n, hay n==0?1:0?
Sản phẩm ETH

@ETHproductions: Xin lỗi, điều đó không rõ ràng. Tôi có nghĩa là phủ định logic, vì vậyn==0?1:0
Emigna

6

Bình thường, 9 8 byte

Đã lưu một byte nhờ FryAmTheEggman!

lf-\5T}E

Giải trình:

        Q # Input
      }E  # Form an inclusive range starting from another input
          #   order is reversed, but doesn't matter
 f-\5T    # Filter by absence of '5'
l         # Count the number of elements left

Hãy thử trực tuyến!


5

Perl 6 , 23 byte

{+grep {!/5/},$^a..$^b}

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

{                     }  # A lambda.
              $^a..$^b   # Range between the two lambda arguments.
  grep {!/5/},           # Get those whose string representation doesn't match the regex /5/.
 +                       # Return the size of this list.

5

Haskell , 39 byte

s!e=sum[1|x<-[s..e],notElem '5'$show x]

Hãy thử trực tuyến! Sử dụng:

Prelude> 4 ! 17
12

Giải trình:

             [s..e]                     -- yields the range from s to e inclusive
          x<-[s..e]                     -- for each x in this range
          x<-[s..e],notElem '5'$show x  -- if the char '5' is not in the string representation of x
       [1|x<-[s..e],notElem '5'$show x] -- then add a 1 to the resulting list      
s!e=sum[1|x<-[s..e],notElem '5'$show x] -- take the sum of the list

4

R, 33 byte

f=function(x,y)sum(!grepl(5,x:y))

Sử dụng:

> f=function(x,y)sum(!grepl(5,x:y))
> f(40,60)
[1] 10
> f(1,9)
[1] 8
> f(4,17)
[1] 12



4

PHP 7.1, 57 55 byte

for([,$a,$b]=$argv;$a<=$b;)$n+=!strstr($a++,53);echo$n;

Chạy với php -r '<code>' <a> <b>


Đây không phải là cú pháp PHP7.1?
vào

@aross: Chính là nó. Nhưng PHP 7.1 cũ hơn 5 giờ ( xuất hiện vào tháng 12, 1 )
Tít

1
tất nhiên, tôi chỉ hỏi vì tôi đã quen chỉ định phiên bản nếu là 7 trở lên. Đó cũng là loại quy ước dành cho Python
từ

1
Công ước cho PHP - theo như tôi đã thấy - là sử dụng phiên bản mới nhất trừ khi có quy định khác.
Tít

Tôi không nghĩ nhiều người có phiên bản nhỏ mới nhất. Mẫu số ít phổ biến nhất tại thời điểm này có lẽ sẽ là 5,5. Cá nhân tôi đang sử dụng FC 25 (được coi là khá tiên tiến), hiện đang phân phối PHP 7.0. Nếu bạn đang ở trên Windows, có lẽ bạn cần cập nhật thủ công.
vào

4

Toán học, 46 44 42 byte

Cảm ơn alephalpha và DavidC vì đã tiết kiệm được 2 byte mỗi cái!

Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&

Hàm không tên lấy hai đối số nguyên và trả về một số nguyên. IntegerDigits@Range@##chuyển đổi tất cả các số giữa các đầu vào thành danh sách các chữ số; FreeQ@5kiểm tra những danh sách đó để quyết định cái nào không chứa cái nào 5. Sau đó Boolechuyển đổi booleans thành số không và số không, và tính Trtổng các kết quả.

Các giải pháp khác (44 và 47 byte):

Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&

IntegerDigits@x~FreeQ~5xác định xem danh sách các chữ số của một số có miễn phí 5s hay không và Count[Range@##,x_/;...]&tính xem có bao nhiêu số giữa các đầu vào vượt qua bài kiểm tra đó.

Tr[Sign[1##&@@IntegerDigits@#-5]^2&/@Range@##]&

1##&@@IntegerDigits@#-5lấy danh sách các chữ số của một số, trừ 5 từ tất cả chúng và ghép các câu trả lời lại với nhau; Sign[...]^2sau đó chuyển đổi tất cả các số khác không thành 1.


1
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
DavidC

1
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
alephalpha

3

Ruby, 36 35 byte

->a,b{(a..b).count{|x|!x.to_s[?5]}}

Thx IMP1 cho -1 byte


1
Điều này không trả về danh sách mà không có các số chứa 5, thay vì kích thước của danh sách đó?
IMP1

Bạn nói đúng, tôi đã sao chép / dán phiên bản sai.
GB

1
Bạn cũng có thể sử dụng ?5( '5'ký tự) thay vì /5/ trong tìm kiếm để lưu một byte.
IMP1

3

Java 7, 80 78 byte

int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

Ung dung:

int c(int a, int b){
  int r = 0;
  for (; a <= b; ) {
    r += ("" + a++).contains("5")
          ? 0
          : 1;
  }
  return r;
}

Mã kiểm tra:

Hãy thử nó ở đây.

class M{
  static int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

  public static void main(String[] a){
    System.out.println(c(1, 9));
    System.out.println(c(4, 17));
  }
}

Đầu ra:

8
12

3

PowerShell, 42 41 byte

param($a,$b)$a..$b|%{$z+=!($_-match5)};$z

Được gọi từ dòng lệnh là. \ No5s.ps1 1 20


1
Bạn có thể thả dung lượng để lưu một byte. Với mô hình regex đúng số, bạn không cần một dấu phân cách (ví dụ, -replace3hay -split1hay -notmatch5).
admBorkBork

À, tốt, cảm ơn @AdmBorkBork
mcmurdo

2

Python 2, 61 56 byte

lambda a,b:len([n for n in range(a,b+1) if not"5"in`n`])

-5 byte nhờ tukkaaX


Đừng nản lòng! Vui chơi và thử thách bản thân là điều quan trọng. Bạn có thể xóa hai khoảng trắng tại not "5" in:) Ngoài ra, nếu bạn đang sử dụng Python2, bạn có thể bao quanh xbằng `` ngoặc kép, thay vì thực hiện str(x).
Yytsi

@TuukkaX Cảm ơn! cũng đã xóa không gian giữa trong và `
x`

Bạn có thể loại bỏ []. Bạn cũng không cần không gian trước if.
Dennis

@Dennis Tôi đã thử điều đó rồi, nhưng nó phàn nàn rằng "đối tượng của loại 'trình tạo' không có len ()".
Yytsi

@TuukkaX Phải. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))hoạt động mặc dù. tio.run/nexus/ Kẻ
Dennis

2

Swift 52 byte

($0...$1).filter { !String($0).contains("5") }.count

Vì thử thách của bạn là một thử thách codegolf, bạn nên bao gồm cả bytecount của bạn. Ngoài ra, trong codegolf (ít nhất là ở đây), yêu cầu tất cả các chương trình là thực sự tranh chấp (ví dụ: tên hàm của bạn có thể chỉ là một ký tự, chức năng thực tế của bạn có thể được giảm xuống thành một dòng). Tôi không biết Swift, bạn có thể phải sửa tôi về mọi thứ.
clismique

2

Mẻ, 95 byte

@set/an=0,i=%1
:g
@if "%i%"=="%i:5=%" set/an+=1
@set/ai+=1
@if %i% leq %2 goto g
@echo %n%

Vòng lặp thủ công tiết kiệm một số byte bởi vì dù sao tôi cũng cần bộ đếm vòng lặp trong một biến.


2

PHP, 56 byte

for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;

Chạy như thế này:

php -r 'for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;' 1 9 2>/dev/null;echo
> 8

Một phiên bản cho PHP 7.1 sẽ là 53 byte (tín dụng cho Titus):

for([,$i,$e]=$argv;$i<=$e;)trim(5,$i++)&&$x++;echo$x;

Giải trình

for(
  $i=$argv[1];          # Set iterator to first input.
  $i<=$argv[2];         # Loop until second input is reached.
)
  trim(5,$i++) && $x++; # Trim string "5" with the characters in the
                        # current number; results in empty string when
                        # `5` is present in the number. If that is not
                        # the case, increment `$x`

echo$x;                 # Output `$x`

Ah dang tôi quên mất trimthông số thứ hai một lần nữa.
Tít

2

"Giải pháp toán học thuần túy dễ dàng" của CJam, 60

{{Ab5+_,\_5#)<\9e]);_4f>.m9b}%}:F;q~_:z$\:*0>{((+F:-}{F:+)}?

Dùng thử trực tuyến

Nó nhận các số theo thứ tự bất kỳ, trong một mảng.

Giải trình:

Một vấn đề cốt lõi là tính f (n) = số lượng không phải là 5 số từ 1 đến n (đã bao gồm) cho bất kỳ n dương nào. Và câu trả lời là: lấy các chữ số thập phân của n, thay thế tất cả các chữ số sau 5 chữ số đầu tiên (nếu có) bằng 9, sau đó thay thế tất cả các chữ số 5..9 bằng 4..8 (giảm) và chuyển đổi từ cơ sở 9. Ví dụ: 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Về cơ bản, mỗi vị trí chữ số có 9 giá trị có thể chấp nhận và 5xxxx tương đương với 49999 vì không có số hợp lệ nào giữa chúng.

Khi chúng tôi giải quyết điều này, chúng tôi có một vài trường hợp: nếu các số đầu vào (giả sử a và b, a <b) dương (đúng), thì kết quả là f (b) -f (a-1). Nếu chúng âm, thì chúng ta có thể lấy các giá trị tuyệt đối, sắp xếp lại chúng và sử dụng cùng một phép tính. Và nếu a <= 0 <= b thì kết quả là f (-a) + f (b) +1.

Trước tiên, chương trình thực hiện hàm F như được mô tả ở trên (nhưng được áp dụng cho từng số trong một mảng), sau đó đọc đầu vào, chuyển đổi các số thành giá trị tuyệt đối và sắp xếp lại chúng, và sử dụng một trong 2 phép tính ở trên, dựa trên việc a * b> 0 ban đầu.


Không "thuần" nhưng phương pháp hay. ở đây, nhận +1 :)
Matthew Roh

@MatthewRoh cảm ơn, nhưng ý bạn là gì không thuần khiết? Đó là một giải pháp thực hiện các phép tính toán học trực tiếp trên các số đầu vào mà không lặp qua phạm vi. Bạn còn mong đợi gì nữa?
aditsu

2

Python 2 , 54 byte

i,j=input();k=0
while i<=j:k+=not"5"in`i`;i+=1
print k

Hãy thử trực tuyến!

Không phải câu trả lời Python ngắn nhất Sử dụng cùng một thuật toán mà là một cách thực hiện khác với vòng lặp while và không phải là hàm lambda.


Nó là một chương trình và không phải là một chức năng và nó sử dụng trong khi thay vì cho. Điều gì không khác biệt? OK, nó vẫn đang tìm kiếm một chuỗi "5" bên trong đầu vào tăng dần, đã đồng ý. Có cách nào tốt hơn?
ElPedro

Đó chính xác là những gì nó là và đó là lý do tại sao nó là trì hoãn. Xin lỗi, có lẽ nên làm cho nhận xét của tôi khác đi.
ElPedro

Cùng một thuật toán, cách thực hiện khác nhau. Không có vấn đề với ý kiến ​​của bạn. Đó có phải là từ tốt hơn?
ElPedro

Đó là, có :) Tôi sẽ xóa những bình luận này để làm cho phần bình luận trông sạch sẽ.
Yytsi

1

Java 7, 77 byte

Đây là một cải tiến của Câu trả lời của Kevins , nhưng vì tôi chưa có tiếng tăm để bình luận, nên câu trả lời mới này sẽ phải làm.

Vì vậy, những gì tôi đã làm là:

  • Thay thế các indexOfcâu lệnh bằng contains(-1 byte)
  • Di chuyển phần tăng của vòng lặp for vào câu lệnh có điều kiện (-2 byte)

vòng lặp for ( 77 byte ):

int c(int a,int b){int r=1;for(;a++<b;)r+=(""+a).contains("5")?0:1;return r;}

đệ quy ( 79 byte ):

int d(int r,int a,int b){r+=(""+a).contains("5")?0:1;return a!=b?d(r,a+1,b):r;}

Đầu ra:

8
12

8
12

Kiểm tra nó ở đây !


Chào mừng bạn đến với PPCG! Những phát hiện đẹp trong một câu trả lời đã được đánh golf khá độc đáo. Tôi không biết nhiều về Java nhưng không nên (""+a).contains("5")?0:1thay thế bằng !(""+a).contains("5")?
Christoph

1
@Christoph thật đáng buồn là không, vì trong Java một boolean thực sự chỉ là một boolean. Vì vậy, một hoạt động ternary là cách duy nhất để đi.
Tobias Meister

Hừm mà buồn. Thế còn (""+a).contains("5")||r++?
Christoph

1
@Christoph cũng không hoạt động, bởi vì bạn không thể tự mình có biểu thức boolean. Tôi đã cố gắng làm cho nó hoạt động ở những nơi khác (như khai báo for-loop) nhưng không thành công lắm. Ý tưởng hay tho;)
Tobias Meister

1

C #, 67 byte

a=>b=>{int c=0;for(;a<=b;)c+=(a+++"").Contains("5")?0:1;return c;};

Tôi đã hy vọng sử dụng for(int c=0;...)nhưng sau đó nó không biên dịch được vì lợi nhuận nằm ngoài phạm vi choc
TheLethalCoder

1

JavaScript (ES6), 58 56 49 byte

let f =

(s,e)=>{for(c=0;s<=e;)c+=!/5/.test(s++);return c}

console.log(f(1, 9));
console.log(f(4, 17));
console.log(f(-9, -1));

Chơi golf 7 byte nhờ ETHproductions .


1
Bạn có thể sử dụng c+=!/5/.test(s++)để lưu một vài byte :-)
Sản phẩm ETH

Cảm ơn rất nhiều! Tôi đã phải xóa golf của tôi, mặc dù. Tôi đã rất tự hào về họ. :(
Hristiyan Dodov

Tôi nghĩ bạn có thể sử dụng currying tức là `s => e =>`
TheLethalCoder

Các đầu câu trả lời sử dụng được tách lạng bộ cú pháp. Tôi sẽ không chỉnh sửa vì nó sẽ trở nên giống nhau. Cảm ơn đã chỉ ra rằng, mặc dù!
Hristiyan Dodov

1

MATL , 10 byte

&:!V53-!As

Hãy thử trực tuyến!

Giải trình

        % Implicitly grab two input arguments
&:      % Create an array from [input1....input2]
!V      % Convert to a string where each number is it's own row
53-     % Subtract ASCII '5' from each character.
!A      % Detect which rows have no false values (no 5's). Returns a logical array
s       % Sum the logical array to get the # numbers without 5's
        % Implicitly display the result

1

C #, 77 byte

(n,m)=>{var g=0;for(var i=n;i<m+1;i++)g+=(i+"").Contains("5")?0:1;return g;};

Cuộc gọi lambda ẩn danh.

Sử dụng n(số đầu tiên) và m(số cuối) làm đầu vào, sau đó kiểm tra thông qua ngăn chặn chuỗi ( "".Contains("")).


Tôi không phải là người bỏ phiếu, nhưng modulo 5 không phải là giải pháp chính xác cho thách thức do OP đưa ra. Nó nên loại trừ bất cứ thứ gì có chứa chữ số 5trong số của nó, vì vậy 10(câu trả lời của bạn sẽ không được tính).
Kevin Cruijssen

@KevinCruijssen Đã sửa.
devR Rich

Điều này không biên dịch như gphải được khởi tạo khi được nêu vì nó được đặt tên varđể bạn cần var g="";và bạn có thể sử dụng currying tức làn=>m=>
TheLethalCoder

Ngoài ra, điều này xuất ra danh sách không phải là số đếm
TheLethalCoder

1
@KevinCruijssen Với các chỉnh sửa của bạn, đây thực chất là câu trả lời của tôi ...
TheLethalCoder

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.