ลบตัวเลขโดยรักษาจำนวนที่มากกว่า


22

บทนำ

ความท้าทายนี้ประกอบด้วยในการหาจำนวนมากที่สุดเอาYตัวเลขจากจำนวนเดิมnซึ่งมีxตัวเลข

สมมติว่าy=2 n=5263 x=4ตัวเลขที่เป็นไปได้ที่จะลบy = 2หลักคือ:

[52, 56, 53, 26, 23, 63]

ดังนั้นจำนวนมากที่สุดคือ63ซึ่งจะต้องเป็นผลลัพธ์สำหรับตัวอย่างนี้


ตรรกะอีกจะเป็น: สำหรับแต่ละปีค้นหาจากซ้ายไปขวาบาทซึ่งที่ถูกต้องต่อไปคือหลักมากขึ้นแล้วเอามันอย่างอื่นเมื่อไม่มีการแข่งขันเอา Y

ใช้y=3 n=76751432 x=8เพื่ออธิบาย:

y=3
76751432
-^------ remove 6 because right next 7 is greater

y=2
7751432
---^--- remove 1 because right next 4 is greater

y=1
775432
-----^ the search failed, then remove last y digits

result = 77543

ทั้งสองวิธีที่อธิบายข้างต้นใช้งานได้แน่นอนคุณสามารถใช้วิธีอื่นได้ด้วย :)

ท้าทาย

จำนวนnจะไม่มีตัวเลขมากกว่า 8 หลักและyจะมากกว่าศูนย์และต่ำกว่าxเสมอ

เพื่อหลีกเลี่ยงรูปแบบการป้อนข้อมูลที่เข้มงวดคุณสามารถใช้ค่า: y n xวิธีที่คุณต้องการ: เป็นพารามิเตอร์ในฟังก์ชั่นการป้อนข้อมูลดิบหรือวิธีการที่ถูกต้องอื่น ๆ อย่าลืมบอกว่าคุณทำอย่างนั้นในคำตอบของคุณ

ผลลัพธ์ควรเป็นหมายเลขผลลัพธ์

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างอินพุตและเอาต์พุต

อีกครั้ง: คุณไม่จำเป็นต้องเข้มงวดมากเกินไป :)

4 1789823 7 -> 983
1 54132 5   -> 5432
3 69314 5   -> 94
2 51794 5   -> 794

แก้ไข

ฉันเปลี่ยนลำดับอินพุตเพื่อสะท้อนถึงความจริงที่ว่าบางท่านอาจไม่ต้องการค่าxเพื่อแก้ปัญหา xตอนนี้เป็นค่าเผื่อเลือก


2
โปรดให้การป้อนข้อมูลทั่วไปมากขึ้นและการส่งออกที่กำหนดรูปแบบสตริงเฉพาะมักจะเป็นความคิดที่ดี
xnor

1
@ LuisMendo ฉันไม่รังเกียจที่จะแก้ไข I / O ในของฉัน ¯ \ _ (ツ) _ / ¯
อเล็กซ์ A.

4
-1 เนื่องจากข้อกำหนด I / O ที่เข้มงวด +1 สำหรับความท้าทายที่น่าสนใจ โดยรวมแล้ว Sidecote แข็ง
Mego

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

1
@ ทำให้จริงแล้วฉันคิดว่าขึ้นอยู่กับวิธีการที่คุณทำเพราะการxป้อนข้อมูลสามารถทำให้รหัสสั้นลงได้ (ตรงประเด็น: จูเลียคำตอบของฉัน)
อเล็กซ์ A.

คำตอบ:


3

A-Ray , 9 7 ไบต์

ภาษาใหม่ของฉัน! ตาม meta นี้ได้รับอนุญาต แต่ถ้าไม่ได้รับการยอมรับฉันจะลบออก

pM:i-II

คำอธิบาย:

  :i-II       Gets all permutations possible for the given number converted to an array,
                      with the length of y-x, which is the -II part
 M            Gets the maximum of the result above
p             Prints the resulting array above, with no separators

ตัวอย่างอินพุต (ตัวเลข, x, y):

1736413 7 4

เอาท์พุท:

764

คุณสามารถทดสอบสิ่งนี้ด้วยไฟล์. jar ที่ระบุในลิงก์ github


4

MATL 10 ไบต์

-jowXncUX>

สิ่งนี้ใช้เวอร์ชั่น (9.2.1)ของภาษา / คอมไพเลอร์ซึ่งเร็วกว่าความท้าทายนี้

ใช้เวลาสามอินพุตจาก stdin ตามลำดับนี้: ความยาวสตริง, จำนวนอักขระที่ถูกลบ, สตริง

ตัวอย่าง

>> matl
 > -jowXncUX>
 > 
