มันเป็นจำนวนที่น่าพอใจ?


22

ตัวเลขที่น่าพอใจ (ตามคำจำกัดความนี้) คือตัวเลขที่สามารถส่งผ่านกระบวนการต่อไปนี้ (ลองใช้41802000เป็นตัวอย่าง):

  • แยกตัวเลขที่เหมือนกันต่อท้าย ( 41802000 => [41802, 000])
  • จัดเรียงครึ่งแรกของตัวเลขและรับค่าสูงสุด ( [41802, 000] => [8, 000])
  • ใช้ความยาวขององค์ประกอบสุดท้าย เรียกองค์ประกอบผลลัพธ์AและB ( [8, 000] => A=8, B=3)
  • N B = A สำหรับจำนวนเต็มใด ๆNหรือไม่? ( Trueในตัวอย่างนี้ 2 3 = 8)

หากอินพุตเป็นผลTrueมาจากกระบวนการต่อไปนี้จะถือว่าเป็นที่พอใจ

งานของคุณคือการใช้จำนวนเต็มxและเอาท์พุทไม่ว่าxจะเป็นจำนวนที่ชื่นชอบ คุณสามารถแสดงค่าที่แตกต่างกันสองค่าสำหรับความจริงและเท็จ แต่โปรดระบุสิ่งที่คุณใช้ในคำตอบของคุณ xรับประกันว่าจะมีตัวเลขที่แตกต่างอย่างน้อยสองหลัก (เช่น111เป็นอินพุตที่ไม่ถูกต้อง) เช่นเดียวกับความท้าทายส่วนใหญ่คุณอาจใช้xสายอักขระหรือรายการตัวเลข

นี่คือเพื่อให้รหัสที่สั้นที่สุดในไบต์ชนะ

กรณีทดสอบ

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1

สามารถส่งจำนวนเป็นสตริงได้หรือไม่ (โดยเฉพาะอย่างยิ่งกรณีทดสอบ '234543454545444')
Uriel

@Uriel คุณสามารถป้อนข้อความเป็นสตริง
caird coinheringaahing

3
เป็นข้อเสนอแนะสำหรับการชี้แจง: ฉันจะใช้คำว่า "หลัก" มากกว่า "หมายเลข" เนื่องจากคุณอ้างถึงอักขระทศนิยมโดยเฉพาะซึ่งแยกออกจากค่าตัวเลข
Jonathan Frech

list of digits- นี่จะเป็นรายการของอักขระตัวเลข ASCII หรือรายการจำนวนเต็มตั้งแต่ 0-9
Decurous

1
@ Οurousแล้วแต่คุณ
caird coinheringaahing

คำตอบ:


9

APL (Dyalog)ขนาด 36 ไบต์

{(⊢≡⌊)(⌈/⍎¨⍵/⍨~o)*÷≢⍵/⍨o←⌽⌊\1,2=/⌽⍵}

ลองออนไลน์!

อย่างไร?

เกือบเป็นบทกวี

⌽⍵ - กลับอินพุตหนึ่งครั้ง

1,2=/ - รับรายการความแตกต่าง

⌊\ - เก็บเฉพาะกลุ่มแรก

- และพลิกมันให้เสร็จสมบูรณ์


o←- กําหนดการo,

~o - สลับอันและศูนย์

⍵/⍨ - กรองอินพุตด้วย

⍎¨ - เปลี่ยนผลลัพธ์เป็นรายการของแต่ละหลัก

  • ⌈/- และรับสูงสุด (นั่นคือ)

⍵/⍨o- กรองอินพุตด้วยounalt (ered)

- และใช้ความยาวนั่นก็คือ B

÷ - รับหนึ่งหารด้วยผลลัพธ์นี้

* - และนำ A ไปสู่พลังนั้น


⊢≡⌊ - จำนวนเต็ม?


8

05AB1E , 11 ไบต์

γRćgUZXzm.ï

