01/10/2018, 14:20

Bài toán đố, Mong mn góp ý hướng đi

Kiểm tra trong chuỗi có k ký tự kề nhau mà như nhau không? Thực hiện phép loại bỏ ký tự kề nhau mà như nhau chỉ giữ lại một.(Lưu ý không được sử dụng vòng lặp while, for,… và cũng không được sử dụng đệ quy).
Cảm ơn ạ!

HK boy viết 16:35 ngày 01/10/2018

Không dùng for thì sao duyệt được từng kí tự đây?

Quang Minh viết 16:33 ngày 01/10/2018

Bài này ko dùng for while chắc dùng goto với if hả :))

Hung viết 16:25 ngày 01/10/2018

Mã giả - Scala-like style (Apache Spark) - chưa test

val message = "hhhaaaahhhooohhhhiii"
val context = SparkContext()

val charsCount = context.readFromString(message)
  .reduceBy(_) // .groupBy(char => char).reduce(0, char => (char, char.length))
  .map { case (word, _) => word }
  .collect()
  .join("")
Zhang Jike viết 16:34 ngày 01/10/2018

Bày này bạn cắt từng phần tử cho vào stack. Kiểm tra phần tử cho vào so với top có giống nhau không. Nhưng k dùng lặp thì lấy kiểu chi :))

Lộc Lê viết 16:32 ngày 01/10/2018

ùm bài này mình nghĩ chi có cách nào đó mà mình phải tự lên mạng tìm hiểu thôi chứ không có trong trường

Hung viết 16:22 ngày 01/10/2018

Có 3 cách để duyệt hoặc tính toán phần tử:

  • Loop statement
  • Recursive function
  • Monad, dễ hiểu hơn là high-order function

Cách mình viết là theo Monad

Lộc Lê viết 16:25 ngày 01/10/2018

Monad cái này minh mới nghe luôn có youtuber nào dạy cái này k bạn

Lộc Lê viết 16:27 ngày 01/10/2018

hôm bữa cũng có tìm hiểu, thì tìm dc regex mà k biết dùng sao

Zhang Jike viết 16:33 ngày 01/10/2018

Map với reduce thực chất là loop rồi

Hung viết 16:30 ngày 01/10/2018

MapReduce có thể hiện thực bằng loop hoặc recursive, cũng có thể viết cho eager collection hoặc lazy collection, có thể deal với finite collection hoặc infinte collection, có thể parallelization hoặc sequence. Tuỳ ngôn ngữ mà có hiện thực Monad khác nhau.

Monad trong Spark xử lý dữ liệu trên hệ thống phân tán, lazy cho transformation (map) và eager cho agregration (reduce). Nhưng lại cung cấp interface giống như sequential collection thông thường.

Zhang Jike viết 16:24 ngày 01/10/2018

Nhưng mà bài này không được dùng loop hay recursion

Hung viết 16:21 ngày 01/10/2018

Loop khi làm với sequential collection. Khi thực hiện song song thì đã không phải là loop nữa rồi.

Tương tự: Có thể Recursion hiện thực bằng Loop bằng kĩ thuật tail-recursion. Nhưng Loop cũng có thể hiện thực bằng Recursion thông qua Iteration hoặc Generation.

明玉 viết 16:29 ngày 01/10/2018

Nhiều ý tưởng trong này khá thú vị : https://www.quora.com/How-can-I-print-1-to-100-in-C++-without-a-loop-goto-or-recursion
Nhưng ngay cả khi logic do mình viết không có loop hoặc recursion, thì cũng chưa chắc framework không sử dụng loop hoặc recursion.
Nếu bạn dùng C++17 thì có thể thử fold expression, code nó sinh ra không hề dùng loop hay recursion gì, nhưng nguyên liệu cung cấp cho fold expression không nhập từ bên ngoài đc.

Zhang Jike viết 16:30 ngày 01/10/2018

Mình không dùng loop nhưng built-in function của standard library chưa chắc không dùng loop/recursion. Việc nó thực hiện song song cũng chưa chắc là nó k dùng loop/recur vì nó lazy. Nếu muốn mọi thứ đơn giản thì chỉ cần

