สตริงที่สาม


45

กำหนดสองสายเอาท์พุทสตริงที่สามที่ไม่เท่ากับหนึ่งในสองอินพุต แต่มีความยาวเท่ากัน (เป็นตัวอักษร) เหมือนกับอินพุตใด ๆ มีการรับประกันว่าจะมีเอาต์พุตที่ถูกต้องอย่างน้อยหนึ่งรายการ

กรณีทดสอบ

กรณีทดสอบจะถูกยกมาเพื่อแสดงว่าพวกเขาเป็นสตริง เอาต์พุตเป็นหนึ่งในหลาย ๆ

input, input -> output

"test", "test" -> "tttt"
"do", "don't" -> "dnut_"
"ye s", "yes" -> "fals"
"yes", "yes" -> "noo"
"maybe", "mayue" -> "false"
"false", "false" -> "truee"
"false", "true" -> "fatr"
"1", "" -> "0"
"", "t" -> "s"
"", "abcabc" -> "testst"
"abcdefghijklmnopqrstuvwxyz", "aaaaaaaaaaaaaaaaaaaaaaaaaa" -> "zbcdefghijklmnopqrstuvwxya"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" -> "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

กฎระเบียบ

  • คุณอาจเลือกโดเมนอินพุตของคุณ แต่ต้องประกอบด้วย ASCII ที่พิมพ์ได้อย่างน้อยและโดเมนเอาต์พุตของคุณจะต้องเหมือนกับโดเมนอินพุตของคุณ
  • ความยาวของอินพุตอาจจะเหมือนหรือต่างกัน
  • ผลลัพธ์จะต้องถูกต้องกับความน่าจะเป็น 1 นั่นคือคุณอาจสร้างสตริงสุ่มจนกว่าจะถูกต้อง (และในทางทฤษฎีคุณอาจวนซ้ำไม่ จำกัด ) แต่คุณไม่สามารถส่งออกสตริงสุ่มและหวังว่ามันจะถูกต้อง โปรดทราบว่าสิ่งนี้หมายความว่าคุณไม่จำเป็นต้องกำหนดค่าเอาต์พุต
  • ขึ้นบรรทัดใหม่อัตโนมัติที่อนุญาต แต่ไม่นับรวมกับความยาวของเอาต์พุต
  • เนื่องจากคำถามเกี่ยวกับข้อผิดพลาดของหน่วยความจำนั้นจะต้องทำงานภายใน 60 6วินาทีขึ้นอยู่กับความยาวของการป้อนข้อมูล คำตอบที่เหมาะกับการใช้งานนั้นและในทางทฤษฎีจะใช้กับสตริงที่ยาวกว่านั้นก็โอเค แต่สิ่งที่หน่วยความจำผิดพลาดในคอมพิวเตอร์สมัยใหม่สำหรับความยาวอินพุต4นั้นไม่ถูกต้อง

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


14
ดูเหมือนว่าเป็นหมวดหมู่คำถามใหม่ที่น่าสนใจในเว็บไซต์นี้ซึ่งง่ายสำหรับมนุษย์และยากสำหรับคอมพิวเตอร์ เพราะคอมพิวเตอร์ไม่เก่งเรื่องการคิดที่แตกต่าง! มันทำให้ฉันนึกถึงตอน Spongebob ที่ซึ่งเขาทั้งคืนพยายามเขียนเรียงความเกี่ยวกับสิ่งที่ไม่ควรทำที่ไฟตก
geokavel

2
ฉันเข้าใจว่าโดเมนเอาต์พุตสามารถเป็นส่วนย่อยของโดเมนอินพุตได้ใช่ไหม
Luis Mendo เมื่อ

2
เป็นคำถามที่ดี! ฉันชอบมัน.
isaacg

2
@Quelklef ไม่นั่นไม่ต่างจากทั้งสองอินพุต
Ørjan Johansen

3
ฉันแนะนำ "", "1" ควรเพิ่มเป็นกรณีทดสอบเนื่องจากฉันเพิ่งรู้ว่าคำตอบของฉันล้มเหลวสำหรับเรื่องนี้แม้ว่ามันจะใช้ได้กับทุกกรณีทดสอบที่ให้
loris ช้า

คำตอบ:



14

Haskell, 43 ไบต์

x!y=[s|s<-(<$max x y)<$>"abc",s/=x,s/=y]!!0