ลองออนไลน์!

คำอธิบาย

γRćgUZXzm.ï ~ โปรแกรมเต็มรูปแบบ

γ ~ แบ่งเป็นจำนวนหลัก
 ย้อนกลับ
  ć ~ กด [1:], [0] ไปที่สแต็ก
   g ~ ความยาว (จาก [0])
    U ~ กำหนดสิ่งนี้ให้กับตัวแปรจำนวนเต็ม X
     ZX ~ รับสูงสุดโดยไม่ต้องโผล่และกด X
       ZM แน่ ~ 1 / B
         .ï ~ มันเป็นจำนวนเต็มหรือไม่

Emignaบันทึก 1 ไบต์

ขึ้นอยู่กับความจริงที่ว่าถ้าAเป็นจำนวนเต็มบวกNยกกำลังของBดังนั้นN = A 1 / Bดังนั้นมันจะต้องเป็นจำนวนเต็ม


UZXควรทำงานแทนs{θs
Emigna

โปรแกรมขนาด 9 ไบต์ล้มเหลวสำหรับ41902000(ควรเป็นเท็จ)
Zgarb

@Zgarb ใช่ฉันเกือบจะแน่ใจว่ามันจะล้มเหลวดังนั้นฉันลบมัน ... นอกจากนี้ฮ่า ๆเราได้เลขเดียวกันแน่นอน
นาย Xcoder

ล้มเหลวในการ418802000
Okx

8

Haskell , 85 75 72 71 ไบต์

แก้ไข : -10 ไบต์โดยการใส่รายการตัวเลขแทนสตริง ขอบคุณWhatToDo ที่ชี้ให้เห็นว่าสิ่งนี้ได้รับอนุญาต -3 ไบต์ขอบคุณที่แก้ปัญหา Ourous ในการทำความสะอาด -1 ไบต์ขอบคุณที่user28667

f s|(b,a)<-span(==last s)$reverse s=or[n^length b==maximum a|n<-[1..9]]

ลองออนไลน์! รับอินพุตเป็นรายการของตัวเลข ตัวอย่างการใช้งาน: อัตราผลตอบแทนf [4,1,8,0,2,0,0,0]True

คำอธิบาย:

ได้รับการป้อนข้อมูลs=[4,1,8,0,2,0,0,0]เราreverseรายการและแยกองค์ประกอบชั้นนำที่มี:span(==last s) ([0,0,0],[2,0,8,1,4])จับคู่รูปแบบใน(b,a)อัตราผลตอบแทนและb=[0,0,0]a=[2,0,8,1,4]

รายการความเข้าใจor[n^length b==maximum a|n<-[1..a]]การตรวจสอบไม่ว่าจะเป็นจำนวนเต็มใด ๆnในช่วงจาก1การ9ตอบสนองที่เป็นn^length b==maximum an^3=8


คุณโพสต์ของคุณก่อนที่ฉันจะระเบิดและพวกเราก็คล้ายกันดังนั้นลองออนไลน์!
WhatToDo

@ WhatToDo ขอบคุณฉันไม่เห็นรายการของตัวเลขที่ได้รับอนุญาตให้ป้อนข้อมูล
Laikoni

คุณไม่สามารถใช้สูงสุด ไม่จำเป็นต้องตรวจสอบพวกเขาทั้งหมด
ทิม

@ เวลาฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึง การใช้จำนวนสูงสุดของรายการอินพุตทั้งหมดเพื่อรับaจะล้มเหลวในกรณีเช่น477นี้
Laikoni

@Tim ฉันใช้เวลาสูงสุดในการรับbแต่ตรวจสอบทุกจำนวนเต็มnจาก0ถึง9(จากก่อน0ถึงa) นั่นเป็นสเปคเท่าที่ฉันเห็น
Laikoni

5

Haskell , 104 89 ไบต์

@Laikoni พบ a วิธีแก้ปัญหาที่สั้นกว่าแต่นี่เป็นวิธีที่ดีที่สุดที่ฉันสามารถทำได้ ขอบคุณ @Laikoni ที่ให้ฉันรู้ว่าเราสามารถรับรายการตัวเลขเป็นอินพุตได้

import Data.List
(g.length.last<*>maximum.concat.init).group
g b a=any(==a)$(^b)<$>[1..a]

คำอธิบาย:

ลองออนไลน์!


ทำไมต้องใช้any(==a)เมื่อคุณสามารถใช้elem a?
ข้าวสาลีตัวช่วยสร้าง

@WheatWizard ขอบคุณสำหรับคำแนะนำเกี่ยวกับความคิดเห็นที่สองของคุณ: จะเป็นเช่นนี้2888หรือไม่
ข้อบกพร่อง

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

แต่head.maximumยังสั้นกว่าmaximum.concat2 ไบต์และคงการใช้งานไว้
ข้าวสาลีตัวช่วยสร้าง

4

R , 80 ไบต์

function(x)any((0:(m=max((d=rle(rev(utf8ToInt(c(x,''))-48)))$v[-1])))^d$l[1]==m)

ลองออนไลน์!

ใช้utf8ToInt - 48เพื่อแบ่งตัวเลขเป็นตัวเลข สิ่งนี้จะส่งคำเตือนจากการแปลงเป็นสตริง

การใช้ rle รับจำนวนหลักต่อท้ายและค่าสูงสุดของตัวเลขแรก ส่งคืน true หากค่าใด ๆ ในช่วง 0 ถึงค่าสูงสุดถึงกำลังของการนับต่อท้ายเท่ากับค่าสูงสุด

ฉันคิดว่ามีโอกาสในการเล่นกอล์ฟต่อไป แต่นั่นอาจรอจนถึงวันพรุ่งนี้


2
ฉันลบคำตอบของฉันเพราะฉันไม่เห็นว่าการโพสต์ของฉันเป็นเพียงการรวมคำตอบของคุณและ @ NofP ของ: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 ไบต์การxเป็นสตริง)
plannapus