> 7
> 4
> 1789823
983

แก้ไข : ลองออนไลน์! (รหัสในลิงค์XNแทนที่จะเป็นXnไปตามการเปลี่ยนแปลงในภาษาหลังจากความท้าทายนี้ยังoไม่จำเป็นอีกต่อไป)

คำอธิบาย

(ยังคงมีราคา 2 ไบต์มากกว่าที่ควรเนื่องจากnchoosekฟังก์ชั่นของ Octave และ Matlab แตกต่างกันแก้ไขในรุ่นต่อไปของคอมไพเลอร์)

-        % implicitly input two numbers, and subtract them
jo       % input string, and convert to ASCII codes
wXn      % swap inputs. Generate all combinations, each in a row
c        % convert to char array
U        % convert each row to a number
X>       % get maximum. Implicitly display

คำตอบสำหรับความท้าทายดั้งเดิม (ข้อกำหนดการป้อนข้อมูลที่เข้มงวด): 16 ไบต์

jYbZ)b-wowXncUX>

ใช้เวอร์ชันปัจจุบัน (9.2.1)ของภาษา / คอมไพเลอร์

ตัวอย่าง

>> matl jYbZ)b-wowXncUX>
> 4 1789823 7
983

คำอธิบาย

(ควรน้อยกว่า 4 ไบต์ แต่ฉันต้องการwow...cเพราะnchoosekฟังก์ชั่นของ Octave ซึ่งแตกต่างจาก Matlab ไม่สามารถใช้งานได้กับตัวอักขระอินพุตจะได้รับการแก้ไขสำหรับคอมไพเลอร์รุ่นถัดไป)

j              % input string
YbZ)           % split at spaces into strings
b-             % subtract first and third (1-digit) strings
wow            % convert middle string into ASCII codes
Xn             % get all combinations, each in a row
c              % convert to char array
U              % convert each row to a number
X>             % get maximum. Implicitly display

3
wowรหัสของคุณประหลาดใจในช่วงเวลาสั้น ๆ ของมันเอง)
ETHproductions

3
@ETHproductions ฮ่าฮ่า ด้วยความต้องการอินพุตใหม่มันหายไป 6 ไบต์และได้รับ ... พูด
Luis Mendo

3

Pyth - 11 9 8 ไบต์

eS.cz-QE

Test Suite


สนามกอล์ฟที่ดี แต่ไม่ได้เป็นไปตามรูปแบบอินพุตหรือไม่
ลุย

@ ลุยโอ้ไม่เห็นว่ามันเข้มงวดขนาดนั้น
Maltysen

ยุติธรรมพอดูเหมือนว่ามีการอภิปรายบางอย่างเกี่ยวกับความคิดเห็นในคำถาม แต่มันไม่ได้รับการแก้ไข
Lui

@L คงที่แล้ว ฟิลเลอร์พื้นที่
Maltysen

ดูดีขึ้น แต่ฉันคิดว่าอินพุตยังมี x อยู่บนบรรทัดเดียวกันโดยที่ x คือจำนวนหลักในจำนวนเต็มหลัก? 2 5263 4เช่น:
Lui

1

Japt, 19 ไบต์

Vs ¬àW-U m¬mn n!- g

ลองออนไลน์!

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

        // Implicit: U = y, V = n, W = x
Vs ¬    // Convert V into a string, then split into an array of chars.
àW-U    // Generate all combinations of length W-U.
m¬mn    // Join each pair back into a string, then convert each string to a number.
n!-     // Sort by backwards subtraction (b-a instead of a-b; highest move to the front).
g       // Get the first item in this list.
        // Implicit: output last expression

1

Brachylogขนาด 30 ไบต์

,{,[N:Y].hs?lL,Nl-Y=L}?:1forh.

ตั้งแต่ OP ได้ผ่อนคลายข้อ จำกัด ใน IO คาดว่านี้[Number, NumberOfDigitsRemoved]เป็น input brachylog_main([1789823,4], Z).และส่งกลับคำตอบที่เป็นผลผลิตเช่น

คำอธิบาย

,{                   }?:1f     § Declare sub-predicate 1 and find all inputs which satisfy
                               § this sub-predicate with output = Input of the main predicate
                               § (i.e. [Number, Number of digits to remove])

                               § -- Sub-predicate 1 --
  ,[N:Y].                      § Output = [N, Y]
         hs?                   § Input = a subset of N
            lL,Nl-Y=L          § Length of Input = Length of N - Y

                          orh. § Order the list of answers, reverse it an return the first
                               § element (i.e. the biggest number of the list)

1

Python 3, 69 ไบต์