รับค่าสตริงสูงสุด (lexicographically ภายหลัง) ซึ่งเรารู้ว่าไม่ว่างเปล่า แทนที่อักขระทั้งหมดด้วยหนึ่งใน "a", "b" และ "c" โดยใช้<$; และส่งกลับค่าแรกที่ไม่ใช่อินพุต ผมคิดว่านี้จะคล้ายกับนีลตอบถ่านและ / หรือgeokavel คำตอบของ

(ฉันแฝงตัวอยู่พักหนึ่ง แต่นี่เป็นครั้งแรกที่ฉันตอบเว็บไซต์นี้; hi!)


9

Brainfuck, 97 ไบต์

+>+[-,[>>,]<<[<<]>]>>[>]<<<[<]>[<+>>[-<+<+>>][>]<[->+<]<[-]>>>++<[<]>[.>>]>[>>]]>[+[>]+[<]>[.>>]]

เรียกใช้รหัสออนไลน์ (โปรดทราบว่าจะต้องเลือก "หน่วยความจำแบบไดนามิก" ที่ด้านล่างขวา)

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

อินพุตถูกใช้เป็นstr1+ \0+ str2โดยที่สตริงเป็นอักขระ 1 ไบต์ที่ไม่ใช่ศูนย์ต่อเนื่องกัน

(first str1 + first str2) or (first str1 + 1) or 2ผลตอบแทน อัลกอริทึมนี้ถูกคิดขึ้นโดยØrjanJohansenที่ยอดเยี่ยม (สมมุติ) โดยยึดตามต้นฉบับดั้งเดิมของฉัน

แสดงความคิดเห็น:

# Let (Kn) be the nth character of K
# Let (^) designate the pointer
# Let F be the first string inputted
# Let S be the second string inputted

+>+[-  # Twice do
,[>>,]  # Input string (characters separated by 1)
<<[<<]>  # Go to left of beginning of string
]>  # End on first character of second string
# If second string is null we will end one too far to the left
>[>]<<<[<]>  # If first string is null we will end there too
# We will use this to do flow control

[  # Only run if both strings were non null

# Tape:    S0 ' F0 ' S1 ' F1 ' S2 ' F2 ' etc
#          ^

<+>>  # Let F0* = F0 (plus) 1  (is 1 as of now; F0 will be added later)
[-<+<+>>] # Let A = S0 (plus) F0
# A may or may not be zero
# F0* may or may not be zero
# Tape:    F0* ' A ' 0  ' S1 ' F1 ' etc
#                ^

[>]<[->+<]  # Let B = A or F0*
# B may or may not be zero
<[-]>>  # Clear F0*
# Tape:     0 ' B ' 0 ' S1 ' F1 ' etc    (if A was zero)
#               ^
# OR        0 ' 0 ' B ' s1 ' F1 ' etc    (if A was nonzero)
#                   ^

# Let C = B or 2
# C will be guaranteed nonzero and unique from S0 and F0
>++<[<]>  # Create C
[.>>]  # Print (using S or F; does not matter)

>[>>]  # End on a zero cells with zero cells all to the right
# This is necessary for the coming functionality
# also as to not loop
]  # End non null block

# Now we consider if one of the strings was null
# Tape:    0 ' E0 ' 0 ' E1 ' etc    (if one string was null)
#          ^
# Tape:    0 '  0 ' 0 '  0 ' etc    (if neither string was null)
#          ^
# Where E is F or S (we don't care)

>[  # Execute only if one string was null

+  # Let A = E0 (plus) 1
# A may or many not be zero
# Tape: 0 ' A ' 0 ' E1 ' etc
#           ^

[>]+[<]>  # Let B = A or 1
# B is guaranteed nonzero and != E0
# Tape: 0 ' B ' ? ' E1 ' 0 ' E2 ' etc
#           ^

[.>>]  # Print

# End on zero cell as not to loop
]  # End null block

"ความเป็นจริง" ของคุณเป็นสิ่งที่ผิดเช่น,a=2 b=1คุณต้องเพิ่มแทนที่จะลบ
Ørjan Johansen

ฉันคิดว่าคุณสามารถแก้ไขปัญหาที่Sว่างเปล่าได้โดยการเพิ่ม>ที่จุดเริ่มต้นและหลังจากนั้นทำ[<]>บนไบต์ซ้ายสุดของS- ถ้านั่นไม่ใช่ศูนย์มันไม่ทำอะไรเลยมิฉะนั้นมันจะเปลี่ยนสาย
Ørjan Johansen