@plannapus โดยส่วนตัวฉันจะยกเลิกการลบมัน มันนับได้ดีกว่าของเราทั้งคู่และไม่ใช่ของจริง
MickyT

@plannapus ฉันเห็นด้วยกับ MickyT!
NofP

@NofP และ MickyT: ตกลงตอนนี้นี่คือ
plannapus

4

เยลลี่ 11 ไบต์

ŒgµṪL9*€fṀL

รับอินพุตเป็นรายการของตัวเลข

ลองออนไลน์!

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

ŒgµṪL9*€fṀL  Main link. Argument: D (digit array)

Œg           Group runs of digits, yielding a run array R.
  µ          Begin a new chain with argument D.
   Ṫ         Tail; remove and yield the last element of D.
    L        Take the length. Let's call it b.
     9*€     Compute [1**b, ..., 9**b].
         Ṁ   Take the maximum run in R, yileding [a, ..., a].
        f    Filter, yielding either [a] (if a = n**b for some n) or [].
          L  Take the length. 

ก่อนที่จะดูคำตอบและโดยที่ไม่รู้เลยว่าเจลลี่ฉันเดาว่าคำตอบของเจลลี่จะมีขนาด 12 ไบต์ ;)
DLosc

4

R, 66 ไบต์

คำตอบนี้เป็นคำตอบผสมของMickyTและNofPไม่มากก็น้อยและตามคำขอของพวกเขานี่คือ:

function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1

มันต้องใช้ x เป็นสตริง

> f=function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1
> f("41802000")
[1] TRUE
> f("100")
[1] TRUE
> f("123456788")
[1] FALSE
> f("451111111")
[1] FALSE
> f("234543454545444")
[1] FALSE
> f("12")
[1] TRUE
> f("41902000")
[1] FALSE

3

JavaScript (ES7), 66 ไบต์