let input = "aaaaasssssddddd"
let output = input.replace(/[^\w\s]|(.)(?=\1)/gi, "")
console.log(output) // 'asd'

Cần gì monad hay stream làm chi. Để hiểu được monad là gì cũng đâu đơn giản

Hung viết 16:31 ngày 01/10/2018

RE hay các Declarative Language đều có 2 bước, chuyển sang high-order function (optimize, reorder lại nếu có), từ high-order function sang code thực. Hoặc có thể gộp 2 bước làm 1.

Loop, Recursion, Generation, Monad thực chất đều dịch trực tiếp bởi Compiler. Không thằng nào implement thằng nào cả.

Bạn thì cứ cho rằng Monad phải làm bằng loop, nên mình mới đưa ví dụ loop làm bằng recursion. Có thể thiết kế Compiler bằng recursion, còn Loop, Generation, Monad đều viết trên recursion hết. Nhưng chẳng ai làm vì nó chậm tốc độ.

Zhang Jike viết 16:28 ngày 01/10/2018

Mình chưa bao giờ khẳng định Monad phải làm bằng loop. Loop và recursion là thực chất rất tương đồng nhau rồi. Còn ý mình nói ở đây là với một bài toán với đề bài như trên không được dùng loop và recursion. Thì bạn dùng những thứ như map reduceBy (monad way?? ) làm gì? Bạn có thể khẳng định là trong source của Scala hàm mapreduceBy không perform loop hay recursion trong đó không? Mình code elixir và có đọc source của erlang. Thì những thứ như map flatMap … đều perform đệ quy hết. Việc sử dụng recursion ở một FP như haskell, erlang, scala là hết sức bình thường chắc bạn cũng hiểu. Nên những gì bạn implement không hợp với đề bài của chủ thớt. Mà bạn hiểu monad là gì không thế.

github.com

blackberry/Erlang-OTP/blob/master/lib/stdlib/src/lists.erl

%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1996-2011. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
-module(lists).

This file has been truncated. show original

Đào An viết 16:20 ngày 01/10/2018

Rất dị ứng với kiểu đề ko được sử dụng … , muốn đố bài khó thiếu gì cách

Hung viết 16:27 ngày 01/10/2018

Có lẽ mình hơi quá đà, xin lỗi bạn nha.

Mình đồng ý mình sai ở chỗ MapReduce không implement trên Recursion, chính xác là tail call recursion. Viết recursion dễ đọc hơn là viết theo dạng vòng lặp.
Nếu đúng bằng Recursion thường rất dễ xảy ra tràn Stack. Cơ chế cấp phát thu hồi cho block trên stack của loop giống như cấp phát và thu hồi function của tail-recursion. Nên 2 thằng này không giống nhau.

Monad có thể mình lạm dụng quá đà, chỉ áp dụng với box là immutable collection. Còn các hàm reduceByKey() là mở rộng thêm cho các higher-order function cơ bản. Giống như Regular Expression vậy, RE nguyên thuỷ không có cú pháp \w{m,n} gì đâu.

Về khẳng định phải làm, thì mình quote lại câu của bạn.

Map với reduce thực chất là loop rồi

Lộc Lê viết 16:31 ngày 01/10/2018

Dạ em mới học nên đọc mấy cmt của mấy anh không hiểu gì cả

HK boy viết 16:28 ngày 01/10/2018

Thấy bạn đề tag C++ mà mình thấy ngại. Regex trong C++ vẫn phải xử lí với while nên mình xài Python cho tiết kiệm calo.

import re

s = input()
k = input()
# xem xâu s có k kí tự liên tiếp hay không
# Demo regex: https://regex101.com/r/fuyA4s/4
print(re.findall("((?P<ch>[a-z])(?P=ch){"+k+"})", s) != list())

# xâu s mới
# Demo regex: https://regex101.com/r/fuyA4s/1
new_s = ''.join(re.findall("(?P<ch>[a-z])(?P=ch)*", s))
print(new_s)

Run online:

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

Bài liên quan
0