@ bØrjanJohansenโอ้คุณขวาก็สามารถเท่ากับ aแต่ไม่ได้
Quelklef

@ ØrjanJohansenอาที่ดูเหมือนจะทำงาน! ความคิดที่ดี!
Quelklef

@ ØrjanJohansenติดตามความจริง: เนื่องจากเป็น!= aเพียงถ้าฉันพิมพ์S/0, S/1, ...แทนที่จะS/0, F/1, ...ทำงานได้
Quelklef

6

เยลลี่ขนาด 8 ไบต์

żḟ@€ØAZḢ

ลองออนไลน์!

อย่างไร?

żḟ@€ØAZḢ - Link: list of characters, a; list of characters, b
ż        - zip a and b
    ØA   - uppercase alphabet
 ḟ@€     - filter discard for €ach (swap @rguments)
      Z  - transpose the result
       Ḣ - head

มันส่งคืนB TIO
Jonathan Allan

อัลกอริทึมไม่ควรอย่างไรก็ตามไม่แน่ใจว่าสิ่งที่คุณทำ
Jonathan Allan

ไม่เป็นไรสมองของฉันดูเหมือนจะเล่นกลเพราะฉันไม่เห็นสิ่งใดXหรืออยู่ในนั้น ...
Erik the Outgolfer

5

Python 3 , 62 47 57 54 51 ไบต์

แก้ไข: - 5 ไบต์ขอบคุณ@ Mr.Xcoder

แก้ไข: +10 ไบต์เพื่อแก้ไขข้อบกพร่อง

แก้ไข: -3 ไบต์ขอบคุณ@betaveros

แก้ไข: -3 ไบต์โดยใช้ max แทนที่จะเป็น pop

lambda x,y:max({*"abc"}-{x[:1],y[:1]})+max(x,y)[1:]

ลองออนไลน์!


{"a","b","c"}==> {*"abc"}( 57 bytes )
Mr. Xcoder

(x[1:]or y[1:])==> max(x,y)[1:]?
betaveros

หรือเพียงแค่(x or y)[1:]ฉันคิดว่าคุณจะต้องหลีกเลี่ยงสายว่าง
betaveros

บังเอิญมันเป็นความอัปยศงูหลาม 2 ไม่ได้มีชุดตัวอักษรที่ติดดาวเพราะผมอยากจะเล่นกอล์ฟ{*"abc"}เข้า{*`id`}...
betaveros

บันทึก 1 แทน*len(x or y) +max(x,y)[1:]
Chas Brown

4

ถ่าน 22 ไบต์

FEα×ι⌈⟦LθLη⟧¿¬№⟦θη⟧ιPι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด สร้างสตริงอักขระตัวพิมพ์ใหญ่ทั้งหมดซ้ำตามความยาวของอินพุตที่ยาวขึ้นและพิมพ์ทับสตริงทั้งหมดที่ไม่ปรากฏในอินพุต ในคำอื่น ๆ ที่ส่งออกเป็นปกติZZZ...เว้นแต่ว่าเป็นหนึ่งในปัจจัยการผลิตซึ่งในกรณีนี้ก็YYY...เว้นแต่ว่าเป็นอินพุตอื่น ๆ XXX...ซึ่งในกรณีนี้มันเป็น


4

Mathematica, 111 ไบต์