รับอินพุตเป็นสตริงหรืออาร์เรย์ของอักขระ ส่งคืนบูลีน

f=([c,...s],m)=>s.some(n=>n-c)?f(s,c<m?m:c):!(m**(1/-~s.length)%1)

กรณีทดสอบ



3

Python 2 , 95 78 ไบต์

  • ที่บันทึกไว้เจ็ดไบต์ขอบคุณที่ร็อด
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

ลองออนไลน์!


คุณไม่ต้องการการเรียงลำดับคุณสามารถรับค่าสูงสุดและเมื่อคุณได้รับแล้วiคุณสามารถปล่อยให้len ถึง 78 ไบต์
Rod

@ พระเจ้าขอบคุณมาก
Jonathan Frech

2

R , 93 ไบต์

function(x){n=nchar(x)
d=x%/%10^(n:1-1)%%10
i=max(which(d!=d[n]))
max(d[1:i])^(1/(n-i))%%1>0}

ลองออนไลน์!

รหัสจะใช้จำนวนเต็มเป็นอินพุตและส่งกลับค่า FALSE หากตัวเลขเป็นที่พอใจและเป็นอย่างอื่น


2

Python 3 , 88 85 ไบต์

def f(n):p=n.rstrip(n[-1]);a=int(max(p));b=len(n)-len(p);return round(a**(1/b))**b==a

Ungolfed:

def is_pleasing_number( n ):
    prefix = n.rstrip(n[-1])
    a = int(max(prefix))
    b = len(n) - len(prefix)
    return round(a ** (1 / b)) ** b == a
  • อาร์กิวเมนต์อินพุตคาดว่าเป็นสตริงหลัก
  • ผลลัพธ์เป็นอย่างใดอย่างหนึ่ง TrueหรือFalseหรือ
  • คล้ายกับที่ได้รับการพัฒนาอย่างเป็นอิสระจากคำตอบของ Halvardแต่ใช้เลขคณิตจุดลอยตัวในลักษณะที่ไม่ได้รับความผิดพลาดจากการปัดเศษจนกว่าa ** (1 / b)จะถูกปิดอย่างน้อย 0.5 จากb √aซึ่งต้องการค่ามากกว่า 2 53 (หรืออะไรก็ตาม ความยาว Python เกิดขึ้นกับการใช้งานดูsys.float_info)
  • สามารถปรับเปลี่ยนได้เล็กน้อยเพื่อยังคงสามารถทำงานกับฐานหมายเลขโดยพลการระหว่าง 2 และ 36

@ovs: ด้วยการแก้ไขเล็กน้อยใช่ ฟังก์ชั่นจะต้องใช้ฐานเป็นอาร์กิวเมนต์พิเศษและผ่านมันไปสวดของและint range(ในบางจุดมันจะเป็นไปได้ที่จะประเมินช่วงการค้นหาโดยใช้a^(1/b)มากกว่าการคำนวณพลังจำนวนมาก)
David Foerster


1

Ruby , 64 ไบต์

