คุณจะได้รับสตริง มันจะมีจำนวนเต็ม 9 ตัวจาก 0-9 คุณต้องส่งคืนจำนวนเต็มที่หายไป สตริงจะมีลักษณะดังนี้:
123456789
> 0
134567890
> 2
867953120
> 4
คุณจะได้รับสตริง มันจะมีจำนวนเต็ม 9 ตัวจาก 0-9 คุณต้องส่งคืนจำนวนเต็มที่หายไป สตริงจะมีลักษณะดังนี้:
123456789
> 0
134567890
> 2
867953120
> 4
คำตอบ:
+ ความงามต้องขอบคุณ @Sarge Borsch
`99066**2`.strip
99066**2
เป็นวิธีที่สั้นกว่าในการสร้างสตริงที่มี 0 ~ 9
764**4
สามารถบันทึกสองไบต์
764**4
จะหายไป5
, 8
และ9
763**4
=338920744561
lambda s:-int(s,16)%15
วิธีการแก้ปัญหาทางคณิตศาสตร์ ตีความสตริงอินพุตเป็นฐานสิบหกปฏิเสธสตริงนั้นและรับผลลัพธ์โมดูโล 15
⎕D∘~
⎕D
igits D
∘
(ผูกอาร์กิวเมนต์ด้านซ้ายกับฟังก์ชัน dyadic ต่อไปนี้เพื่อสร้างฟังก์ชัน monadic)
~
ยกเว้น [อาร์กิวเมนต์]
⎕D~⊢
⎕D
igits D
~
ยกเว้น
⊢
อาร์กิวเมนต์ที่ถูกต้อง
⎕D~⍞
⎕D
igits D
~
ยกเว้น
⍞
การป้อนอักขระ
บันทึก 10 ไบต์ด้วย DJMcMayhem!
((([]())[]{}){()()({}[()])}{}[{{}}])
ผลรวมของตัวเลขทั้งหมดใน Ascii คือ 525 โปรแกรมนี้จะรวมจำนวนอินพุตและลบออกจาก 525 เพื่อให้ได้ตัวเลขที่หายไป
((([]())[]{}){()()({}[()])}{} )
จะผลักดัน 525 ซึ่งจะใช้ประโยชน์จากความจริงที่ว่าเรารู้ว่าจะมีองค์ประกอบของการป้อนข้อมูล 9 เริ่มต้นด้วย ซึ่งหมายความว่า[]
ประเมินถึง 9 ซึ่งช่วยให้เราได้รับจำนวนมากเช่น 525 อย่างรวดเร็ว
ต่อไปเรามีบิต:
[{{}}]
ซึ่งจะสรุปผลอินพุตและลบออกจากผลรวม
negative(sum(input()))
ไปยังจุดสิ้นสุดคุณสามารถละเมิด nilad ความสูงของกองซ้อนเพื่อดัน 525 ได้ง่ายขึ้น (([][][]()()()){()()({}[()])}{}[{{}}])
ควรประหยัด 10 ไบต์
(477-).sum.map fromEnum
ลองออนไลน์! การใช้งาน: (477-).sum.map fromEnum $ "123456890"
. 477 คือผลรวมของรหัสอักขระของตัวเลข 1 ถึง 9 ยกเว้น 0 ฟังก์ชันที่ไม่ระบุชื่อนี้คำนวณ 477 ลบผลรวมของรหัสอักขระตัวเลขทั้งหมดเพื่อหารหัสที่หายไป
การเปลี่ยนตัวเลขถ่านให้เป็น ints นั้นยาวกว่าหนึ่งไบต์
(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45
ḟ
ที่ใช้และต้นแบบอย่างน้อยสำหรับการย้อนกลับของการขัดแย้งในการ
Ø
= ⎕
, D
= D
, ḟ
= ~
, ตาม⎕D~'867953120'
มา
ผลรวมรหัส ascii และลบจาก 48 * 9 + 45
->s{477-s.sum}
ใช้แบบนี้
f=->s{477-s.sum}
puts f["123456789"]
แก้ไข 1 ไบต์บันทึกขอบคุณ @Neil พร้อมด้วยเคล็ดลับที่ชาญฉลาดกว่า
Xoring ค่าทั้งหมดจาก 1 ถึง 9 ให้ 1 Xor 1 อีกครั้งและผลลัพธ์คือ 0 ดังนั้นหากไม่มีค่าเดียวใด ๆ ผลลัพธ์จะเป็นค่าที่หายไป
s=>eval([1,...s].join`^`)
ทดสอบ
f=s=>eval([1,...s].join`^`)
function go() {
var i=I.value;
O.textContent = f(i)
}
go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>
s=>eval([1,...s].join`^`)
บันทึกเป็นไบต์
-6 ขอบคุณที่ Basic Sunset
-2 ขอบคุณ Martin Ender
.
$*_5$*
+`_1|1_
1
แทนที่ทุกหลักด้วยจำนวนมาก_
และ 5 1
วินาที:
.
$*_5$*
ลบทั้งหมด_
และ a 1
สำหรับแต่ละ:
+`_1|1_
นับจำนวน1
ซ้าย:
1
.
บรรทัดแรกของคำตอบที่สองอาจจะเป็นแค่
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
การ1
ที่จะบันทึกไบต์.)
s=>(15-`0x${s}`%15)%15
คำตอบ Python ของ @ @ พอร์ตของ xnor ยกเว้น JavaScript นั้นมีโอเปอเรเตอร์ที่เหลือมากกว่าโอเปอเรเตอร์โมดูโล่ดังนั้นฉันจึงไม่สามารถทำได้ในขั้นตอนเดียว แก้ไข: บันทึกแล้ว 6 ไบต์ขอบคุณ @Arnauld
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
คุณมีมากเกินไปในความรักกับ +1 ต่อไป
s[0]!='0'
แต่มีคำตอบที่ใช้eval
แล้ว
s=>(15-`0x${s}`%15)%15
อะไร
-[-[->-<],]>++.
ลองมันออกจากที่นี่ วิธีนี้ใช้งานได้กับ Brainfuck มาตรฐาน (เซลล์ 8 บิต) เท่านั้นเนื่องจากอาศัยการห่อหุ้ม
มันเป็นวันที่หายากเมื่อ Brainfuck สามารถแข่งขันได้จริง แต่ความท้าทายนี้เพิ่งเกิดขึ้นกับข้อมูลจำเพาะของ BF ค่อนข้างดี!
แทนที่จะตอบคำถามนี้อย่างตรงไปตรงมาฉันอยากจะทำซ้ำ ๆ ที่ทำไปเพราะฉันคิดว่ามันจะเข้าใจได้ง่ายขึ้น (และน่าสนใจกว่า)
หมายเหตุ: การแก้ปัญหานี้เป็นแรงบันดาลใจส่วนใหญ่มาจากข้าวสาลีของพ่อมดคำตอบ Brain-Flak
ในคำตอบของเขา, ข้าวสาลีช่วยสร้างการชี้ให้เห็นว่าผลรวมของค่าแอสกี 0-9 รวมไป 525 และเนื่องจากมาตรฐาน brainfuck มีเพียงความคิดของ [0255] นี้จะทำให้ค่า 525% 256 = 13 กล่าวคือการลบค่า ASCII ของข้อมูลเข้าจาก 13 เครือข่ายทำให้คุณมีตัวเลขที่หายไป
เวอร์ชันแรกของโปรแกรมนี้คือ:
1. ใส่ 13 ในเซลล์แรก
2. นำข้อมูลเข้าสู่เซลล์ที่สอง
3. ลบเซลล์ที่สองออกจากเซลล์แรก
4. ข้ามไปที่ 2 ถ้ามีอินพุตที่เหลือ
5. พิมพ์เซลล์แรก
และนี่คือรหัสสำหรับวิธีง่ายๆ:
+++++++++++++ #Set the first cell to 13
>, #Take inputs into the second cell
[[<->-],] #Subtract the second cell from the first cell and repeat until inputs are over
<. #Print the first cell
ตามที่ระบุไว้ในคำตอบของเขาเนื่องจากเรารู้ว่าอินพุตจะมีความยาวเท่ากับ 9 เราจึงสามารถใช้ค่านั้นเป็นค่าคงที่และกำจัดสตริงยาวของ + ของที่จุดเริ่มต้น
มันไม่สำคัญว่าเราจะเพิ่ม 13 จุด (ขอบคุณคุณสมบัติการสับเปลี่ยน!) ดังนั้นเราจะผสมกับขั้นตอนการลบและการพิมพ์
, #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell
>+<] #Add 1 for each input; totaling 9
>++++ #Add the missing 4 to make 13
. #And print
นี่เป็นคำตอบดั้งเดิมของฉันสำหรับปัญหานี้ แต่เราทำได้ดีกว่า
น่าสนใจพอคำตอบก่อนหน้านี้ใช้ได้แม้ว่าเราจะเริ่มต้นด้วย + แทนที่จะเป็น
+[[->-<],>+<]>++++.
Brainfuck ต้องการบางสิ่งในเซลล์เพื่อเริ่มการวนซ้ำ เราเพิ่มอย่างไร้เดียงสาว่าพิเศษ 4 ในท้ายที่สุดเมื่อมันสามารถไปในสถานที่อื่น
-[[->-<],>+<]>++.
กับบางส่วนโดยเจตนาโดยสิ้นเชิง (อ่าน: การทดลองและข้อผิดพลาด) วงกลอุบายเริ่มปิดโปรแกรมที่มี - นำไปสู่ผลลัพธ์ที่น่าสนใจที่สอง:
1 + 10 + 2 = 13, และเราจบด้วยคำตอบเดิม
เมื่อมองย้อนกลับไปมันอาจเป็นบทความที่มากเกินไปสำหรับโปรแกรม Brainfuck อย่างง่าย
หลังจากคิดเกี่ยวกับการแก้ปัญหานี้อีกเล็กน้อยฉันก็สามารถตัด 2 ไบต์ได้
ฉันต้องการอธิบายบางอย่างเกี่ยวกับขั้นตอนก่อนหน้า:
เครื่องหมายลบเพื่อเข้าสู่ลูปได้อย่างมีประสิทธิภาพเพิ่ม 1 แต่สิ่งที่มันทำจริงคือลบ 255 จากเซลล์ที่สอง (ส่งผลให้ 1)
เห็นได้ชัดในการหวนกลับ แต่การลบ 1 จากเซลล์แรกเหมือนกับการเพิ่ม 1 ไปยังเซลล์ที่สอง (เพราะทุกอย่างในเซลล์แรกจะถูกลบออกจากเซลล์ที่สอง)
-[-[->-<],]>++.
ฉันสามารถลบ "> + <" โดยเพิ่ม "-" ที่จุดเริ่มต้นของลูปแรก มันต้องไปที่นั่นไม่ใช่ที่ "> + <" เพราะโปรแกรมจะวนซ้ำไม่สิ้นสุด
477-Tr@ToCharacterCode@#&
ฟังก์ชันบริสุทธิ์รับสตริงเป็นอินพุตและส่งคืนจำนวนเต็ม Mathematica มีชื่อคำสั่งยาวและไม่เต็มใจที่จะแปลงระหว่างสตริงและจำนวนเต็มซึ่งทำให้ไม่ดีอย่างยิ่งในการท้าทายนี้ สิ่งที่ดีที่สุดที่ฉันสามารถหาได้คืออัลกอริธึมจากคำตอบ Ruby ของ Level River Stซึ่งทำการคำนวณตามผลรวมของรหัส ASCII ของสตริงอินพุต ใน Mathematica สิ่งนี้ใช้ชื่อคำสั่งแบบยาวเพียงชื่อเดียว
<?=trim(32043**2,$argv[1]);
ใช้เคล็ดลับจากคำตอบของ Rodเพื่อสร้างสตริงที่มีตัวเลขทั้งหมดจากนั้นลบตัวเลขทั้งหมดยกเว้นตัวเลขที่หายไป
PHP, 41
for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;
อันนี้ใช้xorเพราะฉันยังไม่เห็นเลย
32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
ฉันพบวิธีทุบตีที่สั้นลงซึ่งใช้วิธีการตรวจสอบที่น่าสนใจ:
sum -s|dc -e524?--P
คำอธิบาย:
sum
คำสั่งพิมพ์การตรวจสอบและนับบล็อก ฉันไม่ทราบรายละเอียดมากมาย แต่การใช้ตัวเลือก-s
(อัลกอริทึม System V) จะทำให้การตรวจสอบเท่ากับผลรวม ASCII ของรหัสอักขระแต่ละตัว ดังนั้นการตรวจสอบจะคงที่เมื่อลำดับของอักขระอินพุตเดียวกันเปลี่ยนไป
รับ867953120
เป็นกรณีทดสอบ (ตัวอย่างล่าสุด) นี่คือวิธีการทำงานของสคริปต์:
sum -s
473 1
เอาท์พุท หากไม่มีจำนวนเต็มหายไปเช็คซัมจะเท่ากับ 525dc -e524?
ผลักดัน 524 แล้วท่อป้อนข้อมูล สแต็กคือ: 1 473 524
. แนวคิดคือการลบเช็คซัมจาก 525 แต่เนื่องจากผลรวมเอาต์พุต 1 เช่นกันฉันต้องทำงานด้วย--P
. หลังจากใช้ทั้งสอง subtractions (524- (473-1)), 52
สแต็คเป็น: ด้วย 'P' ฉันพิมพ์อักขระด้วยรหัส ASCII นั้น: 4
ตัวเลขที่หายไปfunction m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end
ไม่สั้นมากฉันกลัว
Ungolfed:
integer function m(s)
implicit none
character(len=9)::s
character(len=10)::t
integer:: i, j, k
t='0123456789'
do j=1,10
k=0
do i=1,9
if (s(i:i) == t(j:j)) k=1
end do
if (k==0) m=j-1
end do
end function m
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
รวม +1 สำหรับ -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔x
เนื้อหาควรสั้นกว่านี้ (ฉันยังสับสนว่าทำไมถึงẹ
จำเป็น) แต่นี่คือสิ่งที่ดีที่สุดที่ฉันสามารถทำได้
ẹ:Ị↔x
ẹ Split the input into a list of characters
:Ị Pair that list with the string "0123456789"
↔x Remove all elements of the list from the string
x
ẹ
การดำเนินงานเก่าและรถสวยซึ่งเป็นเหตุผลที่คุณต้องการ
¬∋ℕ
ควรทำงานได้เพียง 3 ตัวอักษร - นั่นคือสิ่งที่ฉันพยายามก่อน - แต่มีหลายสาเหตุว่าทำไมมันถึงไม่และฉันไม่คิดว่าจะมีวิธีที่เป็นไปได้ที่จะเปลี่ยน Brachylog
¬∋ℕ
ใน Brachylog เทียบเท่ากับใน Prolog และความหมายของมันคือ "ไม่สามารถพิสูจน์ได้ภายใต้สมมติฐานโลกปิด" มากกว่า "ให้ฉันเลือกคะแนนสำหรับทุกสิ่งที่ไม่ได้ตรวจสอบเรื่องนี้" (ซึ่งมักจะเป็นจำนวนอนันต์ของสิ่งต่าง ๆ )not in
¬
\+
(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))
Ungolfed:
(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))
ชี้แจง:
(reduce '+ s :key 'digit-char-p)
สิ่งนี้จะวนรอบตัวอักษรเป็นตัวs
แปลงเป็นตัวเลขและเพิ่มเข้าไป Digit-char-p สะดวกส่งคืนจำนวนถ่านเป็นค่า "จริง" เพื่อให้สามารถใช้เป็นการทดสอบหรือการแปลง
(- 45 ...)
ลบออกจาก 45 ให้ตัวเลขที่หายไปจากอินพุต
5v&;52/ni?@.>!&oW+
ขยาย
5 v
& ;
5 2 / n i ? @ .
> ! & o W + . .
. .
. .
ใช้วิธีการแบบเดียวกันกับคำตอบที่ไร้สมอง
สร้างค่า -525 บนสแต็กโดยการกด 5, 2, concatenate, push 5, concatenate และ negate
จากนั้นรับอินพุตซ้ำแล้วซ้ำอีกและเพิ่มจนกว่าจะถึงจุดสิ้นสุดของอินพุต
ลบอินพุตสุดท้ายคัดค้าน (ทำให้เป็นบวก) เพิ่มผลลัพธ์ล่าสุดเอาท์พุทอักขระและหยุด
สาเหตุของการทำงานตั้งแต่ -525 ขึ้นไปคือจำนวนอักขระที่ป้อนถูกป้อนสำหรับการวนซ้ำแต่ละอินพุต เนื่องจากค่าเป็นลบจะไม่มีสิ่งใดส่งออกจนกว่าลูปจะออกและค่าลบจะเป็นค่าบวก
<?=45-array_sum(str_split($argv[1]));
A1
การป้อนข้อมูลจะถูกป้อนเข้าไปในเซลล์
รหัส:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
บันทึก 6 ไบต์ขอบคุณ Steve Kass
รหัสก่อนหน้า:
=REGEXEXTRACT("0123456789","[^"&A1&"]")
ผล:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
ยังเป็นวิธีการแก้ปัญหาที่ถูกต้องให้ตรรกะที่คล้ายกัน อัปเดตคำตอบ
ฉันบันทึก 1 ไบต์ด้วยการย้ายโปรแกรมไปที่ 1 บรรทัดและ 1 ไบต์โดยทำคณิตศาสตร์ที่ดีขึ้น
~+;@.%a--7;#
ผลรวมของค่า ASCII มีตั้งแต่ 477 ถึง 468 ขึ้นอยู่กับว่าหมายเลขใดหายไป โดยการลบสิ่งนี้จาก 7 เราจะได้รับช่วง -470 ถึง -461 ด้วยการแก้ไขตัวเลขนี้ด้วย 10 เราจะได้ช่วงที่ 0 - 9 ซึ่งเราสามารถพิมพ์ได้
~+; ;# Sums the ASCII values of all characters to stdIn
~ # The # doesn't skip over the ~ because it's on the end of a line
~ Once EOF is hit, the ~ reverses the IP's direction
;# Jump the ; that was used before
--7 Subtract the sum from 7 (really just 0 - (sum - 7))
%a Mod it by 10
@. Print and exit
เหตุผลที่ฉันใช้ค่า ASCII แทนการป้อนค่าจำนวนเต็มเป็นเพราะ&
คำสั่งใน Try it Online หยุดการทำงานชั่วคราวบน EOF (แม้ว่ามันควรจะกลับ IP) ~
ทำงานอย่างถูกต้องว่า
#v~+
@>'i5*--,
ผลรวมของค่า ASCII ของ 10 หลักทั้งหมดคือ 525 โดยการลบผลรวมของตัวเลขที่กำหนดจาก 525 เราจะได้รับค่า ASCII ของอักขระที่หายไป
#v~+ Sums the ASCII values of all characters on stdIn
Moves to the next line when this is done
>'i5* Pushes 525 (105 * 5)
-- Subtracts the sum from 525
@ , Prints and exits
param($n)0..9|?{$n-notmatch$_}
จะเข้า$n
, สร้างช่วง0..9
(เช่น0, 1, 2 ... 9
) จากนั้นใช้Where-Object
ประโยค (คน|?{...}
) ที่จะดึงออกหมายเลขที่ไม่ -notmatch
regex ที่เหลืออยู่บนไปป์ไลน์เอาท์พุทเป็นนัย
-jkUT
-jkUT
T # 10
U # The unary range of ten: [0,1,..,9]
jk # join that on the empty string
- # set minus
"-jUT" ยังทำงานได้ดี แต่สร้างบรรทัดใหม่สำหรับทุก int