นี่เป็นการกำหนดฟังก์ชั่นนิรนามซึ่งยอมรับทั้งสามข้อโต้แย้ง ใช้ประโยชน์อย่างเต็มที่จากกฎว่า "คุณสามารถใช้ค่า: y n xวิธีที่คุณชอบ" ฉันเลือกที่จะยอมรับyและxเป็นจำนวนเต็มและnเป็นสตริง ค่าส่งคืนเป็นสตริง

from itertools import*
lambda y,n,x:''.join(max(combinations(n,x-y)))

ในกรณีที่ทุกคนรู้สึกว่านี่เป็นการขยายกฏมากเกินไปรุ่นนี้ใช้อินพุตทั้งหมดเป็นจำนวนเต็มและเป็น 74 ไบต์

from itertools import*
lambda y,n,x:''.join(max(combinations(str(n),x-y)))

และเพียงเพื่อลูกผมยังเขียนรุ่นสองโต้แย้งการyและจากบรรทัดคำสั่งและการพิมพ์ผลให้n STDOUTขนาด 92 ไบต์

import sys,itertools as i
_,y,n=sys.argv
print(*max(i.combinations(n,len(n)-int(y))),sep='')

1

ES6, 70 ไบต์

r=(y,n)=>y?r(y-1,Math.max(...`${n}`.replace(/./g," $`$'").split` `)):n

ส่งคืนผลลัพธ์ตัวเลขยกเว้นว่าyเป็นเท็จและnเป็นสตริง ฉันเชื่อว่าการเรียกซ้ำเป็นวิธีที่ไม่ถูกต้องยังคงใช้ได้ (โซลูชันของฉันไม่สามารถใช้ได้กับการเรียกซ้ำที่ถูกต้อง)

กอล์ฟรหัสแรกของฉันที่ฉันใช้เครื่องหมายคำพูดทั้งสาม (แม้ว่าจะไม่ใช่ทั้งหมดเป็นเครื่องหมายคำพูด) ซึ่งทำให้ฉันไม่สามารถคำนวณความยาวได้


1

จูเลีย, 128 95 ไบต์

f(y,n,x)=maximum(i->parse(join(i)),filter(k->endof(k)==x-y,reduce(vcat,partitions(["$n"...]))))

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

Ungolfed:

function f{T<:Integer}(y::T, n::T, x::T)
    # Get all ordered partitions of the digits of n
    p = reduce(vcat, partitions(["$n"...]))

    # Filter to groups of size x-y
    g = filter(k -> endof(k) == x - y, p)

    # Get the maximum resulting number
    return maximum(i -> parse(join(i)), g)
end

1

Haskell, 64 ไบต์

import Data.List
y#x=maximum.filter((==x-y).length).subsequences

ตัวอย่างการใช้งาน: ->(4#7)"1789823""983"

หมายเลขเดิมnใช้เป็นสตริง (ไม่แน่ใจว่าฉันทำตามกฎ "ไม่มีรูปแบบอินพุตเข้มงวด" หรือไม่ แต่จำเป็นต้องป้อนสตริง (!) ในเวอร์ชันแรก)

มันทำงานอย่างไร: ทำรายการขององค์ประกอบทั้งหมดของn, รักษาผู้ที่มีความยาวx-yและเลือกสูงสุด


1

Ruby, 40 ไบต์

->y,n,x{n.chars.combination(x-y).max*''}

นี่คือฟังก์ชั่นไม่ระบุชื่อที่ใช้yและxเป็นจำนวนเต็มและnเป็นสตริงและส่งกลับสตริง คุณอาจเรียกว่าเป็นเช่นนี้

->y,n,x{n.chars.combination(x-y).max*''}[2,"5263",4]

"63"และมันก็จะกลับมา




0

JavaScript (ES6), 78

ฟังก์ชันเรียกซ้ำที่มี 2 อาร์กิวเมนต์ y และ d yสามารถเป็นตัวเลขหรือสตริงได้dต้องเป็นสตริง

r=(y,d)=>y?Math.max(...[...d].map((x,i)=>r(y-1,d.slice(0,i)+d.slice(i+1)))):+d

ก่อนที่ความท้าทายจะเปลี่ยนเป็น 107 - ... กับสิ่งแปลกประหลาดอินพุต / เอาท์พุตทั้งหมด ...

x=>(r=(n,d)=>n?Math.max(...[...d].map((x,i)=> r(n-1,d.slice(0,i)+d.slice(i+1)))):+d)(...x.match(/\d+/g))+'\n'

ทดสอบ

r=(y,d)=>y?Math.max(...[...d].map((x,i)=>r(y-1,d.slice(0,i)+d.slice(i+1)))):+d

function test() {
  [a,b]=I.value.match(/\d+/g)
  O.textContent=r(a,b)
}

test()
y,n: <input id=I value='4 1789823' oninput="test()">
<pre id=O></pre>


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