->a{!([a[/(\d)\1*$/].size,$`.chars.max]*?x!~/x1$|^2x[49]|^3x8/)}

อินพุตเป็นสตริงส่งคืนจริงถ้า:

  • B == 1 (ไม่จำเป็นต้องตรวจสอบ A)
  • A == 4 และ B == 2
  • A == 9 และ B == 2
  • A == 8 และ B == 3

ลองออนไลน์!


1

Perl 6 , 55 ไบต์

{m/(\d+?)((\d)$0*)$/;so any(^10)**$1.comb==$0.comb.max}

ลองออนไลน์!

หลังจากการประเมินผลของ regex เริ่มต้น - ซึ่งสามารถประสบความสำเร็จได้ก็ต่อเมื่ออินพุตเป็นจำนวนเต็มบวก - $0มีส่วนเริ่มต้นของตัวเลขและ$1มีตัวเลขซ้ำหลักท้าย

combวิธีโดยไม่ขัดแย้งนำไปใช้กับสตริงส่งกลับรายการของตัวละครซึ่งในบริบทประเมินตัวเลขความยาวของรายการ ดังนั้น$0.comb.maxตัวเลขที่ใหญ่ที่สุดในคำนำหน้าและ$1.combคือความยาวของคำต่อท้าย

จากนั้นเราจะตรวจสอบว่าany(^10)(เช่นทางแยกของตัวเลขตั้งแต่ 0-9) เมื่อยกกำลังของความยาวของคำต่อท้ายหรือไม่นั้นจะเท่ากับตัวเลขที่ใหญ่ที่สุดในคำนำหน้า soกองกำลังประเมินบูลของทางแยกที่เกิดที่อื่นจะเป็นเพียงการปรับตัวของมันเองเป็นค่า truthy แต่ความท้าทายสำหรับการโทรเพียงสองค่าที่แตกต่างกันจะถูกส่งกลับ


นี้เป็นช่วงปลายปี แต่เนื่องจากการป้อนข้อมูลที่รับประกันได้ว่าจะเป็นจำนวนเต็ม regex สามารถใช้แทน. \d
DLosc



1

C # (. NET Core) 132 ไบต์

n=>{int A=0,B=1,s=1,i=n.Length-1;for(;i-->0;)if(n[i]==n[i+1]&s>0)B++;else{A=n[i]>A?n[i]:A;s=0;}return System.Math.Pow(A,1d/B)%1==0;}

ลองออนไลน์!

กิตติกรรมประกาศ

-12 ไบต์ขอบคุณ @KevinCruijssen

DeGolfed

n=>{
    int A=0, // maximum digit
        B=1, // count of trailing identical numbers
        s=1, // 1 if dealing with trailing numbers, 0 otherwise
        i=n.Length-1;

    for(; i-- > 0;)
        if(n[i] == n[i+1] & s > 0)
            B++;
        else
        {
            A = n[i] > A? n[i] : A;
            s = 0;
        }

    return Math.Pow(A, 1d/B) % 1 == 0;
}

ฉันรู้ว่ามันผ่านมานานแล้ว แต่i=n.Length-2;for(;i>=0;i--)สามารถเล่นกอล์ฟได้i=n.Length-1;for(;i-->0;)และ&&สามารถเล่นกอล์ฟ&ได้
Kevin Cruijssen

โอ้และคุณสามารถเล่นกอล์ฟได้อีก 6 ไบต์โดยการลบusing System;และใช้งานSystem.Math.Powโดยตรง
Kevin Cruijssen

สิ่งสุดท้าย. ขณะนี้คุณใช้รายการอักขระ แต่ก็สามารถใช้รายการตัวเลขได้เช่นกัน ซึ่งในกรณีนี้-48สามารถเล่นได้ที่ -3 ไบต์
Kevin Cruijssen

1

Japt , 26 18 ไบต์

ó¶
o l
ñ o n qV v1

ลองออนไลน์!


รับอินพุตเป็นสตริงส่งคืน1สำหรับหมายเลขที่ต้องการ0มิฉะนั้น

คำอธิบายสั้น ๆ :

ó¶

รับอินพุตแรกและแยกตามค่าที่(x,y) => x===yเป็นจริง ยกตัวอย่างเช่นการ'41802000'['4','1','8','0','2','000']

o l

ใช้อาร์เรย์จากขั้นตอนแรกเอาองค์ประกอบสุดท้ายและได้รับความยาวของมันยอมB

ñ o n qV v1

ค้นหาองค์ประกอบที่ใหญ่ที่สุดในอาเรย์ที่เหลือให้ผลAนำไปยังพลังงาน1/Bแล้วส่งคืนถ้าผลลัพธ์หารด้วยหนึ่ง


ครั้งแรกที่ทำงานกับ Japt เปิดรับข้อเสนอแนะมาก ๆ
ปิดการใช้งาน 8 ไบต์ด้วยETHproductions ETHproductions


สวัสดียินดีต้อนรับสู่ Japt! ขอโทษฉันพลาดคำตอบของคุณในตอนแรก เคล็ดลับ: 1) คุณสามารถใช้อัตโนมัติฟังก์ชั่นó¶ที่จะเปิดบรรทัดแรกเข้าเพียง 2) ไม่แน่ใจว่าทำไมคุณมีvในบรรทัดที่สองตามที่มันเป็นเพียงแค่แปลงสตริงเป็นตัวพิมพ์เล็กและไม่มีผลต่อความยาว ;-) 3) คุณสามารถหลีกเลี่ยง!(Uในบรรทัดสุดท้ายโดยการเปลี่ยน%1ไปv1ซึ่งผลตอบแทน1หากวัตถุ หารด้วย 1 หรือ0อย่างอื่นได้
ETHproductions

@ ETHproductions ขอบคุณมากสำหรับความคิดเห็นของคุณขอบคุณจริงๆ ฉันอ่านเกี่ยวกับฟังก์ชั่นอัตโนมัติมาก่อน แต่ฉันยังไม่ได้รับการแขวนขอบคุณมากสำหรับตัวอย่าง ฉันได้รวมการเปลี่ยนแปลงที่เหลือของคุณเข้าด้วยกันซึ่งเพิ่มขึ้นรวมทั้งหมด 8 ไบต์ที่หายไป
นิด


0

ถ่าน 33 ไบต์

≔ESιθ⊞υ⊟θW⁼§υ⁰§θ±¹⊞υ⊟θ¬﹪XI⌈θ∕¹Lυ¹

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ส่งออก a -สำหรับตัวเลขที่ชื่นชอบ คำอธิบาย:

≔ESιθ

แยกอินพุตqเป็นอักขระ

⊞υ⊟θ

ลบอักขระตัวสุดท้ายออกจาก qและดันไปที่u(กำหนดไว้ล่วงหน้าไปยังรายการว่าง)

W⁼§υ⁰§θ±¹⊞υ⊟θ

ป๊อปซ้ำแล้วกดอีกครั้งขณะที่อักขระสุดท้ายของ quเป็นตัวอักษรตัวแรกของ

¬﹪XI⌈θ∕¹Lυ¹

ใช้จำนวนสูงสุดของqและยกกำลังของส่วนกลับของความยาวuแล้วตรวจสอบว่าผลลัพธ์เป็นจำนวนเต็มหรือไม่




0

Java 8, 125 ไบต์

a->{int A=0,B=1,f=1,i=a.length-1;for(;i-->0;)if(a[i]==a[i+1]&f>0)B++;else{A=a[i]>A?a[i]:A;f=0;}return Math.pow(A,1d/B)%1==0;}

ท่าเรือ@ Ayb4btu 's คำตอบ

ลองออนไลน์

คำอธิบาย:

a->{                       // Method with digit-array parameter and boolean return-type
  int A=0,                 //  Maximum digit `A` as specified in the challenge description
      B=1,                 //  `B` as specified in the challenge description
      f=1,                 //  Flag-integer, starting at 1
      i=a.length-1;        //  Index integer `i`
  for(;i-->0;)             //  Loop `i` backwards over the digits (excluding the last)
    if(a[i]==a[i+1]        //   If the current and next digits are the same,
       &f>0)               //   and the flag is still 1
      B++;                 //    Increase `B` by 1
    else{                  //   Else:
      A=a[i]>A?            //    If the current digit is larger than `A` 
         a[i]              //     Replace `A` with the current digit
        :                  //    Else:
         A;                //     Leave `A` the same
      f=0;}                //    Set the flag-integer to 0
  return Math.pow(A,1d/B)  //  Return if `A` ^ (1/`B`)
    %1==0;}                //  is an exact integer


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.