มันอยู่ในชื่อ ...
รับข้อมูลเป็นจำนวนเต็มบวกn>=12
และ ... ทำในสิ่งที่ชื่อกล่าว
บางกรณีทดสอบ
12 -> 912
13 -> 11713
14 -> 6314
15 -> 915
16 -> 3616
17 -> 15317
18 -> 918
19 -> 17119
20 -> 9920
40 -> 1999840
100-> 99999999999100
รับข้อมูลเป็นจำนวนเต็มบวกn>=12
และ ... ทำในสิ่งที่ชื่อกล่าว
บางกรณีทดสอบ
12 -> 912
13 -> 11713
14 -> 6314
15 -> 915
16 -> 3616
17 -> 15317
18 -> 918
19 -> 17119
20 -> 9920
40 -> 1999840
100-> 99999999999100
คำตอบ:
&>00p0v<!%g0<
v%"d":_>1+:0^
>00g->#^_:0v
0g10g-#^_.@1>
>0p:55+/\:v>
^1+g01%+55_$^
สามารถจัดการได้ถึงn = 70 อย่างน้อยหลังจากนั้นบางค่าจะเริ่มล้นขนาดสแต็คเซลล์ในการใช้งานส่วนใหญ่และในกรณีที่ไม่ใช้งานจะใช้เวลานานมากจนไม่คุ้มที่จะรอดู
ได้รับข้อ จำกัด เหล่านั้นเราไม่ได้รำคาญพยายามที่จะจับค่าของnมากกว่า 99 ซึ่งหมายความว่าเราสามารถทดสอบได้ง่ายขึ้นถ้าค่าในปลายnด้วยโดยเพียงแค่การเปรียบเทียบค่าโมดูโล 100 n
ด้านล่างคือรายละเอียดเพิ่มเติมของรหัส
อ่านnจาก stdin และบันทึกในหน่วยความจำ
เริ่มต้นค่าทดสอบvเป็น 0 และเริ่มลูปหลักเพิ่มค่าvล่วงหน้า
ทดสอบว่าv%n == 0
และถ้าไม่กลับไปที่จุดเริ่มต้นของลูปหลัก
ทดสอบว่าv%100 == n
และถ้าไม่กลับไปที่จุดเริ่มต้นของลูปหลัก
รวมตัวเลขในvด้วยการเพิ่มv modulo 10 ซ้ำแล้วหารvด้วย 10
ทดสอบว่าผลรวมเท่ากับnและถ้าไม่กลับไปที่จุดเริ่มต้นของลูปหลัก
มิฉะนั้นเอาท์พุทvและออก
[NI«ÐIÖsSOIQ*#
คำอธิบาย
โซลูชันที่ต้องใช้ส่วนนำหน้าขนาดใหญ่จะหมดเวลาใน TIO
[ # start a loop
NI« # append input to current iteration number
Ð # triplicate
IÖ # is the first copy evenly divisible by input?
sSOIQ # is the digit sum of the second copy equal to the input?
* # multiply
# # if true, break loop
# output the third copy
f=(s,p=0,a=p+s)=>a%s|eval([...a].join`+`)-s?f(s,p+1):a
<input type=number min=12 oninput=o.textContent=f(this.value)><pre id=o>
รับอินพุตเป็นสตริง ต้องการเบราว์เซอร์ที่รองรับการเรียกซ้ำแบบหางเพื่อให้ได้ผลลัพธ์ที่มากขึ้น แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Arnauld
eval([s,...a].join`-`)?
จะใช้งานได้แม้ว่าจะไม่สั้นกว่านี้ ...
||
ไม่มีผมก็ลืมไปว่าผมสามารถทำเช่นนั้นด้วย
a₁.;A×?≜ẹ+
นี่คือการส่งฟังก์ชั่นที่รับอินพุตผ่าน.
และสร้างเอาต์พุตผ่านทาง?
(ตรงกันข้ามกับแบบแผนทั่วไปฟังก์ชั่น Brachylog ทั้งหมดมีสองอาร์กิวเมนต์ที่แน่นอนซึ่งอาจเป็นอาร์กิวเมนต์อินพุตหรือเอาต์พุต เราไม่ปกติพิจารณาการประชุมสำหรับการใช้งานข้อโต้แย้งที่จะมีความเกี่ยวข้องที่ PPCG
รุ่นก่อนหน้าของการแก้ปัญหานี้มีกรณีพิเศษ ( Ḋ|
เช่น "ส่งกลับตัวเลขอย่างแท้จริง") สำหรับตัวเลขหลักเดียว แต่คำถามชัดเจนว่าคุณไม่ต้องตรวจสอบว่า (ขอบคุณ @DLosc สำหรับจับนี้) ดังนั้นฉันจึงลบ มัน. (วิธีแก้ปัญหาที่เขียนไว้จะไม่ทำงานบนหลักเดียวเนื่องจาก Brachylog จะไม่พิจารณา 1 ว่าเป็นไปได้สำหรับการไม่รู้จักในการคูณเพื่อป้องกันการวนซ้ำไม่สิ้นสุดการคูณนั้นเป็นการสุ่มโดยพลการ)
ดังนั้นคำตอบนี้ไปสำหรับการแปลข้อกำหนดโดยตรง เริ่มต้นด้วย?
(เอาท์พุท / หมายเลขที่เรากำลังค้นหา; Brachylog predicate เริ่มต้นโดยปริยายเสมอ?
) เราใช้a₁.
เพื่อยืนยันว่ามันมี.
(อินพุต) เป็นคำต่อท้าย จากนั้น;A×?
หมายความว่าเราสามารถคูณ ( ×
) ผลลัพธ์ด้วยบางสิ่ง ( ;A
) เพื่อสร้าง?
(ผลลัพธ์) สุดท้ายẹ+
ผลรวม ( +
) ตัวเลข ( ẹ
) ของ?
และมีค่าเริ่มต้นการยืนยันโดยปริยายในตอนท้ายของทุกโปรแกรม Brachylog .
ว่าผลสุดท้ายผลิต ดังนั้นในคำอื่น ๆ โปรแกรมนี้คือ " .
เป็นคำต่อท้ายของ?
, .
คูณด้วยบางสิ่งบางอย่าง?
, .
เป็นผลรวมของหลัก?
"ซึ่งใกล้เคียงกับการแปลตามตัวอักษรของโปรแกรมดั้งเดิม
≜
เป็นสิ่งจำเป็นสำหรับความต้องการหลักผลรวมที่จะบังคับใช้ ฉันถือว่าบางอย่างเกี่ยวกับẹ
ไม่ชอบสิ่งแปลกปลอมดังนั้น≜
บอกให้ Brachylog ใช้วิธีการอันโหดร้ายสำหรับส่วนนั้นของโปรแกรมมากกว่าพีชคณิต
f n=[x|x<-[n,n+lcm n(10^length(show n))..],sum[read[j]|j<-show x]==n]!!0
โปรดทราบว่าจำนวนที่พบลบด้วย n จะต้องเป็นตัวคูณของทั้ง n และ 10 ^ ความยาว (n)
แรงบันดาลใจจาก Laikoni และมนุษย์โดยสิ้นเชิง
lcm n(10^length(show n))
เป็นlcm(10^length(show n))n
1 byte
/o
\i@/!w?+.?~\ & /-$K..?\ L z $ /K
โปรแกรมนี้มีการผสมผสานที่ดีและการโต้ตอบระหว่าง Cardinal (การประมวลผลจำนวนเต็ม) และโหมด Ordinal (การประมวลผลสตริง)
กรอบปกติสำหรับความท้าทายด้วย I / O ทศนิยมซึ่งทำงานส่วนใหญ่ในโหมด Cardinal:
/o
\i@/...
และโปรแกรมจริง:
! Store the input N on the tape.
We'll use an implicit zero on top of the stack as our iterator variable X,
which searches for the first valid result.
w Store the current IP position on the return address stack. This marks
the beginning of the main search loop. We can avoid the divisibility
test by going up in increments of N. To check the other two
conditions, we'll use individual conditional loop ends that skip to
the next iteration. Only if both checks pass and all loop ends are
skipped will the search terminate.
?+ Increment the iterator X by N.
. Duplicate X.
?~ Put a copy of N underneath.
\ Switch to Ordinal mode.
& Implicitly convert X to a string, then fold the next command over its
characters, i.e. its digits. Here, "fold" means that each character
is pushed to the stack in turn, followed by one execution of that
next command.
/ Switch back to Cardinal mode (this is not a command).
- Fold subtraction over the digits. This implicitly converts each
digit back to its numerical value and subtracts it from N. If the
digit sum of X is equal to N, this will result in 0.
$K Jump back to the w if the digit sum of X isn't N.
.. Duplicate X twice.
? Get a copy of N.
\ Switch to Ordinal mode.
L Shortest common superstring. Implicitly converts X and N to strings
and gives the shortest string that starts with X and ends with N.
This will be equal to X iff X already ends with N. Call this Y.
z Drop. If X contains Y, this deletes everything up to and including
Y from X. This can only happen if they are equal, i.e. if X ended
with N. Otherwise X remains unchanged.
$ Skip the next command if the string is empty, i.e. if X ended with N.
/ Switch back to Cardinal mode.
K Jump back to w if X didn't end with N.
-26 ขอบคุณ JollyJoker
-7 ขอบคุณ JollyJoker อีกครั้ง
-11 ขอบคุณ Oliver Grégoire
a->{for(int i=a;!(""+a).endsWith(""+i)|i!=(""+a).chars().map(x->x-48).sum();a+=i);return a;}
ต้องรัก Java! มันอาจเป็นไปได้ว่าฉันใช้วิธีที่ไม่มีประสิทธิภาพ แต่ไม่มีฟังก์ชัน checksum ในตัวและการแปลง double เป็น String เพื่อตรวจสอบการสิ้นสุดของจำนวนไบต์ค่าใช้จ่าย ...
Ungolfed:
a->{ //input n (as integer)
for (int i = a; //initiate loop
!("" + a).endsWith("" + i) //check if the calculated number ends with the input
| i != ("" + a).chars().map(x -> x - 48).sum(); //check if the checksum is equal to the input
a += i) //for every iteration, increase i by the input to save checking for divisibility
; //empty loop body, as everything is calculated in the header
return a; //return number
}
(""+i).endsWith(""+a)
ควรทำงาน.
n/=10
แทนn=n/10
เช่นกัน นอกจากนี้i+=a
ในการวนรอบเพื่อให้คุณสามารถข้ามการตรวจสอบการหาร
(t=#;While[Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#,t+=#];t)&
-18 ไบต์จาก @MartinEnder
นี่คือรุ่นอื่นจาก Martin Ender
วิธีนี้สามารถไปถึงn=40
(41 เกินขีด จำกัด การทำซ้ำเริ่มต้น)
#//.t_/;Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#:>t+#&
n <= sys.maxint
วิธีการแก้ปัญหานี้อนุมานว่า
n=x=input()
while sum(map(int,str(x)))-n*str(x).endswith(`n`):x+=n
print x
str(x)
ด้วยx
ในเครื่องหมายขีดหลังสองครั้งเพื่อบันทึก 6 ไบต์ (คุณจะหลีกเลี่ยงการย้อนกลับภายในเห็บย้อนหลังได้อย่างไร)
`
เครื่องหมายแบ็กสแลชข้างใน backticks
L
ซึ่งสามารถเลอะอัลกอริทึม
ฉันลองด้วยความยาวและ% 1,000 แต่หมดเวลา
-2 ไบต์ด้วย steadybox
s,i,j;f(n){for(j=0;s^n|j%100!=n;)for(s=0,i=j+=n;i;i/=10)s+=i%10;j=j;}
using System.Linq;
n=>{for(int i=n;!(""+n).EndsWith(""+i)|n%i>0|(""+n).Sum(c=>c-48)!=i;n++);return n;}
(""+n)
ในบางแห่งและที่n.ToString()
อื่น ๆn=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}
บันทึก 20 ไบต์
n%100
? เกิดอะไรขึ้นถ้าn>100
?
f(x)=(n=x;while(sum(digits(n))!=x||x!=n%(10^length("$x")));n+=x;end;n)
¬x=(n=x;while sum(digits(n))!=x||!endswith("$n","$x");n+=x;end;n)
คุณสามารถบันทึก 5 ไบต์ด้วยสิ่งนี้ ลองออนไลน์!
T!y%a&$+y=aY++i.ay
อัลกอริทึมแรงบันดาลใจจากคำตอบของ Emignaคำตอบของลองออนไลน์!
a is 1st cmdline arg, i is 0, y is "" (implicit)
T Loop until
!y%a& y%a is 0 and
$+y=a sum of y is a:
++i Increment i
Y .a and yank (i concat a) into y
y After the loop exits, autoprint y
f n=[x|x<-[0,n..],sum[read[d]|d<-show x]==n,mod x(10^length(show n))==n]!!0
คำอธิบาย:
f n=[x| ]!!0 -- Given input n, take the first x
x<-[0,n..], -- which is a multiple of n,
sum[read[d]|d<-show x]==n, -- has a digital sum of n
mod x(10^length(show n))==n -- and ends in n.
ฉันสงสัยว่าส่วน "ลงท้ายด้วยn
" สามารถย่อให้สั้นลงได้ไหม ฉันพยายามshow n`elem`scanr(:)""(show x)
ด้วย แต่ก็นานกว่า
f n=[i|i<-[n,n+10^length(show$n)..],i`mod`n<1,sum[read[j]|j<-show$i]==n]!!0
for($n=$i=$args[0];$i%$n-or$i-notmatch"$n$"-or([char[]]"$i"-join'+'|iex)-$n){$i++}$i
คำสั่งการก่อสร้างที่เรียบง่าย แต่มีความยาว หมดเวลากับ TIO สำหรับn=100
แต่ถ้าเราตั้งไว้i
ใกล้จะชัดเจนมันจะออกผลลัพธ์ได้อย่างถูกต้อง
นี่เป็นเพียงการfor
วนรอบแบบง่าย ๆที่จะดำเนินต่อไปตราบใดที่เงื่อนไขใด ๆ เป็นจริง เงื่อนไขสามข้อคือ 1) $i%$n
คือเรามีส่วนที่เหลือ 2) $i-notmatch"$n$"
คือมันไม่ได้ regex ตรงกับตัวเลขสองหลักสุดท้าย และ 3) ([char[]]"$i"-join'+'|iex)-$n
คือตัวเลขที่รวมเข้าด้วยกันไม่เท่ากับ$n
(นี่ตรวจสอบโดยการลบง่าย ๆ เพราะค่าที่ไม่ใช่ศูนย์เป็นจริง) $i
ภายในวงที่เรากำลังเพียงแค่การเพิ่ม
ดังนั้นหากเราไม่มีส่วนที่เหลือการจับคู่ regex และตัวเลขเท่ากันทั้งสามเงื่อนไขเป็น$false
และเราออกจากลูป เป็นผลให้เราสามารถออกจาก$i
ท่อและการส่งออกเป็นนัย
while(array_sum(str_split($i+=$n=$argn))-$n|$i%10**strlen($n)-$n);echo$i;
เรียกใช้เป็นท่อด้วย -R
ทำงานเป็นท่อด้วย
วน$i
ซ้ำหลาย ๆ<input>
จนถึงsum_of_digits-<input>
และtail_of_i-$n
เป็นเท็จ i
แล้วพิมพ์
define(d,define)d(i,ifelse)d(s,`i($1,,0,`eval(substr($1,0,1)+s(substr($1,1)))')')d(k,`r($1,eval($2+1))')d(r,`i(s($2),$1,i(regexp($2,$1$),-1,`k($1,$2)',i(eval($2%$1),0,$2,`k($1,$2)')),`k($1,$2)')')d(f,`r($1,1)')
กำหนดแมโครf
ที่คำนวณคำตอบ มันช้าไปหน่อย - ผิดปกติอย่างนั้น - แต่ฉันสัญญาว่ามันใช้ได้
ฉันคิดว่า m4 จะดีเพราะถือว่าเป็นจำนวนเต็มตามค่าเริ่มต้น แต่ถือว่าแย่มาก
def a(n:Int)={val b=math.pow(10,math.ceil(math.log10(n))).##;var c=b+n;while(c%n!=0||(0/:c.toString)(_+_-'0')!=n)c+=b;c}
วิธีนี้ใช้งานได้จนกระทั่งn = 70
หลังจากนั้นจำนวนเต็มจะล้น สำหรับอักขระพิเศษหนึ่งตัวInt
สามารถเปลี่ยนเป็น a Long
และอนุญาตให้คำนวณค่าn > 100
ได้
นี่คือเวอร์ชั่นที่ไม่ได้รับการขึ้นอีกเล็กน้อย:
def golfSourceLong(n: Long): Long = {
val delta = math.pow(10, math.ceil(math.log10(n))).toInt
var current = delta + n
while (current % n != 0 || current.toString.foldLeft(0)(_ + _ - '0') != n) {
current += delta
}
current
}
function(n,d=nchar(n):1){while(sum(D<-F%/%10^((k=nchar(F)):1-1)%%10)-n|any(D[k-d+1]-n%/%10^(d-1)%%10)|F%%n)F=F+n
F}
ฟังก์ชั่น R แย่มาก เพิ่มขึ้นF
(เริ่มต้นที่0
) โดยn
จนกว่าจะพบค่าที่ตรงกับคุณสมบัติที่ต้องการซึ่งจะส่งกลับ การใช้งานany
บนdouble
นิพจน์ส่งคำเตือนสำหรับการวนซ้ำแต่ละครั้งของลูป แต่จะไม่ส่งผลต่อความถูกต้อง
หมดเวลากับ TIO สำหรับอินพุตที่มีขนาดใหญ่พอ (n = 55 หรือสูงกว่า) แต่ควรคำนวณวิธีแก้ปัญหาที่ให้เวลา / พื้นที่เพียงพออย่างถูกต้อง
บันทึก 2 ไบต์ด้วย Xcali ไม่สามารถหาได้ดีกว่านี้
($\=++$t.$_)%$_|$_-eval$\=~s//+/gr.0&&redo}{
คำตอบแรก
$\=++$x.$_;eval$\=~s//+/gr."-$_"|$\%$_&&redo}{
DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#
แก้ไข: บีบอัดเป็นบรรทัดเดียว
คำอธิบาย
DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#
ø1# Evaluate the condition before this and increment a counter until it is met then output the counter
D Digits of incremented variable as a list
S Sum
=³ Equals argument of program?
a Logical and
³ḍ Does arg divide incremented variable?
a Logical and
Dṫ Ḍ Last n digits of inc. var. where n is number of digits in program input
³DLC 1 - (number of digits of program input)
¤ Book ends above nilad
=³ Equals program input?
ฉันใช้เวลาหลายชั่วโมงในการเขียนเพราะฉันเรียนรู้เยลลี่ แต่ตอนนี้ฉันทำแล้วฉันพอใจมาก เป็นเวลานานฉันไม่ได้ตระหนักว่าฉันต้องการ¤
และฉันก็ไม่สามารถทำงานได้ การดูที่ [นี่] [1] รหัสที่อธิบายอย่างดีช่วยให้ฉันปิดผนึกข้อตกลงได้ คำตอบของ Jelly อื่น ๆ จำนวนมากใน PPCG แนะนำฉันด้วย
Javascript, 224 bytes
function getNumber(x){if(x<12){return!1};const sumDigits=(x)=>x.toString().split('').map(Number).reduce((a,b)=>a+b,0);for(let i=2;i<9999;i++){if((x*i-x)%(Math.pow(10,x.toString().length))==0&&sumDigits(x*i)==x){return x*i}}}
Un-golf:
function getNumber(x){
if (x<12) {return false};
const sumDigits = (x) => x.toString().split('').map(Number).reduce((a,b)=>a+b, 0);
for (let i=2; i<9999; i++){
if((x*i-x)%(Math.pow(10, x.toString().length))==0 && sumDigits(x*i)==x){
return x*i;
}
}
}
การใช้งาน: 1. getNumber (12) 2. getNumber (13) 3. ....
getNumber
sumDigits
+^:(((=1#."."0)*:(e.".\.))":)^:_~
~ A = N
+^: ^:_ while(...)A+=N; return A
( ":) A to string
((( "."0) ) ) digits of A
((( 1#. ) ) ) sum
(((= ) ) ) equals N
(( (e.".\.)) ) N is one of the suffixes of A-string
(( *: ) ) not AND
การเตรียมตัวนับซ้ำจะเร็วกว่า ~ 5 เท่า แต่นานกว่า 5 ไบต์:
(]+[((=1#.,.&.":)<:|),~&.":)^:_&1,&":]
เพิ่มขึ้น 100, 27 ไบต์ :
(]+100*(=1#.,.&.":)<:|)^:_~
f=lambda n,x=0:x*(x%n<sum(map(int,`x`))==n==x%10**len(`n`))or f(n,x+n)