(c=Characters;a=#2;While[f=Alphabet[]~RandomChoice~Length@#;f==#||f==c@a]&[#&@@c@{##}~MaximalBy~Length];""<>f)&


ลองใช้ออนไลน์ (วางโค้ดด้วย ctrl + v วางข้อมูลที่ท้ายและกด Shift + Enter)

อินพุต

[ "ทดสอบ", "ฉัน"]

thanx @ ไม่ต้นไม้สำหรับการตรวจสอบและเล่นกอล์ฟ -21 ไบต์


ฉันจะทดสอบออนไลน์นี้อีกครั้งได้อย่างไร
สตีเฟ่น

เพิ่มลิงก์ + ข้อมูล
J42161217

@Jenny_mathy ดูเหมือนว่าจะล้มเหลวหากสตริงแรกเป็นสตริงที่ว่างเปล่า
Halvard Hummel

2
@HalvardHummel แก้ไขแล้ว!
J42161217

1
@Notatree แก้ไขแล้ว หากคุณคิดว่า "easy golfing" เป็นเหตุผลสำหรับการลงคะแนนดังนั้นคุณสามารถทำได้
J42161217

4

Perl 6 , 38 30 ไบต์

{(1 x.max.comb...*∉$_).tail}

ลองออนไลน์!

codeblock ที่ไม่ระบุชื่อที่รับอินพุตเป็นรายการของสองสตริงและส่งกลับหมายเลขแรกจาก1111...ด้วยจำนวนที่ไม่ว่าง 1s ที่ไม่ได้อยู่ในอินพุต

คำอธิบาย:

{                          }   # Anonymous code block
  1 x.max.comb                 # String multiply 1 by the size of the non-empty string
              ...              # Create a sequence increasing by 1
                 *∉$_          # Until the number is not in the input
 (                   ).tail    # And take the last number

การเพิ่มขึ้นเป็นประเภทใหญ่หรือจะล้นนี้สำหรับสตริงขนาดใหญ่เพียงพอหรือไม่
GammaFunction

1
@GammaFunction ใน Perl 6 ประเภทตัวเลขเริ่มต้นคือ Int ซึ่งมีความแม่นยำไม่สิ้นสุด
Jo King

ดี. ฉันจะปรับตัวให้เข้ากับ Zsh แต่มันlong longน่าเสียดาย
GammaFunction

คุณสามารถเล็ม 6 ไบต์ได้เพียงแค่ทำการแรกของ 00 .. , 111 .. , 22 .. แทนการนับและลำดับ: tio.run/…
Phil H

@PhilH ความคิดที่ดี! ฉันทำให้สั้นลงอีกเล็กน้อยโดยทำตามแนวคิดลำดับ
โจคิง

4

Zsh , 51 47 37 36 ไบต์

-4ไบต์โดยใช้ builtin อาร์เรย์argv, -10ไบต์โดยใช้คำนำหน้าและกำจัดRC_EXPAND_PARAM, -1ไบต์โดย inlining รั้งการขยายตัว

<<<${${${:-{1..3}${^@#?}}:|argv}[1]}

ลองออนไลน์!

ก่อนอื่นนี่เป็นความท้าทายที่ยอดเยี่ยมฉันต้องผ่านแนวคิดมากมายก่อนที่จะลงจอดบนอันนี้

<<<${${${:-{1..3}${^@#?}}:|argv}[1]}
       ${:-             }            # empty fallback
                 ${ @#?}             # remove first character from each parameter
                 ${^@  }             # enable brace expansion (set -P)
           {1..3}${^@#?}             # expand to 1foo 2foo 3foo 1bar 2bar 3bar
     ${                  :|argv}     # Set difference with 'argv'
   ${                           [1]} # The first found element
<<<                                  # print to stdout

@และ*ไม่ใช่ตัวระบุดังนั้น${ :|@}และ${ :|*}ไม่ทำงานดังนั้นการใช้${ :|argv}

วิธีนี้จะทำงานได้ถึง 93 อินพุตและหา 94 ซึ่งเป็นเอกลักษณ์ เพียงแค่เปลี่ยนที่มีช่วงที่เป็นไปได้สูงสุด{1..3}{~..!}

Zsh , 48 47 ไบต์ *

for ((;$#i<${#${1:-$2}}||$@[(I)$i];i++)):
<<<$i

ลองออนไลน์!

วิธีการใหม่ทั้งหมดได้รับความอนุเคราะห์จากการส่ง Perl 6 ของ JoKing แต่ไม่สามารถใช้กับสตริงขนาดใหญ่ (n> 20) เนื่องจากข้อ จำกัด ขนาดจำนวนเต็ม $@[(I)$i]คือการค้นหาอาเรย์ย้อนกลับสู่ดัชนีที่ใหญ่ที่สุดมันจะส่งออกเป็นศูนย์ (เท็จในการขยายเลขคณิต) หากไม่พบ $ i ในพารามิเตอร์บรรทัดคำสั่ง


3

MATLขนาด 12 ไบต์

c"1Y2@X-1)&h

อินพุตเป็นอาร์เรย์เซลล์ของสตริงที่มีตัวอักษร ASCII ที่พิมพ์ได้ เอาท์พุทจะเกิดขึ้นจากตัวอักษร'ABC'และดังนั้นจึงเป็นของโดเมนอินพุต

ลองออนไลน์!

คำอธิบาย

เอาต์พุตมีความยาวเท่ากับสตริงอินพุตที่ยาวที่สุด ใช้nตัวอักษร -th เป็นตัวอักษรตัวแรกจาก'ABC'นั้นจะแตกต่างจากnตัวอักษร -th ของทั้งสองสายการป้อนข้อมูล

c        % Concatenate the two strings vertically. If one is shorter it is
         % right-padded with spaces. Gives a 2-row character matrix
"        % For each column
  1Y2    %   Push the string 'ABC...Z' (the upper-case letters)
  @      %   Push current column
  X-     %   Set difference
  1)     %   Get first character
  &h     %   Horizontally concatenate the results so far
         % End (implicit). Display stack (implicit)

3

Haskell, 56 52 48 ไบต์

x#y|_:t<-max x y=[c:t|c<-"abc",c:t/=x,c:t/=y]!!0

ลองออนไลน์!

เปลี่ยนถ่านแรกของสูงสุดของทั้งสองสายการป้อนข้อมูลด้วยa, bและcและรับคนแรกที่แตกต่างจากทั้งสองสายการป้อนข้อมูล


3

Ruby , 53 ไบต์

->a,b{([?a,?b,?c].map{|e|e*[a,b].max.size}-[a,b])[0]}

ลองออนไลน์!

โดยทั่วไปสร้างสตริงa...a, b...bและc...cและเลือกคนแรกที่ไม่ได้อยู่ในการป้อนข้อมูล


1
ล้มเหลวหากอินพุตแรกคือสตริงว่าง
Silvio Mayolo

แก้ไข @SilvioMayolo แล้ว
Conor O'Brien



3

Pyth, 7 8ไบต์

hC-LG.T

1 ไบต์ขอบคุณ Jakube

ชุดทดสอบ

เราใช้.Tความยาวในการเก็บรักษาทรานสปอนเซอร์มากกว่าCตัดทอนทรานสโพสเพื่อให้สามารถทำงานกับอินพุตที่มีหนึ่งสตริงว่าง

เมื่อกำหนดสองสายเป็น tuple เราจะแปลงพวกมัน ( .T) จากนั้นแมปคู่ของตัวละครหรือตัวละครตัวเดียวโดยการลบตัวอักษรจากตัวอักษรตัวเล็กลงด้วย-LGแล้วแปลงรายการสตริงของตัวละครที่ไม่ได้ใช้Cแล้วกลับมา hสตริงดังกล่าวครั้งแรกด้วย นี่ประกอบด้วยตัวอักษรตัวแรกของตัวอักษรที่ไม่ได้อยู่ในทั้งสองสายสำหรับแต่ละตำแหน่ง




2

Pyth , 23 22 ไบต์

+.)-.{<G3.{,<Q1<KE1t|K

ลองที่นี่!

Pyth , 22 ไบต์

+eS-.{<G3.{,<Q1<KE1t|K

ชุดทดสอบ!


คำอธิบาย

+.)-.{<G3.{,<Q1<KE1t|K  - Full program.
      <G3               - Yields the String "abc"; Alphabet[:3].
    .{                  - Set formed by the above.
         .{,<Q1<KE1     - Set formed by input_1[:1] and input_2[:1]
   -                    - Set subtraction.
 .)                     - Pop the last element.
+                       - Append.
                   t|K  - input_1[1:] or input_2[1:], relying on the result of Logical OR.

2

Perl 5, 82 79 ไบต์

sub{$_=$_[0];$_=$_[1]||$_ if/^(xz*)?$/;s/[^z]/z/||s/./y/;$_ eq$_[1]&&s/./x/;$_}

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

ความพยายามในการผลิตย่อยสตริงคล้ายกับสายแรก แต่ด้วยไม่ใช่ครั้งแรกที่ตัวละครถูกแทนที่ด้วยz zจากนั้นก็จะเกี่ยวข้องกับกรณีมุมโดยการแทนที่ตัวอักษรตัวแรกด้วยyหรือxตามความจำเป็นหากพบว่าหนึ่งในปัจจัยการผลิตในความเป็นจริงลำดับของทุกคนz's


2

Perl 5 , 68 ไบต์

sub{$_="a"x length $_[0]||$_[1];$_++while $_ eq$_[0]||$_ eq$_[1];$_}

คำอธิบาย:

  • เริ่มต้นด้วย (สตริงตัวอักษร "a" ตราบเท่าที่สตริงแรก) หรือสตริงที่สองหากเป็นเท็จเช่นความยาวเป็นศูนย์
  • เพิ่มขึ้นเรื่อย ๆ จนกระทั่งมันแตกต่างจากครั้งแรกและครั้งที่สอง

เริ่มต้นจาก "a" เพื่อหลีกเลี่ยงการเพิ่มไปยังจุดที่ Perl ยาวสตริง; มีเพียงสองสายเพื่อหลีกเลี่ยงการเป็นเหมือนกันมันไม่สามารถล้น

ดำเนินการด้วย:

perl -e '$s = ' -E 'sub{$_="a"x length $_[0]||$_[1];$_++while $_ eq$_[0]||$_ eq$_[1];$_}' -E ';say $s->("z", "true")'

1
ฉันคิดว่าสิ่งนี้จะล้มเหลวหากสตริงแรกว่างเปล่า
Ørjan Johansen

ค่อนข้างถูกต้อง! แก้ไขแล้ว.
เอ็ด

2

C (GCC) ,70 65 73 67 61 ไบต์

ฟังก์ชันต้องใช้สตริงที่จัดเตรียมไว้ให้ไม่แน่นอน (เช่นอาร์เรย์หรือการจัดสรรแบบไดนามิก)

f(a,b)char*a,*b;{a=*a?a:b;*a=*a>70?33:99;*a+=*a==*b;puts(a);}

ลองออนไลน์!

ใช้งานได้กับช่วง ASCII มาตรฐาน

คำอธิบาย:

a=*a?a:b           // If a is empty, point to b instead
*a=*a>70?33:99     // Choose a different value for the 1st character of a,
                   // while giving enough space to increment it without 
                   // going back to its previous value
*a+=*a==*b         // Increment the 1st character of a if the arbitrary
                   // chosen value is equal to the value of the 1st 
                   // character of b
puts(a)            // Outputs a

1
ฉันไม่แน่ใจว่าสิ่งนี้จะได้รับโดเมนอินพุตที่สอดคล้องกับกฎ เกิดอะไรขึ้นถ้า*a==255และ*b==0?
Ørjan Johansen

คุณถูก. แก้ไขที่ราคา 8 ไบต์
กอตติเนต์

ที่นั่น ฉันไม่สามารถให้โซลูชันนี้มีจำนวนไบต์เดียวกันกับ Java ได้! :-)
กอตติเนต์

หากคุณไม่ จำกัด การพิมพ์ ASCII คุณสามารถใช้ตัวเลขหลักเดียว
Ørjan Johansen

เว้นแต่ฉันจะเข้าใจผิดว่าจะขัดกับกฎการท้าทายนี้
กอตติเนต์

2

R, 89 67 ไบต์

@Giuseppe บันทึก 9 ไบต์, @ user2390246 บันทึก 13 ไบต์

ฟังก์ชัน

function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)

การสาธิต

# define function
f <- function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)

# test cases
f("test","test")
[1] "aest"
f("do","don't")
[1] "ao"
f("ye s","yes")
[1] "ae s"
f("maybe","mayue")
[1] "aaybe"
f("false","false")
[1] "aalse"
f("false","true")
[1] "aalse"
f("1","")
[1] "a"
f("art","bug")
[1] "crt"

1
คุณสามารถวางxและyภายในsubstrคำสั่งเดียวกัน นอกจากนี้วงเล็บปีกกาและreturnไม่จำเป็น:function(x,y)sub("^.",letters[!letters%in%substr(c(x,y),1,1)][1],x)
2390246

1
คุณสามารถกำจัดreturnเพราะนี่คือฟังก์ชั่นและวงเล็บปีกกาเพราะมันเป็นหนึ่งซับ
Giuseppe

ยิงฉันเพิ่งรู้ว่าf("","1")อัตราผลตอบแทน""ซึ่งเท่ากับอินพุทแรก ... บางทีนี่ควรจะเพิ่มเป็นกรณีทดสอบอื่น
loris ช้า

2

Java 8, 119 ไบต์

แลมบ์ดา (แกงกะหรี่) จากStringการแลมบ์ดาจากไปString มอบหมายให้StringFunction<String, Function<String, String>>

s->t->{String r=s.length()>t.length()?s:t;while((s+t).contains(r))r=r.substring(1)+(char)(Math.random()*128);return r;}

ลองใช้ออนไลน์

แลมบ์ดา

s ->
    t -> {
        String r = s.length() > t.length() ? s : t;
        while ((s + t).contains(r))
            r = r.substring(1) + (char) (Math.random() * 128);
        return r;
    }

วิธีการแก้ปัญหานี้จะหมุนตัวอักษร ASCII แบบสุ่มเป็นสตริงที่ยาวขึ้นจนกว่าเงื่อนไขที่ต้องการ อินพุตเป็น UTF-8 และเอาต์พุตเป็น ASCII

ฉันไม่ทราบรายละเอียดของ Unicode แต่ดูเหมือนว่าเป็นไปได้สำหรับฉันที่โซลูชันนี้อาจล้มเหลวเมื่อผนวกcharเข้ากับจุดโค้ดก่อนหน้าเพื่อสร้างหน่วยรหัสเดียว หากใครที่รู้เพิ่มเติมเกี่ยวกับสิ่งนี้สามารถยืนยันสิ่งนี้ได้ฉันจะเปลี่ยนโดเมนอินพุตเป็น ASCII

Java 8, 126 ไบต์

ประเภทเดียวกันข้างต้น

s->t->{String r;for(byte[]o=(s.length()>t.length()?s:t).getBytes();(s+t).contains(r=new String(o));o[0]%=128)o[0]++;return r;}

ลองใช้ออนไลน์

แลมบ์ดา

s ->
    t -> {
        String r;
        for (
            byte[] o = (s.length() > t.length() ? s : t).getBytes();
            (s + t).contains(r = new String(o));
            o[0] %= 128
        )
            o[0]++;
        return r;
    }

นี่เป็นการเพิ่มไบต์แรกของสตริงที่ยาวขึ้นซึ่งจะตัดภายใน ASCII จนกระทั่งตรงตามเงื่อนไขที่ต้องการ อินพุตและเอาต์พุตเป็นสตริง ASCII


1
ด้วยผลลัพธ์ของกรณีทดสอบที่สามของคุณมันจะส่งผลให้มีความยาวสาม: ลองออนไลน์!
สตีเฟน

อึ ตอนนี้ฉันจะต้องเรียนรู้ว่า Unicode ทำงานอย่างไรเพื่อแก้ไขปัญหานี้โดยไม่ต้องนับจำนวนไบต์ ...
Jakob


2

Bash, 115 .. 77 ไบต์

แทนที่อักขระตัวแรกของสตริงอินพุตแรก (ไม่ว่าง) ด้วย 1,2,3 จนกระทั่งไม่พบคู่ที่ตรงกันสำหรับอินพุตใด ๆ ลองออนไลน์!

-9, -12, -9, -8 bytes ทั้งหมดต้องขอบคุณGammaFunction

x="${1:-$2}"
for s in {1..3}"${x:1}"
{ [[ $s = @($1|$2) ]]||break;}
echo "$s"

(ค่อนข้างจะปรับปรุงมากกว่าเดิม ... )


1
เป็นวิธีที่ดี! คุณสามารถใช้=และ||ในบรรทัดสุดท้ายและใช้${x:-empty_fallback}ในการลบ ternary เริ่มต้น นอกจากนี้คุณต้องมีเครื่องหมายอัญประกาศที่ลงท้ายด้วย echo สำหรับกรณีของช่องว่างต่อท้าย ภาระหน้าที่ TIO
GammaFunction


1
ผมชอบสิ่งที่คุณกำลังจะไปด้วยshift, ฉันได้มันจะผูกวิธีของฉันในสองวิธีที่แตกต่างกัน
GammaFunction




1

Japt , 17 ไบต์

;B¬£ñl g1 çXÃkU v

ทำซ้ำตัวอักษรA-Zตามความยาวของอินพุตที่ยาวขึ้นลบค่าในอินพุตและรับไอเท็มแรกในอาร์เรย์

ลองออนไลน์!

โซลูชันเก่า 18 ไบต์

;@!UøX}a@ñl g1 çBö

ลองออนไลน์!

เลือกอักขระสุ่มจากตัวอักษรและทำซ้ำตามความยาวของสตริงอินพุตที่ยาวกว่าจนกว่าจะไม่มีอยู่ในอินพุต


["abcdefghijklmnopqrstuvwxyz", "AAAAAAAAAAAAAAAAAAAAAAAAAA"]ล้มเหลวสำหรับ เมื่อใช้งานหลาย ๆ ครั้งมันจะกลับมา"AAAAAAAAAAAAAAAAAAAAAAAAAA"(เช่นเดียวกับคำตอบ Pyth ของฉันจนกระทั่งฉันได้แก้ไข)
Mr. Xcoder

มันล้มเหลวในการ ["D", ""] หากคุณรันหลาย ๆ ครั้งคุณจะได้รับ "D"
J42161217

ขอบคุณฉันคิดว่ามีบางกรณีที่ฉันไม่ได้ทดสอบ แก้ไขเพียง +1 ไบต์
Justin Mariner

Ìควรจะทำงานในสถานที่ของg1 การประหยัด 2 ไบต์ (ในอาร์เรย์ 2 องค์ประกอบg1= gJ) แต่ดูเหมือนว่าจะมีข้อผิดพลาดกับเมื่อใช้Ì ;
Shaggy

@Shaggy ใช่ผมคิดว่าสาเหตุของJไม่มีอีกต่อไป-1เพราะการเปลี่ยนไป; ,นั่นเป็นเหตุผลที่ฉันใช้1ในตอนแรก
Justin Mariner

1

Python 3, 74 73 ไบต์

-1 ไบต์ต้องขอบคุณ Step Hen

def f(x,y,i=1):
 while i*10<10**len(x or y)or str(i)in x+y:i*=2
 print(i)

พิมพ์จำนวนเต็มต่ำสุดที่มีความยาวเท่ากันกับอินพุตแรกที่มีความยาวไม่ใช่ศูนย์


บันทึกไบต์ที่มีเป็นพารามิเตอร์ฟังก์ชั่นเริ่มต้น:i def f(x,y,i=1):ฉันคิดว่าคุณสามารถบันทึกไบต์อื่นด้วยwhile10*iแต่ฉันไม่แน่ใจ
สตีเฟ่น

คุณสามารถแทนที่ while i*10<10**len(x or y)or str(i)in x+yด้วยwhile i<10**~-len(x or y)or str(i)in x+y ( 72 bytes )
Mr. Xcoder

และคุณยังสามารถใช้การเรียกซ้ำเพื่อบันทึกไบต์: f=lambda x,y,i=1:(i<10**~-len(x or y)or str(i)in x+y)and f(x,y,i*2)or i( 71 ไบต์ )
Mr. Xcoder

1

Python 2, 77 ไบต์

a=input()
b=ord(a[0][0])+1
if b==ord(a[1][0]):b+=1
print unichr(b)+a[0][1:-1]

ฉันคิดว่ามันมีศักยภาพ แนวคิดคือเพิ่มถ่าน 1 ถึง 1 ในสตริงที่ 1 จากนั้นตรวจสอบว่าถ่านที่ 1 ของอินพุตอื่นเหมือนกันหรือไม่

** หมายเหตุ ^ ไม่ได้จัดการกับสตริงความยาว 0 ดังนั้นมันจึงใช้งานไม่ได้กับความยาวนี้

นี่คือวิธีแก้ปัญหาที่ยาวเป็นพิเศษซึ่งทำงานได้กับความยาว 0

146 ไบต์

a=input()
def c(i):print unichr(ord(a[i][0])+1)+a[i][1:];exit();
for x in range(2):if len(a[x-1])<1:c(x)
if a[0]==a[1]:c(1)
print a[1][0]+a[0][1:]

การปรับปรุงใด ๆ ที่จะได้รับการชื่นชม!


1

CJam, 31 30 23 ไบต์

q~:A:e>,3,sf*{A\f=:+!}=

ใช้ ASCII ที่พิมพ์ได้เป็นอินพุต เอาต์พุตทั้งสตริงของ 0, 1 หรือ 2 ของที่มีความยาวเท่ากับหนึ่งในสตริงอินพุต เหตุผลก็คือว่าหนึ่งในนั้นไม่สามารถเป็นหนึ่งในสายการป้อนข้อมูล!

ลองออนไลน์

q~:A    e# Store input array as var 'A'
:e>,    e# Take the length of the lexicographically greater string in the input array
3,s     e# Generate "012"
f*      e# Repeat each number as many times as the longer string length, yielding something like ["000","111","222"]
{       e# Search array of number strings for first that returns true for this function
A\f=    e# Map each string in the input array to whether it equals the current number string (0,1)
:+!     e# Add up the array of bits and take the logical not. This returns true iff both array values were not equal to the current number string.
}=      e# Return the first number string that returns true.

ใครมีแนวคิดใด ๆ ในการคืนค่าจริงถ้าบิตทั้งสองในอาร์เรย์เป็นเท็จ (NOR) หรือไม่ :+!ปัจจุบันที่ฉันทำ
geokavel

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